Path Neo4j使用Gremlin查找最短路径及其遍历代价

Path Neo4j使用Gremlin查找最短路径及其遍历代价,path,neo4j,traversal,gremlin,shortest,Path,Neo4j,Traversal,Gremlin,Shortest,我希望将加权图从起始节点遍历到某个深度,并打印遍历节点和累计权重 例如,在这样的图中:a--1--B--2--C--1--D,a--1--B--1--F--1--G深度为3的起始节点a应该返回以下值:a,B,F,G,cost:3 我使用以下代码取得了一些进展,但它没有计算路径的权重: x=g.v(36);x.out('BELONGS').out('RELATED').in('BELONGS').loop(3){it.loops<10}{true}.paths{it.name} x=g.v

我希望将加权图从起始节点遍历到某个深度,并打印遍历节点和累计权重

例如,在这样的图中:a--1--B--2--C--1--D,a--1--B--1--F--1--G深度为3的起始节点a应该返回以下值:a,B,F,G,cost:3

我使用以下代码取得了一些进展,但它没有计算路径的权重:

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

x=g.v(36);x、 out('begins').out('RELATED').in('begins').loops(3){it.loops我想你可以到
.path
,从那里查看并计算。

我试着不太修改你的小精灵的前面,而是从你的路径表达式的末尾开始计算。也许有更好的方法来实现这一点,但下面是我使用玩具图得到的:

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]]
gremlin>g=TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[顶点:6条边:6]
gremlin>g.v(1).outE.inV.loop(2){it.loops[v[1],e[7][1-knows->2],v[2]]
==>[v[1],e[8][1-knows->4],v[4]]
==>[v[1],e[9][1-创建->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]
gremlin>g.v(1).outE.inV.loop(2){it.loops[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]]
gremlin>g.v(1).outE.inV.loop(2){it.loops“${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]]
因此,我加入了一个转换(正如Peter所建议的),将项目列表分为权重和名称两部分(只需检查值“isNumber”…您可能需要另一种方法),然后我对其运行一个map函数,对权重集合求和()并返回名称集合