Gremlin 小精灵>;递归查找由边类型连接的节点

Gremlin 小精灵>;递归查找由边类型连接的节点,gremlin,tinkerpop,tinkerpop-blueprint,Gremlin,Tinkerpop,Tinkerpop Blueprint,只需使用,并尝试递归地查找由特定边缘标签连接的节点(在本例中为创建的) 有没有一种方法可以递归(/loop)遍历节点?在下面的示例中,我希望循环,直到不再有匹配的边(而不是硬编码的3值) 在给定一个图的情况下,是否仍然可以查找和分组连接的顶点 对重复数据消除节点和处理节点循环的额外赞誉 依赖关系 compile(“com.thinkaurelius.titan:titan berkeleyje:0.5.4”) 编译('com.tinkerpop:gremlingroovy:2.6.0') 代码

只需使用,并尝试递归地查找由特定边缘标签连接的节点(在本例中为创建的

  • 有没有一种方法可以递归(/loop)遍历节点?在下面的示例中,我希望循环,直到不再有匹配的边(而不是硬编码的
    3
    值)
  • 在给定一个图的情况下,是否仍然可以查找和分组连接的顶点
  • 对重复数据消除节点和处理节点循环的额外赞誉

    依赖关系
    compile(“com.thinkaurelius.titan:titan berkeleyje:0.5.4”)
    编译('com.tinkerpop:gremlingroovy:2.6.0')
    
    代码(手动递归3次:()
    Gremlin.load()
    def g=TinkerGraphFactory.createTinkerGraph()
    println g.v(5).as('x')
    .两者('已创建')
    .重复数据消除
    
    .loop(2){it.loops这是我目前的解决方案。这是一项正在进行的工作,因此我非常乐意得到改进和建议。(当然可以使用Gremlin语法对其进行优化?)

    假设:我们得到了一个开始节点

    Gremlin.load()
    def g=TinkerGraphFactory.createTinkerGraph()
    def startV=g.v(5)
    def seen=[startV]//已看到顶点的列表
    startV.as('x'))
    .两者('已创建')
    .filter{//仅遍历“未看见”的顶点
    def unseen=!seen.contains(它)
    如果(看不见){
    
    您不需要任何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]
    

    这是否意味着您不想在遍历过程中已经访问过的顶点上行走?@D.Mill,我不介意使用哪种方法来获取一组连接的节点。不过,听起来合乎逻辑(取决于您的方法),您不想两次遍历同一个顶点(以避免无限循环)你能解释一下为什么
    循环('x'){true}{true}
    不会无限循环吗?我读过文档,但不明白你的循环是如何工作的……如果没有剩下的路径,它就不能循环(引擎盖下抛出一个FastNoTouchElementException)。
    中的
    .dedup()
    。两者都有('created').dedup()
    确保无路径被遍历两次。这真是太酷了。我加入了一个循环
    g.v(6)。addEdge('created',g.v(4))
    ,它甚至没有闪烁。很好的解决方案。