繁体   English   中英

Gremlin 查询:如何 AND & OR 关系?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM