繁体   English   中英

Gremlin>递归查找通过边线类型连接的节点

[英]Gremlin > recursively find nodes connected by an edge type

只需使用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]]

谢谢!

您不需要任何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]

这是我目前的解决方案。 这是一项正在进行中的工作,所以我很乐意提出改进和建议。 (当然可以使用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]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM