Java Gremlin中的广度优先枚举

Java Gremlin中的广度优先枚举,java,graph,breadth-first-search,gremlin,graph-traversal,Java,Graph,Breadth First Search,Gremlin,Graph Traversal,我试图让宽度优先枚举与Gremlin一起工作,但是我很难找到一种方法来输出枚举过程中观察到的所有步骤。我只能打印出上一次迭代的结果 我的问题是,给定这样一个起始节点,我如何使用Gremlin跟踪所有路径(不知道整体深度)并打印出沿途发现的所有内容 study=g.v('myId') 我尝试过分散法和循环法(尽管如果我理解正确,这两种方法似乎都需要事先了解路径的实际长度) 非常感谢 您没有提供任何重要的代码来说明如何使用循环,但我认为,通过正确的参数,您可以让它执行您想要的操作: gremlin

我试图让宽度优先枚举与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,您的意思是耗尽循环。根据图表的结构,这可能不可取,因为您可能需要等待很长时间才能返回结果。至少你应该考虑把它设置为不可能的高,这样如果你在图中碰到了一个循环,你的遍历就会中断。


第二个闭包称为“emit闭包”。您可以阅读更多关于它的内容,但基本上它决定是否应该返回管道中的中间对象(不仅仅是循环末尾的对象)。在本例中,您可以看到我只是将该值设置为
true
,这样它将在循环的所有步骤中发出所有对象。

您没有提供任何重要的代码来显示如何使用循环,但我认为使用正确的参数,您可以让它执行您想要的操作:

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,您的意思是耗尽循环。根据图表的结构,这可能不可取,因为您可能需要等待很长时间才能返回结果。至少你应该考虑把它设置为不可能的高,这样如果你在图中碰到了一个循环,你的遍历就会中断。


第二个闭包称为“emit闭包”。您可以阅读更多关于它的内容,但基本上它决定是否应该返回管道中的中间对象(不仅仅是循环末尾的对象)。在这种情况下,您可以看到我只是将该值设置为
true
,这样它将在循环的所有步骤中发射所有对象。

我认为在该循环中使用聚集/分散是多余的,因为循环中的管道是先计算宽度的:如果我想包括起始顶点v(1),该怎么办同样在结果中?我认为在这个循环中使用聚集/分散是多余的,因为循环中的管道是以宽度为先计算的:如果我想在结果中也包括起始顶点v(1),该怎么办?