从不同来源遍历到同一目标

时间:2015-11-17 13:10:14

标签: java groovy tinkerpop

我有以下图表布局:

enter image description here

我正在尝试访问TargetVertex,我获得了另外三个顶点Vertex1Vertex2Vertex3

我必须使用所有三个源顶点来确保最终目标之一在所有3个中都是相同的。

我相信groovy语法可能是这样的形式:

g.V(Vertex1.id, Vertex2.id, Vertex3.id).branch(id()).
    option(Vertex1.id(), in().V()).
    option(Vertex2.id(), in().V()).
    option(Vertex3.id(), out().V());

非常感谢从多个来源到同一目标的这种遍历的示例。更具体地说,我正在寻找一个遍历,其中最终结果保证是相同的(即TargetVertex),无论来源如何。

2 个答案:

答案 0 :(得分:3)

这不是branch()要解决的问题。从其中一个顶点开始,验证其他2个顶点是否已连接:

g.V(v3).out().and(out().is(v1), out().is(v2))

另一个选择是match()步骤:

g.V(v3).match(
     __.as("a").out().as("t"),
     __.as("t").out().is(v1),
     __.as("t").out().is(v2)).select("t")

前者会更快。在这两种情况下,它与Java和Groovy中的代码相同。

答案 1 :(得分:0)

你似乎已经非常正确了。下面是一个构建和查询您建议的图表的示例,您可以在TinkerPop3 Gremlin控制台中试用:

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> vt = graph.addVertex(); v1 = graph.addVertex(); v2 = graph.addVertex(); v3 = graph.addVertex()
==>v[3]
gremlin> vt.addEdge('to', v1); vt.addEdge('to', v2); v3.addEdge('to', vt)
==>e[6][3-to->0]
gremlin> v1.id()
==>1
gremlin> v2.id()
==>2
gremlin> v3.id()
==>3
gremlin> vt.id()
==>0
gremlin> g.V().branch(id()).option(v1.id(), __.in().id()).option(v2.id(), __.in().id()).option(v3.id(), __.out().id())
==>0
==>0
==>0

你可以看到3个遍历者完成了路径,并且都导致id为0的目标顶点。在我的查询中,我并没有将g.V()限制为3个起始节点,所以一个遍历器实际上是在目标节点上启动,但由于它没有匹配任何选项,因此遍历器就会死亡。