如何使用 gremlinPipeLine 获取最后一级值未知的特定顶点的最后一级顶点

How to get the last level vertices of a particular vertex where last level value is not known using gremlinPipeLine

我想使用 Gremlin 编写查询以查找特定顶点的最后一层的所有顶点,其中最后一层的值未知。 假设我有一个顶点A。连接到 A 的下一组顶点是 [B,C,D]。第二层的顶点 [E,F,G] ,依此类推。

以下将为您提供我认为是树结构的所有叶子:

g.v(1).out.loop(1){it.object.outE.hasNext()}

上面应该从顶点“1”向外遍历,直到到达任何特定路径的 "last level"。发出的顶点应该是此遍历在终止时找到的任何顶点。

gremlin> g = new TinkerGraph()
==>tinkergraph[vertices:0 edges:0]
gremlin> v1 = g.addVertex()
==>v[0]
gremlin> v2 = g.addVertex()
==>v[1]
gremlin> v3a = g.addVertex()
==>v[2]
gremlin> v3b = g.addVertex()
==>v[3]
gremlin> v4 = g.addVertex() 
==>v[4]
gremlin> v1.addEdge('next',v2)
==>e[5][0-next->1]
gremlin> v2.addEdge('next',v3a)
==>e[6][1-next->2]
gremlin> v2.addEdge('next',v3b)
==>e[7][1-next->3]
gremlin> v3a.addEdge('next',v4)
==>e[8][2-next->4]                 
gremlin> g.v(1).out.loop(1){it.object.outE.hasNext()}
==>v[3]
==>v[4]

请注意,如果您不确定自己的数据结构,这可能是一种危险的遍历,因为如果图形循环,它可能会永远循环下去。

附带说明一下,您可以通过添加另一个闭包(即 emit 闭包)来控制中间顶点(不仅仅是最终顶点)的发射。例如,

g.v(1).out.loop(1){true}{true}

以上将循环结束并发出它找到的每个顶点。

找到树的 "height" 可以通过获取循环的最大值来完成:

gremlin> h=0;g.v(1).out.loop(1){h=Math.max(h,it.loops);it.object.outE.hasNext()}
==>v[3]
==>v[4]
gremlin> h
==>3