首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >>递归查找由边缘类型连接的节点

>递归查找由边缘类型连接的节点
EN

Stack Overflow用户
提问于 2015-04-01 06:33:35
回答 2查看 3.3K关注 0票数 2

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

  1. 有什么方法可以递归地(/loop)遍历节点吗?在下面的示例中,我希望循环直到没有更多匹配的边(而不是硬编码的3值)。
  2. 在给定一个图的情况下,是否存在找到连通顶点并将其分组的方法?

对于去重复节点和处理节点循环的额外荣誉。

依赖关系

代码语言:javascript
复制
compile("com.thinkaurelius.titan:titan-berkeleyje:0.5.4")
compile('com.tinkerpop:gremlin-groovy:2.6.0')

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

代码语言:javascript
复制
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

给我:(正确)

代码语言:javascript
复制
[v[5], v[4], v[3], v[1], v[6]]

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-02 00:28:54

您不需要任何Groovy代码,只需要使用Gremlin:

代码语言:javascript
复制
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]
票数 3
EN

Stack Overflow用户

发布于 2015-04-02 00:27:27

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

假设:,给我们一个开始节点

代码语言:javascript
复制
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

##我不知道为什么这个条件有效/没有找到以前遍历过的边。有人能解释吗?

给我:

代码语言:javascript
复制
[v[4], v[5], v[3], v[1], v[6]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29384300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档