2

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

例如,在这样的图中: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}

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

提前致谢...

4

2 回答 2

0

我认为您可以.path查看http://gremlindocs.com/#transform/path并从那里计算。

于 2013-03-08T12:10:38.360 回答
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() 权重集合并返回名称集合。

于 2013-03-08T12:46:38.653 回答