【发布时间】:2016-11-17 01:03:13
【问题描述】:
如何打印给定节点的所有父节点。
【问题讨论】:
-
Daniel 的答案只有在没有多个父节点的节点时才有效。在有多个父母的情况下,计数步骤不会返回深度,而是返回父母的数量及其父母等。另一方面,格雷厄姆的答案更安全,因为它通过路径。
标签: graphic
如何打印给定节点的所有父节点。
【问题讨论】:
标签: graphic
Graham 的回答还可以,但使用了昂贵的路径计算,这对于您的用例来说并不是真正需要的。
这就是我设置图表的方式:
g = TinkerGraph.open().traversal()
g.addV().property(id, 1).as("v1").
addV().property(id, 2).as("v2").
addV().property(id, 3).as("v3").
addV().property(id, 4).as("v4").
addV().property(id, 5).as("v5").
addV().property(id, 6).as("v6").
addV().property(id, 7).as("v7").
addV().property(id, 8).as("v8").
addE("black").from("v2").to("v1").
addE("black").from("v7").to("v2").
addE("black").from("v8").to("v7").
addE("orange").from("v8").to("v7").
addE("black").from("v3").to("v2").
addE("black").from("v6").to("v3").
addE("black").from("v4").to("v3").
addE("black").from("v5").to("v4").
addE("orange").from("v5").to("v4").iterate()
现在,要获得所有祖先,您只需要以下内容:
gremlin> g.V(5).repeat(out().dedup()).emit()
==>v[4]
==>v[3]
==>v[2]
==>v[1]
同样,您不需要计算路径来确定最大深度:
gremlin> g.V(5).emit().repeat(out().dedup()).count()
==>5
【讨论】:
这是一个我认为与您要遍历的分支匹配的示例图。
graph=TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
g=graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
v1 = graph.addVertex(T.label, "vtx", T.id, 1, "name", "alpha")
==>v[1]
v2 = graph.addVertex(T.label, "vtx", T.id, 2, "name", "beta")
==>v[2]
v3 = graph.addVertex(T.label, "vtx", T.id, 3, "name", "gamma")
==>v[3]
v4 = graph.addVertex(T.label, "vtx", T.id, 4, "name", "delta")
==>v[4]
v5 = graph.addVertex(T.label, "vtx", T.id, 5, "name", "epsilon")
==>v[5]
v5.addEdge("parent", v4, T.id, 101)
==>e[101][5-parent->4]
v4.addEdge("parent", v3, T.id, 102)
==>e[102][4-parent->3]
v3.addEdge("parent", v2, T.id, 103)
==>e[103][3-parent->2]
v2.addEdge("parent", v1, T.id, 104)
==>e[104][2-parent->1]
采用出站“父”边的 repeat() 循环将“向上”遍历层次结构。在下面的示例中,我们告诉它从 v[5] 开始并进行两次“跳跃”:
g.V(5).repeat(out('parent')).times(2).path()
==>[v[5],v[4],v[3]]
在实践中,您可能希望继续遍历(即重复),直到遇到某些终止条件,这取决于您想要实现的目标。
你可能知道你想停在一个特定的顶点,例如如果您知道层次结构的根是 v[1],或者具有特定属性:
g.V(5).repeat(out('parent')).until(hasId(1)).path()
==>[v[5],v[4],v[3],v[2],v[1]]
或者你可能想要遍历直到你到达层次结构的顶部(即直到没有更多的传出边):
g.V(5).repeat(out('parent')).until(outE().count().is(0)).path()
==>[v[5],v[4],v[3],v[2],v[1]]
获取从根到最远叶节点的最大深度:
让我们在图中添加更多顶点,以匹配您的图。
v7 = graph.addVertex(T.label, "vtx", T.id, 7, "name", "eta")
==>v[7]
v8 = graph.addVertex(T.label, "vtx", T.id, 8, "name", "theta")
==>v[8]
v6 = graph.addVertex(T.label, "vtx", T.id, 6, "name", "zeta")
==>v[6]
v8.addEdge("parent", v7, T.id, 105)
==>e[105][8-parent->7]
v7.addEdge("parent", v2, T.id, 106)
==>e[106][7-parent->2]
v6.addEdge("parent", v3, T.id, 107)
==>e[107][6-parent->3]
从根到叶顶点的遍历现在将产生 3 条路径:
g.V(1).repeat(__.in('parent')).until(inE().count().is(0)).path()
==>[v[1],v[2],v[3],v[6]]
==>[v[1],v[2],v[7],v[8]]
==>[v[1],v[2],v[3],v[4],v[5]]
但你只想要最长路径的长度:
g.V(1).repeat(__.in('parent')).until(inE().count().is(0)).path().
......1> tail(1).unfold().count()
==>5
希望对您有所帮助, 格雷厄姆
【讨论】: