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