Gremlin simplePath()不能在循环中工作

时间:2014-12-15 00:06:46

标签: graph-databases titan gremlin

我正在尝试编写DAG遍历,说明实际上可能存在循环(坏数据等)的可能性。所以在toy graph

gg = TinkerGraphFactory.createTinkerGraph()  
gg.v(2).addEdge('knows', gg.v(4))
gg.v(4).addEdge('knows', gg.v(3))

我这样做:

gg.v(1).as('x').out('knows').loop('x'){it.object.out('knows').hasNext()}{true}

获得预期结果:

==>v[2]
==>v[4]
==>v[3]

现在我添加一个循环:

gg.v(3).addEdge('knows', gg.v(1))

为了让它枚举所有找到的顶点而不会永远循环,我这样做:

gg.v(1).as('x').out('knows').simplePath.loop('x'}{it.object.out('knows').simplePath.hasNext()}{true}[0..10].path

我明白了:

==>[v[1], v[2]]
==>[v[1], v[4]]
==>[v[1], v[2], v[4]]
==>[v[1], v[4], v[3]]
==>[v[1], v[2], v[4], v[3]]
==>[v[1], v[4], v[3], v[1]]
==>[v[1], v[2], v[4], v[3], v[1]]
==>[v[1], v[4], v[3], v[1], v[2]]
==>[v[1], v[4], v[3], v[1], v[4]]
==>[v[1], v[2], v[4], v[3], v[1], v[2]]
==>[v[1], v[2], v[4], v[3], v[1], v[4]]

因此没有消除循环,并且simplePath()什么也没做,它允许循环继续,即使有一个循环。请注意,如果图片中没有循环,它可以正常工作:

gg.v(1).out('knows').out('knows').out('knows').out('knows').out('knows').simplePath.path

这会产生空结果。所以我的问题是 - 这里有什么问题?如果simplePath不起作用,为什么不消除循环以及如何在没有循环的情况下进行遍历?我可能会尝试用副作用手动跟踪被访问的顶点,但我希望Gremlin为我做遍历......那么正确的方法是什么?

1 个答案:

答案 0 :(得分:3)

我想这就是你要找的东西:

gremlin> g.v(1).as("x").dedup().out("knows").loop("x") { it.object.out("knows").hasNext() } { true }.path()
==>[v[1], v[2]]
==>[v[1], v[4]]
==>[v[1], v[2], v[4]]
==>[v[1], v[4], v[3]]
==>[v[1], v[4], v[3], v[1]]
gremlin>
相关问题