[英]Gremlin query: How to AND & OR relations?
比如说,我有 A、B、C 或 D 类型的边。
如何在这些边类型上使用 AND 和 OR 遍历?
假设我想通过 ( in(A) AND out(B) ) OR ( both(C) AND out(D) ) 从节点 X 遍历
我期望的结果是所有节点都至少有一条通往 X 的 A 边和至少一条来自 X 的 B 边,或至少有一条来自 X 或到达 X 的 C 边和至少一条 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
行为或继续使用union
则可以将查询包装在or
步骤中,如果您确实想要与您的约束匹配的所有结果。
我想到了!
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.