【问题标题】:How to get the last level vertices of a particular vertex where last level value is not known using gremlinPipeLine如何使用 gremlinPipeLine 获取不知道最后一级值的特定顶点的最后一级顶点
【发布时间】:2023-09-20 12:15:01
【问题描述】:

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

【问题讨论】:

  • 很高兴您想要一些东西,但是您想从我们这里得到什么?
  • “特定顶点的最后一级”是什么意思?举个例子吧!

标签: java titan gremlin tinkerpop


【解决方案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

【讨论】:

  • 嗨@stephen mallette。感谢您的快速回复 。第一个查询没有产生任何结果。尽管第二个查询工作正常。我也想知道如何找到一棵树的高度。
最近更新 更多