我想编写一个查询来查找特定顶点最后一级的所有顶点,其中使用 Gremlin 来识别最后一级的值。
假设我有一个顶点A
。连接到A
的下一组顶点是[B,C,D]。第2级顶点[E,F,G],依此类推。
答案 0 :(得分:1)
以下内容将为您提供我假设为树结构的所有内容:
g.v(1).out.loop(1){it.object.outE.hasNext()}
上面应该从顶点“1”遍历你,直到你达到任何特定路径的“最后一级”。发出的顶点应该是此遍历在终止时发现的任何内容。
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]
请注意,如果您不确定数据结构,这可能是一次危险的遍历,因为如果图形循环,它可能会永远循环。
作为旁注,您可以通过添加另一个闭包(即发射闭合)来控制中间顶点(不仅仅是最终顶点)的发射。例如,
g.v(1).out.loop(1){true}{true}
上面将循环结束并发出它找到的每个顶点。
找到树的“高度”可以通过抓取最大循环来完成:
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