Gremlin 查询:如何 AND & OR 关系?
Gremlin query: How to AND & OR relations?
例如,我有类型为 A、B、C 或 D 的边。
如何在这些边类型上使用 AND 和 OR 进行遍历?
假设我想从节点 X 遍历 ( in(A) AND out(B) ) 或 ( both(C) AND out(D) )
我期望的结果是所有节点都至少有一条通往 X 的 A 边和至少一条来自 X 的 B 边,或者至少有一条来自或通往 X 的 C 边并且至少一个从 X 出发的 D 边。
一般情况下,如何编写 Gremlin 查询来执行此操作?非常感谢您的帮助!
我想通了!
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()
使用这个简单的图表
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
。
例如,我有类型为 A、B、C 或 D 的边。
如何在这些边类型上使用 AND 和 OR 进行遍历?
假设我想从节点 X 遍历 ( in(A) AND out(B) ) 或 ( both(C) AND out(D) )
我期望的结果是所有节点都至少有一条通往 X 的 A 边和至少一条来自 X 的 B 边,或者至少有一条来自或通往 X 的 C 边并且至少一个从 X 出发的 D 边。
一般情况下,如何编写 Gremlin 查询来执行此操作?非常感谢您的帮助!
我想通了!
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()
使用这个简单的图表
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
。