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') 代码
)
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))
,它甚至没有闪烁。很好的解决方案。