2016-11-17 5 views

答えて

1

ここでは、トラバースしたいブランチと一致すると思われるサンプルグラフを示します。

graph=TinkerGraph.open() 
==>tinkergraph[vertices:0 edges:0] 
g=graph.traversal() 
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] 
v1 = graph.addVertex(T.label, "vtx", T.id, 1, "name", "alpha") 
==>v[1] 
v2 = graph.addVertex(T.label, "vtx", T.id, 2, "name", "beta") 
==>v[2] 
v3 = graph.addVertex(T.label, "vtx", T.id, 3, "name", "gamma") 
==>v[3] 
v4 = graph.addVertex(T.label, "vtx", T.id, 4, "name", "delta") 
==>v[4] 
v5 = graph.addVertex(T.label, "vtx", T.id, 5, "name", "epsilon") 
==>v[5] 
v5.addEdge("parent", v4, T.id, 101) 
==>e[101][5-parent->4] 
v4.addEdge("parent", v3, T.id, 102) 
==>e[102][4-parent->3] 
v3.addEdge("parent", v2, T.id, 103) 
==>e[103][3-parent->2] 
v2.addEdge("parent", v1, T.id, 104) 
==>e[104][2-parent->1] 

アウトバウンドの '親'エッジを受け取るrepeat()ループは、階層を '上に'移動します。次の例では、我々は「ホップ」[5] vで開始し、2を取るためにそれを言った:実際には

g.V(5).repeat(out('parent')).times(2).path() 
==>[v[5],v[4],v[3]] 

あなたはおそらく(繰り返しIE)トラバース維持したいあなたは、いくつかの終了条件を打つまであなたが達成したいことに依存します。

特定の頂点で停止したいと思うかもしれません。あなたが知っていれば、階層のルートは、[1] Vである、または特定のプロパティを持っている:

g.V(5).repeat(out('parent')).until(hasId(1)).path() 
==>[v[5],v[4],v[3],v[2],v[1]] 

それとも、階層の最上位にヒットするまで、それ以上の発信エッジが存在しなくなるまで、あなたが(すなわちトラバースすることをお勧めします):

g.V(5).repeat(out('parent')).until(outE().count().is(0)).path() 
==>[v[5],v[4],v[3],v[2],v[1]] 

遠いリーフノードへのルートからの最大深さを得るために:

あなたのグラフを一致させるために、のグラフにいくつかのより多くの頂点を追加してみましょう。

v7 = graph.addVertex(T.label, "vtx", T.id, 7, "name", "eta") 
==>v[7] 
v8 = graph.addVertex(T.label, "vtx", T.id, 8, "name", "theta") 
==>v[8] 
v6 = graph.addVertex(T.label, "vtx", T.id, 6, "name", "zeta") 
==>v[6] 
v8.addEdge("parent", v7, T.id, 105) 
==>e[105][8-parent->7] 
v7.addEdge("parent", v2, T.id, 106) 
==>e[106][7-parent->2] 
v6.addEdge("parent", v3, T.id, 107) 
==>e[107][6-parent->3] 

葉の頂点に向けてルートからトラバーサルは今3つのパスになります:

g.V(1).repeat(__.in('parent')).until(inE().count().is(0)).path() 
==>[v[1],v[2],v[3],v[6]] 
==>[v[1],v[2],v[7],v[8]] 
==>[v[1],v[2],v[3],v[4],v[5]] 

をしかし、あなたは唯一の最長パスの長さが欲しい:

g.V(1).repeat(__.in('parent')).until(inE().count().is(0)).path(). 
......1> tail(1).unfold().count() 
==>5 

願って助けてください、 グラハム

3

グラハムの答えは大丈夫ですが、 h計算には必要ではありません。

これは私があなたのグラフを設定している方法です:

g = TinkerGraph.open().traversal() 

g.addV().property(id, 1).as("v1"). 
    addV().property(id, 2).as("v2"). 
    addV().property(id, 3).as("v3"). 
    addV().property(id, 4).as("v4"). 
    addV().property(id, 5).as("v5"). 
    addV().property(id, 6).as("v6"). 
    addV().property(id, 7).as("v7"). 
    addV().property(id, 8).as("v8"). 
    addE("black").from("v2").to("v1"). 
    addE("black").from("v7").to("v2"). 
    addE("black").from("v8").to("v7"). 
    addE("orange").from("v8").to("v7"). 
    addE("black").from("v3").to("v2"). 
    addE("black").from("v6").to("v3"). 
    addE("black").from("v4").to("v3"). 
    addE("black").from("v5").to("v4"). 
    addE("orange").from("v5").to("v4").iterate() 

、すべての祖先を取得するには、あなたが必要なのはこれです:

gremlin> g.V(5).repeat(out().dedup()).emit() 
==>v[4] 
==>v[3] 
==>v[2] 
==>v[1] 

同様にあなたは、パス計算を必要としません最大深度を決定する:

gremlin> g.V(5).emit().repeat(out().dedup()).count() 
==>5 
関連する問題