【问题标题】:Gremlin > recursively find nodes connected by an edge typeGremlin > 递归查找由边缘类型连接的节点
【发布时间】:2015-04-01 06:33:35
【问题描述】:

仅使用TinkerGraph,并尝试递归查找由特定边缘标签连接的节点(在本例中为created)。

  1. 有没有一种方法可以递归(/循环)遍历节点?在下面的示例中,我想循环直到没有更多匹配的边(而不是硬编码的 3 值)。
  2. 在给定图表的情况下,是否有办法找到并分组连接的顶点?

对重复数据删除节点和处理节点循环的额外赞誉。

依赖关系

compile("com.thinkaurelius.titan:titan-berkeleyje:0.5.4")
compile('com.tinkerpop:gremlin-groovy:2.6.0')

代码(手动递归3次:()

Gremlin.load()
def g = TinkerGraphFactory.createTinkerGraph()
println g.v(5).as('x')
    .both('created')
    .dedup
    .loop(2){it.loops <= 3}
    .path
    .toList().flatten() as Set // groovy code to flatten & dedup

给我:(正确)

[v[5], v[4], v[3], v[1], v[6]]

谢谢!

【问题讨论】:

  • 这是否意味着您不想遍历您已经在遍历中访问过的顶点?
  • @D.Mill ,我不介意使用哪种方法来获取一组连接的节点。不过,这听起来合乎逻辑(取决于您的方法),您不想遍历同一个顶点两次(以避免无限循环),对吧?

标签: gremlin tinkerpop tinkerpop-blueprint


【解决方案1】:

您不需要任何 Groovy 代码,只需使用 Gremlin 即可完成:

gremlin> g.v(5).as('x').both('created').dedup()
gremlin>     .loop('x') {true} {true}.dedup()
==>v[4]
==>v[3]
==>v[5]
==>v[6]
==>v[1]

【讨论】:

  • 太棒了,正是我想要的!你能解释一下为什么loop('x') {true} {true} 不会无限循环吗?我已阅读文档,但不明白您的循环是如何工作的...gremlindocs.com/#branch/loop
  • 如果没有路径,它就无法循环(在引擎盖下抛出 FastNoSuchElementException)。 .both('created').dedup() 中的 .dedup() 确保没有路径被遍历两次。
  • 这真的很酷。我扔回了g.v(6).addEdge('created', g.v(4)),它甚至没有眨眼。很好的解决方案。
【解决方案2】:

这是我目前的解决方案。这是一项正在进行中的工作,所以我很高兴得到改进和建议。 (当然可以使用 Gremlin 语法进行优化?)

假设:我们有一个起始节点

Gremlin.load()
def g = TinkerGraphFactory.createTinkerGraph()
def startV = g.v(5)
def seen = [startV] // a list of 'seen' vertices
startV.as('x')
    .both('created')
    .filter { // only traverse 'unseen' vertices
        def unseen = !seen.contains(it)
        if (unseen){
            seen << it
        }
        unseen
    }
    .loop('x'){
        // continue looping while there are still more 'created' edges...
        it.object.both('created').hasNext() // ##
    }
    .toList() // otherwise won't process above pipeline
println seen

## 我不确定为什么这种情况有效/找不到以前遍历的边。谁能解释一下?

给我:

[v[4], v[5], v[3], v[1], v[6]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多