我知道这次被问了好几次,但是我没有找到关于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())
答案 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").
。