Tinkerpop 3:使用Gremlin遍历计算连接组件

Tinkerpop 3:使用Gremlin遍历计算连接组件,gremlin,connected-components,tinkerpop3,Gremlin,Connected Components,Tinkerpop3,我认为标签很好地解释了我的问题:) 我一直在尝试编写一个Gremlin遍历来计算本文末尾描述的简单图的连接组件 我试过了 g.V().repeat(both('e')).until(cyclicPath()).dedup().tree().by('name').next() 获得 ==>a={b={a={}, c={b={}}, d={c={d={}}}}, c={d={c={}}}} ==>e={f={e={}, g={f={}}}, h={f={h={}}}} ==>g=

我认为标签很好地解释了我的问题:)

我一直在尝试编写一个Gremlin遍历来计算本文末尾描述的简单图的连接组件

我试过了

g.V().repeat(both('e')).until(cyclicPath()).dedup().tree().by('name').next()
获得

==>a={b={a={}, c={b={}}, d={c={d={}}}}, c={d={c={}}}}
==>e={f={e={}, g={f={}}}, h={f={h={}}}}
==>g={f={g={}}}
这是不好的,因为
cyclicPath
过滤器在到达
g
之前终止了从
e
开始的遍历。 显然,如果我删除
直到
子句,就会得到一个无限循环。
此外,如果使用
simplePath
,遍历将在一步后结束。 有没有办法告诉它先深入研究节点

干杯

a = graph.addVertex(T.id, 1, "name", "a")
b = graph.addVertex(T.id, 2, "name", "b")
c = graph.addVertex(T.id, 3, "name", "c")
d = graph.addVertex(T.id, 4, "name", "d")
e = graph.addVertex(T.id, 5, "name", "e")
f = graph.addVertex(T.id, 6, "name", "f")
g = graph.addVertex(T.id, 7, "name", "g")
h = graph.addVertex(T.id, 8, "name", "h")

a.addEdge("e", b)
a.addEdge("e", c)
b.addEdge("e", c)
b.addEdge("e", d)
c.addEdge("e", d)

e.addEdge("e", f)
e.addEdge("e", h)
f.addEdge("e", h)
f.addEdge("e", g)
这个查询。 这是我提出的解决方案。 @Daniel Kuppitz还有一个有趣的解决方案,你可以在上面提到的线程中找到


我认为,如果在无向图中,连接组件遍历的“最后”节点总是指向以前访问过的节点(
cyclicPath()
),或者具有度,只是为了增强@Alberto版本,该版本运行良好,那么可以使用
simplePath()
遍历步骤()确保遍历器不会在图形中重复其路径

g.V().repeat(both().simplePath())
  .until(bothE().count().is(lte(1)))
  .dedup().tree().by('name').next()
g.V().repeat(both().simplePath())
  .until(bothE().count().is(lte(1)))
  .dedup().tree().by('name').next()