通过边缘标签过滤Gremlin遍历

时间:2018-10-17 18:11:07

标签: gremlin tinkerpop

我正在尝试使用Gremlin从起始节点向外遍历连接度为 X 的所有已连接节点。连接的方向无关紧要,所以我正在使用both()函数。我还希望能够防止遍历与特定标签的边缘交叉。这是一个示例图。

gremlin> g.addV().property(id,1).as('1').
......1>   addV().property(id,2).as('2').
......2>   addV().property(id,3).as('3').
......3>   addV().property(id,4).as('4').
......4>   addV().property(id,5).as('5').
......5>   addV().property(id,6).as('6').
......6>   addV().property(id,7).as('7').
......7>   addE('edge1').from('1').to('2').
......8>   addE('edge2').from('1').to('3').
......9>   addE('edge2').from('2').to('4').
.....10>   addE('edge3').from('3').to('5').
.....11>   addE('edge3').from('4').to('6').
.....12>   addE('edge4').from('7').to('6').iterate()

到目前为止,我的遍历看起来像这样:

gremlin> g.V(1).
......1>   repeat(both().filter(not(inE('edge3')))).
......2>   times(4).
......3>   emit().
......4>   simplePath().
......5>   dedup()

但是,这并不是我想要的。我想要某种东西,如果它必须穿过指定的边缘,它将实际上阻止遍历器碰到顶点。我当前的实现对具有传入边的顶点进行过滤,但是在某些情况下,如果遍历器越过另一条边到达顶点,我仍然希望该顶点出现在结果中。

这有意义吗?简而言之,我试图专门过滤边缘而不是顶点与其边缘的关系。

1 个答案:

答案 0 :(得分:1)

我想我遵循了你的意思,难道不能只使用bothE()并在遍历它们时过滤那些边缘吗?

gremlin> g.V(1).
......1>   repeat(bothE().not(hasLabel('edge3')).otherV()).
......2>     times(4).
......3>     emit().
......4>   simplePath().
......5>   dedup()
==>v[2]
==>v[3]
==>v[4]