如何在单个查询中遍历gremlin中的根顶点

时间:2018-02-13 13:44:35

标签: graph-databases gremlin amazon-neptune

我在亚马逊 - 海王星中使用Gremlin。我有顶点用户,国家,订单 我有优势和生活。从用户到国家,边缘购买'从用户到订单,边缘交付'从订单到国家

目标:找到向国外购买大部分订单的最顶级国家而不是按降序排列的live_in国家

gremlin> g.V().hasLabel("user").outE('purchased').inV().hasLabel("order"). 
......1> outE("delivered").inV().hasLabel("country").
......2> has('name').neq(outE('lives_in').inV().hasLabel("country").values()).
......3> groupCount().by(values)

我无法从步骤neq遍历到根顶点(outE(" lives_in"))
在删除最后一步后,我得到了相同的结果

gremlin> g.V().hasLabel("user").outE('purchased').inV().hasLabel("order").
......1> outE("delivered").inV().hasLabel("country")

这意味着我的最后一步没有执行。
结果样本 - {v [country_GB] = 38,v [country_NZ] = 6,v [country_AU] = 3}

1 个答案:

答案 0 :(得分:3)

在您的问题中包含这样的小样本图总是有帮助的:

g.addV('user').as('u1').
  addV('user').as('u2').
  addV('order').as('o1').
  addV('order').as('o2').
  addV('order').as('o3').
  addV('order').as('o4').
  addV('order').as('o5').
  addV('order').as('o6').
  addV('country').property('name','usa').as('usa').
  addV('country').property('name','candada').as('can').
  addV('country').property('name','mexico').as('mex').
  addE('lives_in').from('u1').to('usa').
  addE('lives_in').from('u2').to('mex').
  addE('purchased').from('u1').to('o1'). 
  addE('purchased').from('u1').to('o2').
  addE('purchased').from('u1').to('o3').
  addE('purchased').from('u1').to('o4').
  addE('purchased').from('u2').to('o5').
  addE('purchased').from('u2').to('o6').
  addE('delivered').from('o1').to('usa').
  addE('delivered').from('o2').to('mex').
  addE('delivered').from('o3').to('mex').
  addE('delivered').from('o4').to('can').
  addE('delivered').from('o5').to('mex').
  addE('delivered').from('o6').to('can').iterate()

基于此,您可以采用以下一种方式:

gremlin> g.V().hasLabel("user").as('u').
......1>   out('lives_in').hasLabel("country").as('c'). 
......2>   select('u').
......3>   out('purchased').hasLabel("order").
......4>   out("delivered").hasLabel("country").
......5>   where(neq('c')).
......6>   groupCount().
......7>     by('name')
==>[mexico:2,candada:2]

有几点需要注意:

  1. 如果您没有对边缘做任何事情,请分别将inE().outV()outE().inV()简化为in()out()
  2. 在标记为1的行上," lives_in"国家顶点被标记为以后与"交付"第5行的国家
  3. 结果不包括标有" o1"以及标有" o5"的顺序因为这两个订单都来自它们所运送的国家。