我試着不要過多地修改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函數來彙總()權重集合並返回名稱集合。
太棒了!它的工作!..非常感謝。 – Hako 2013-03-08 17:16:30