问题描述
例如,我的边缘具有A,B,C或D类型。
如何在这些边沿类型上使用AND和OR遍历?
说我想通过(in(A)AND out(B))或(both(C)AND out(D))从节点X遍历
我期望的结果是所有具有至少一个A边的X边和至少一个B边的X边或至少一个C边或X边或至少一个D边的节点-来自X的边缘。
在一般情况下,我如何编写Gremlin查询来做到这一点?非常感谢您的帮助!
解决方法
使用这个简单的图形
g.addV('1').as('1').
addV('2').as('2').
addV('3').as('3').
addV('4').as('4').
addV('5').as('5').
addE('B').from('2').to('3').
addE('A').from('3').to('2')
您的初始match
步骤
gremlin> g.V().
......1> match(
......2> __.as('1').in('A').as('2'),......3> __.as('1').out('B').as('2')).
......4> select('2').by(label)
==>3
可以简化为
gremlin> g.V().as('1').out('B').filter(out('A').as('1')).label()
==>3
仅注意使用out
个步骤。第一个将您带到任何相邻的顶点。第二个,位于过滤器内部,用于查看是否有返回您来自何处的方法(从当前顶点的角度来看,这是另一种out
关系)。
您可以使用相同的模式来替换其他match
。如果您确实想要or
的行为,则可以将查询包裹在or
步骤中;如果您确实想要所有符合约束的结果,则继续使用union
。
我知道了!
g.V().union(
// in(A) AND out(B)
match(
__.as('1').in('A').as('2'),__.as('1').out('B').as('2'))
.select('2'),// OR
// both(C) AND out(D)
match(
__.as('1').both('C').as('2'),__.as('1').out('D').as('2'))
.select('2'))
// Delete duplicates
.dedup()