Neo4j-使用Gremlin找到最短路径及其遍历成本

时间:2013-03-07 14:21:50

标签: path neo4j traversal gremlin shortest

我想将我的加权图从起始节点遍历到某个深度并打印遍历节点和累积权重。

例如,在这样的图中:A - 1 - B - 2 - C - 1 - D,A - 1 - B - 1 - F - 1- G起始节点A的深度为3应返回以下内容:A,B,F,G,成本:3

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

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

如何编写它来计算路径的成本和遍历列表呢?

提前致谢...

2 个答案:

答案 0 :(得分:0)

我认为您可以.pathhttp://gremlindocs.com/#transform/path并从那里开始计算。

答案 1 :(得分: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函数来sum()权重集合并返回名称集合。