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()
、そのパスを目的のフォームに操作します。各パスを展開し、「値」のエッジのみのプロパティを探してエッジを除外し、それを抽出してから、マップ内の各値のリストに値を折り畳みます。