2017-07-16 12 views
0
次のサンプルデータを考えると

、私はルビー接続のアリスのネットワーク、3つの深いレベルを返すグレムリンのクエリを作成したいのですが、エッジのプロパティに基づいてノードを取得するにはデータは次のようなものでなければなりません。グレムリンクエリは再帰的

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

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

私はJanusGraph(Gremlin 3)の最新リリースで作業しています。私は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() 

私が思い付いた:あなたが容易に切断し、このようグレムリンコンソールに貼り付けることができるサンプルグラフを提供する場合、それは常に答えるしようとしたものに便利ですグレムリンの質問を

答えて

2

あなたが望む結果を得るために、このアプローチ:emit()でライン3を通じてフォローアップ

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の深さまで繰り返しout()を横断し、放出します各頂点は途中で発見されました。あなたはそれぞれの「金利」の縁に沿って「値」プロパティをつかむことができるように、より複雑な部分は、あなたがそれぞれのパス情報を取得する懸念があるところ、この後に来る

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

:それはあなたが気に頂点を取得します。私は簡単にMapの構造を得ることができるようにgroupを使いました。明らかに、「bobby」がツリーに2回出現した場合は、Mapエントリーの2つの評価リストに終わるでしょう。

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()したいフォームにそのパスを操作します。各パスを展開して、 "value"のエッジのみのプロパティを検索してエッジをフィルタリングし、次にそれを抽出し、マップ内の各値のリストに値を折り返します。

+0

ありがとうスティーブン!優れた説明と素晴らしい解答。 +100。 –