微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Gremlin查询:如何建立AND&OR关系?

例如,我的边缘具有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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。