1

次のサンプル データを使用して、3 レベルの深さの Alice の Ruby 接続のネットワークを返す Gremlin クエリを作成したいと思います。

Vertex: Alice
Vertex: Bobby
Vertex: Cindy
Vertex: David
Vertex: Eliza

Edge: [Alice] -> [Rates(tag:ruby,value:0.9)] -> [Bobby]
Edge: [Bobby] -> [Rates(tag:ruby,value:0.8)] -> [Cindy]
Edge: [Cindy] -> [Rates(tag:ruby,value:0.7)] -> [David]
Edge: [David] -> [Rates(tag:ruby,value:0.6)] -> [Eliza]   # ignored, level 4
Edge: [Alice] -> [Rates(tag:java,value:0.9)] -> [Eliza]   # ignored, not ruby

したがって、返されるデータは次のようになります。

Bobby: [0.9]
Cindy: [0.9, 0.8]
David: [0.9, 0.8, 0.7]

各頂点 ID が評価値のパスの配列とともに返される場所。

JanusGraph (Gremlin 3) の現在のリリースで作業しています。私は Gremlin を初めて使用します。目的のクエリと共通点のあるいくつかのレシピに戸惑いましたが、そこにたどり着く方法がまだわかりません...

あなたが提供できる助けやアドバイスをありがとう。

4

1 に答える 1

4

Gremlin に質問するときは、次のように簡単に切り取って Gremlin コンソールに貼り付けることができるサンプル グラフを提供すると、答えようとする人にとって常に役に立ちます。

graph = TinkerGraph.open()
g = graph.traversal()
g.addV().property('name','alice').as('a').
  addV().property('name','bobby').as('b').
  addV().property('name','cindy').as('c').
  addV().property('name','david').as('d').
  addV().property('name','eliza').as('e').
  addE('rates').property('tag','ruby').property('value',0.9).from('a').to('b').
  addE('rates').property('tag','ruby').property('value',0.8).from('b').to('c').
  addE('rates').property('tag','ruby').property('value',0.7).from('c').to('d').
  addE('rates').property('tag','ruby').property('value',0.6).from('d').to('e').
  addE('rates').property('tag','java').property('value',0.9).from('a').to('e').iterate()

このグラフを使用して、あなたが望む結果を得るためのこのアプローチを思いつきました:

gremlin> g.V().has('name','alice').
......1>   repeat(outE().has('tag','ruby').inV()).
......2>     times(3).
......3>     emit().
......4>   group().
......5>     by('name').
......6>     by(path().
......7>        unfold().
......8>        has('value').
......9>        values('value').
.....10>        fold())
==>[bobby:[0.9],cindy:[0.9,0.8],david:[0.9,0.8,0.7]]

行 3 までを でフォローアップするのemit()は、おそらく一目瞭然です。「アリス」を見つけout()てから、深さ 3 まで繰り返しトラバースし、途中で発見された各頂点を放出します。これにより、気になる頂点が得られます。

gremlin> g.V().has('name','alice').
......1>   repeat(outE().has('tag','ruby').inV()).
......2>     times(3).
......3>     emit()
==>v[2]
==>v[4]
==>v[6]

より複雑な部分は、各「レート」エッジに沿って「値」プロパティを取得できるように、それぞれのパス情報を取得することに関心があるところです。必要な構造をgroup簡単に取得できるように使用することにしました。明らかに、「bobby」がツリーに 2 回出現した場合、彼のエントリMapの評価リストは 2 つになります。Map

で何が起こっているかを区別group()すると、2 つのオプションによって調整されていることがわかりby()ます。最初のものは のキーに対応しますMap(明らかに、「名前」の一意性を想定しています)。2 番目は、現在のトラバーサー (人の頂点) からパスを抽出します。先に進む前に、出力がどのように見えるかを見てみましょうpath():

gremlin> g.V().has('name','alice').
......1>   repeat(outE().has('tag','ruby').inV()).
......2>     times(3).
......3>     emit().
......4>   group().
......5>     by('name').
......6>     by(path()).next()
==>bobby=[v[0], e[10][0-rates->2], v[2]]
==>cindy=[v[0], e[10][0-rates->2], v[2], e[11][2-rates->4], v[4]]
==>david=[v[0], e[10][0-rates->2], v[2], e[11][2-rates->4], v[4], e[12][4-rates->6], v[6]]

次の手順ではpath()、そのパスを目的のフォームに操作します。各パスを展開し、「値」のエッジのみのプロパティを探してエッジを除外し、それを抽出してから、マップ内の各値のリストに値を折り畳みます。

于 2017-07-17T11:30:20.750 に答える