从不同源到相同目标的遍历

Traversal from Different Sources to Same Target

我有以下图形布局:

我正在尝试到达 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)。

你似乎已经很正确了。下面是构建和查询您建议的图表的示例,您可以在 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个起始节点,所以一个遍历器实际上从目标节点开始,但由于它不匹配任何选项,因此遍历器死亡。

这不是 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.

中的代码相同