有一个官方的解决方案(收据),用于查找所有连接的组件。但是我需要同样的方法,但是要考虑到边缘的方向。
因此,我需要从某个节点获取可以到达的所有节点,反之亦然-从该节点找到可以选择的顶点的所有节点。
我的代码示例是用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]
有可能吗?这似乎是一项常见的任务,但我找不到有关它的问题。人们只想找到连接的组件。 预先谢谢你!
答案 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]]