我如何在荣誉边缘方向的同时找到所有可到达的顶点

时间:2019-06-08 12:33:30

标签: gremlin

有一个官方的解决方案(收据),用于查找所有连接的组件。但是我需要同样的方法,但是要考虑到边缘的方向。

因此,我需要从某个节点获取可以到达的所有节点,反之亦然-从该节点找到可以选择的顶点的所有节点。

我的代码示例是用Java编写的。

// My test graph
    TinkerGraph graph = TinkerGraph.open();
    GraphTraversalSource g = graph.traversal();

        g
            .addV().property(T.id, 1).as("1")
            .addV().property(T.id, 2).as("2")
            .addV().property(T.id, 3).as("3")
            .addV().property(T.id, 4).as("4")
            .addV().property(T.id, 5).as("5")
            .addV().property(T.id, 6).as("6")
            .addE("link").from("1").to("2")
            .addE("link").from("1").to("3")
            .addE("link").from("1").to("4")
            .addE("link").from("2").to("3")
            .addE("link").from("3").to("4")
            .addE("link").from("4").to("5")
            .addE("link").from("4").to("6")
            .addE("link").from("5").to("2")
            .iterate();

例如

for vertex 1 I expect the result [1, 2, 3, 4, 5, 6]
for vertices 2, 3, 4, 5 I expect [2, 3, 4, 5, 6]
for vertex 6 I expect [6]

反之亦然:

for vertex 6 result [1, 2, 3, 4, 5]
for vertex 1 result [1] 

有可能吗?这似乎是一项常见的任务,但我找不到有关它的问题。人们只想找到连接的组件。 预先谢谢你!

1 个答案:

答案 0 :(得分:1)

对于单个起始顶点,它是如此简单:

g.V(startId).
  emit().
    repeat(out("link").dedup()).
  dedup()

现在,对于一次所有顶点(或一组顶点),您将要做:

g.V().project("vertex","result").
        by().
        by(emit().
             repeat(out("link").dedup()).
           dedup().fold())

示例图上的查询

gremlin> (1..6).collect { i ->
           result = g.V(i).emit().repeat(out("link").dedup()).dedup().id().toList()
           "for vertex ${i} result ${result}"
         }
==>for vertex 1 result [1, 2, 3, 4, 5, 6]
==>for vertex 2 result [2, 3, 4, 5, 6]
==>for vertex 3 result [3, 4, 5, 6, 2]
==>for vertex 4 result [4, 5, 6, 2, 3]
==>for vertex 5 result [5, 2, 3, 4, 6]
==>for vertex 6 result [6]

gremlin> g.V().project("vertex","result").
                 by(id).
                 by(emit().
                      repeat(out("link").dedup()).
                    dedup().id().fold())
==>[vertex:1,result:[1,2,3,4,5,6]]
==>[vertex:2,result:[2,3,4,5,6]]
==>[vertex:3,result:[3,4,5,6,2]]
==>[vertex:4,result:[4,5,6,2,3]]
==>[vertex:5,result:[5,2,3,4,6]]
==>[vertex:6,result:[6]]