2016-04-16 7 views
0

ネストされた形式で結果を返すgremlinクエリをどのように持つことができますか?次のように仮定特性グラフである。このようなUSER頂点のAGEなどのいくつかの特性を有するTitan dbのネストされたトラバーサルgremlinクエリ

USERPAGE頂点を、

FOLLOWエッジがUSERPAGEの間です。

私は、20歳以上のすべてのユーザーとそのユーザーの後続するすべてのページをすべて提供する、効率的なクエリを探しています。アプリケーション側からの単純なループを使用して、各反復ごとに単純なトラバーサルクエリを使用して行うことができます。残念なことに、そのようなソリューションは、私にとっては効率的ではありません。この場合、多くのクエリが生成され、ネットワーク遅延が大きくなる可能性があるためです。

答えて

4

「効率的」という定義が何であるかはっきりしていませんが、これは一般的なOLAPユースケースであり、OLTPリアルタイムの高速応答を期待するべきではないことに注意してください。

g.V().has("USER", "AGE", gt(20)).as("user"). 
    map(out("FOLLOW").fold()).as("pages"). 
    select("user", "pages") 

現代のサンプルグラフを使用した小さな例:

gremlin> g = TinkerFactory.createModern().traversal().withComputer() 
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], graphcomputer] 
gremlin> g.V().has("person", "age", gt(30)).as("user"). 
      map(out("created").fold()).as("projects"). 
      select("user","projects") 
==>[user:v[6], projects:[v[3]]] 
==>[user:v[4], projects:[v[5], v[3]]] 
+0

何完璧な答えクエリは同じくらい簡単であるべき、と述べた

! しかし、ユーザーが多くのユーザーをフォローすると、そのユーザーのすべてがメモリにロードされます。 – pinokio

+0

@pinokioおそらくlimit()を使用することはこの状況の解決策になる可能性があります。 –

+0

@Daniel Kuppitzユーザー/プロジェクトの特定のデータ(ユーザー名、姓など)を取得するにはどうすればよいですか? – trojek

0

これは非常に簡単です:あなたはグレムリンにこのクエリを使用しているとき

g.V().label('user').has('age',gt(20)) 
.match(__.as('user').out('follows').as('page')) 
.select('user','page') 

がちょうど注意、グレムリンはあなたがコードでそれを使用すると「ページ」はそれを得る存在するかどうかを確認することができ、nullポインタ例外を提供します。

関連する問題