2013-03-07 1033 views
2

我想將我的加權圖從起始節點遍歷到特定深度,並打印遍歷節點和累積權重。例如,在如下的圖表中:A-1-B-2-C-1-D,A-1-B-1-F-1-B-2-C-1 -D, -G開始節點A與深度3應返回以下:A,B,F,G,成本:3Neo4j - 使用Gremlin查找最短路徑及其遍歷代價

我用下面的代碼有一些進展,但它不計算路徑的重量:

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

我怎麼寫它來計算路徑的成本和遍歷列表呢?

在此先感謝...

回答

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列入使得邊緣出現在路徑。然後我第二封閉的路徑添加到得到的重量了邊緣:

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」......您可能需要一種不同的方法),然後我運行一個map函數來彙總()權重集合並返回名稱集合。

+0

太棒了!它的工作!..非常感謝。 – Hako 2013-03-08 17:16:30