【问题标题】:Print hierarchical vertices in a graph [closed]在图中打印分层顶点[关闭]
【发布时间】:2016-11-17 01:03:13
【问题描述】:

如何打印给定节点的所有父节点。

【问题讨论】:

  • Daniel 的答案只有在没有多个父节点的节点时才有效。在有多个父母的情况下,计数步骤不会返回深度,而是返回父母的数量及其父母等。另一方面,格雷厄姆的答案更安全,因为它通过路径。

标签: graphic


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是一个我认为与您要遍历的分支匹配的示例图。

    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
    

    希望对您有所帮助, 格雷厄姆

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      相关资源
      最近更新 更多