我正在尝试使用 Gremlin 进行广度优先枚举,但是我无法找到一种方法来输出枚举期间观察到的所有步骤。我只能打印出最后一次迭代的结果。
我的问题是,给定这样的起始节点,我如何使用 Gremlin 跟踪所有路径(不知道整体深度)并打印出我一路上找到的所有内容?
study=g.v('myId')
我尝试过分散方法,循环方法(尽管如果我理解正确,两者似乎都需要事先了解路径的实际长度)
非常感谢!
我正在尝试使用 Gremlin 进行广度优先枚举,但是我无法找到一种方法来输出枚举期间观察到的所有步骤。我只能打印出最后一次迭代的结果。
我的问题是,给定这样的起始节点,我如何使用 Gremlin 跟踪所有路径(不知道整体深度)并打印出我一路上找到的所有内容?
study=g.v('myId')
我尝试过分散方法,循环方法(尽管如果我理解正确,两者似乎都需要事先了解路径的实际长度)
非常感谢!
您没有提供任何重要的代码来显示您如何使用循环,但我认为使用正确的参数您可以让它做您想做的事情:
gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.v(1).as('x').out.gather.scatter.loop('x'){true}{true}
==>v[2]
==>v[4]
==>v[3]
==>v[5]
==>v[3]
我假设您通过收集/分散和指向返回的循环的第一部分来理解代码x
。所以,考虑到这个假设,我将关注传递给循环的两个闭包。
传递给循环的第一个闭包告诉 Gremlin 何时跳出循环。通过简单地返回 true,您是在说耗尽循环。根据图表的结构,这可能是不可取的,因为您可能要等待很长时间才能返回结果。至少您应该考虑将其设置为不可能的高值,这样如果您确实在图中遇到了某个循环,您的遍历就会中断。
第二个闭包被称为“发射闭包”。您可以在此处阅读有关它的更多信息,但基本上它确定是否应返回管道中的中间对象(不仅仅是循环末尾的对象)。在这种情况下,您可以看到我只是将该值设置为,true
以便它会在循环的所有步骤中发出所有对象。