在Tinkerpop 3.1中找到两个节点之间最短路径的最佳方法

时间:2015-12-02 10:33:42

标签: shortest-path gremlin tinkerpop3

我知道这次被问了好几次,但是我没有找到关于Tinkerpop(3.1)最新版本的任何参考资料,其中包含许多我们可以在遍历中使用的新功能。

假设我必须在节点3和4之间找到 最短路径。 这遍历听起来了吗?

$&

这里我假设当我循环执行BFS搜索时(因此,第一个结果是最短路径)为it seems that this was the case with the loop() function

此外,有没有办法在g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().limit(1) 步骤中包含先前绑定的变量(通过使用as步骤)? 更准确地说,我试图在遍历期间选择两个节点,然后找到它们之间的最短路径,例如,

until

最后,从前面的遍历中可以看出,我不清楚如何获得最短路径的长度。 使用像

这样的东西
g.V().match(
__as('e0').out('Feedbacks').as('e1'),
__as('e0').repeat(out('Meets')).until(<I reach e1>).path().<get_length>.as('len')
).select('e0', 'e1', 'len')

返回结果的大小(返回的行数),而

g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().size()

返回错误。

以下是我正在试验的图表,如果有人想玩的话。

g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().by(__size())

1 个答案:

答案 0 :(得分:11)

您的最短路径查询的变体略短:

g.V(3).repeat(out().simplePath()).until(hasId(4)).path().limit(1)

您的假设,第一条路径始终是最短路径,是正确的。 要获取路径长度,可以使用count(local)

g.V(3).repeat(out().simplePath()).until(hasId(4)).path().count(local)

<强>更新

关于更新后的查询,这个问题可以解决问题:

g.V().as("e0").out("Feedbacks").as("e1").select("e0").
      repeat(out("Meets")).until(where(eq("e1"))).path().
      map(union(count(local), constant(-2)).sum()).as("len").
      select("e0","e1","len")

我从总路径长度中减去2,因为我认为您只对repeat()块遍历的路径长度感兴趣,并且不应包含开头的out().select() 。如果情况并非如此,那么您只需将第3行替换为count(local).as("len").