我尽量不要过多地修改 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 函数来 sum() 权重集合并返回名称集合。