我知道这次被问了几次,但我没有找到关于Tinkerpop(3.1)的最新版本的任何参考,其中包含许多我们可以在遍历中使用的新的有用函数.
假设我必须找到节点3和节点4之间的最短路径.这种遍历是否有声音?
g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().limit(1)
这里我假设当我循环执行BFS搜索时(因此,第一个结果是最短路径),因为这似乎就是loop()
函数的情况.
另外,有没有办法在步骤中包含先前绑定的变量(通过使用as
步骤)until
?更确切地说,我试图在遍历期间选择两个节点,然后找到它们之间的最短路径,例如,
g.V().match( __as('e0').out('Feedbacks').as('e1'), __as('e0').repeat(out('Meets')).until().path()..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())
返回错误.
这是我正在试验的图表,如果有人想要玩一下.
graph = TinkerGraph.open() e0 = graph.addVertex(T.id, 0, label, "User", "name", "e0") e1 = graph.addVertex(T.id, 1, label, "User", "name", "e1") e2 = graph.addVertex(T.id, 2, label, "User", "name", "e2") e3 = graph.addVertex(T.id, 3, label, "User", "name", "e3") e4 = graph.addVertex(T.id, 4, label, "User", "name", "e4") e0.addEdge("Feedbacks", e2) e0.addEdge("Meets", e1) e2.addEdge("Feedbacks", e4) e2.addEdge("Meets", e4) e3.addEdge("Feedbacks", e0) e3.addEdge("Meets", e2) e4.addEdge("Feedbacks", e0) g = graph.traversal()
Daniel Kuppi.. 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)
UPDATE
关于您更新的查询,这个应该解决问题:
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").
.
您的最短路径查询有一个稍短的变体:
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)
UPDATE
关于您更新的查询,这个应该解决问题:
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").
.