2

I'd like to traverse my weighted graph from a starting node to a certain depth and print the traversal nodes and cumulative weight.

For instance, in a graph like this: A--1--B--2--C--1--D, A--1--B--1--F--1--G starting node A with depth 3 should return the following: A,B,F,G,cost:3

I had some progress using the following code but it does not calculate the weight of the paths:

x=g.v(36);x.out('BELONGS').out('RELATED').in('BELONGS').loop(3){it.loops<10}{true}.paths{it.name}

How can I write it to calculate the cost and traversal list of the path also?

Thanks in advance...

4

2 に答える 2

0

http://gremlindocs.com/#transform/path.pathを参照して、そこから計算できると思います。

于 2013-03-08T12:10:38.360 に答える
0

Gremlin の先頭をあまり変更せず、パス式の最後から計算するようにしました。これにアプローチするより良い方法があるかもしれませんが、おもちゃのグラフを使用して私が持っているものは次のとおりです。

gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.v(1).outE.inV.loop(2){it.loops<3}{true}.path 
==>[v[1], e[7][1-knows->2], v[2]]
==>[v[1], e[8][1-knows->4], v[4]]
==>[v[1], e[9][1-created->3], v[3]]
==>[v[1], e[8][1-knows->4], v[4], e[10][4-created->5], v[5]]
==>[v[1], e[8][1-knows->4], v[4], e[11][4-created->3], v[3]]

そのため、エッジがパスに表示されるように outE.inV を含めることに注意してください。次に、パスに 2 番目のクロージャを追加して、重みを端から外します。

gremlin> g.v(1).outE.inV.loop(2){it.loops<3}{true}.path{it.name}{it.weight}
==>[marko, 0.5, vadas]
==>[marko, 1.0, josh]
==>[marko, 0.4, lop]
==>[marko, 1.0, josh, 1.0, ripple]
==>[marko, 1.0, josh, 0.4, lop]

次に、その出力を合計された重みに操作するのは、一連の Groovy JDK です。

gremlin> g.v(1).outE.inV.loop(2){it.loops<3}{true}.path{it.name}{it.weight}.transform{it.toList().split{i->"${i}".isNumber()}}.collect{[it[0].sum(),it[1]]}
==>[0.5, [marko, vadas]]
==>[1.0, [marko, josh]]
==>[0.4, [marko, lop]]
==>[2.0, [marko, josh, ripple]]
==>[1.4000000059604645, [marko, josh, lop]]

だから、私は(ピーターが提案したように)変換を追加し、アイテムのリストを重みのものと名前のものに分割します(値が「isNumber」かどうかを確認するだけで...別のアプローチが必要になる場合があります)。その上でマップ関数を実行して、重みのコレクションを sum() し、名前のコレクションを返します。

于 2013-03-08T12:46:38.653 に答える