我有以下图表布局:
我正在尝试访问TargetVertex
,我获得了另外三个顶点Vertex1
,Vertex2
和Vertex3
。
我必须使用所有三个源顶点来确保最终目标之一在所有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
),无论来源如何。
答案 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个起始节点,所以一个遍历器实际上是在目标节点上启动,但由于它没有匹配任何选项,因此遍历器就会死亡。