格林姆林:针对多个关联顶点进行分组的问题

时间:2019-04-12 19:47:50

标签: gremlin

我正处于学习gremlin的早期阶段,因此我从使用gremlin的OrientDB(启用了tinkerpop)的项目开始。我有以下顶点

团队 客户 人 技术

出于所有目的和目的,它们仅与团队,客户和技术合作。

团队支持客户,客户实施技术。因此,此问题的架构如下所示:

Vertex(label:team)-> Edge(label:supports)-> Vertex(label:client)-> Edge(label:has_implemented)-> Vertex(label:technology)

每个客户只能由一个团队支持,但是我的多个客户可以使用技术。

我想要获得的是每个团队通过检查他们所支持的客户以及这些客户正在使用的技术所支持的技术。

使用下面的代码,我可以获得每个团队编号和技术的计数,但是我无法按计数编号降序进行排序。我看过其他有关堆栈交换的分组示例,但我认为select()出现了问题,但是我不确定应该怎么做。

g.V().hasLabel('team').as('a').out('supports').out('has_implemented').as('b').select('a','b').by('teamnumber').by('name').groupCount().as('count').unfold()

2 个答案:

答案 0 :(得分:1)

groupCount()步骤返回一个Map。您可以使用order()来按Map的值进行排序-应该可以进行以下操作:

g.V().hasLabel('team').as('a').
  out('supports'). 
  out('has_implemented').as('b').
  select('a','b').
    by('teamnumber').
    by('name').
  groupCount().
  order(local).
    by(values,desc)

我认为您可以简化查询并获得相同的结果,因为您希望每个“团队”的“技术”数量(您不对“客户”说什么):

g.V().hasLabel('team').as('a').
  out('supports'). 
  out('has_implemented').
  groupCount().
    by(select('a')).
  order(local).
    by(values,desc)

答案 1 :(得分:0)

由于问题主要是关于订购,我认为斯蒂芬完美地回答了这一点;但是,我想我希望使用以下查询:

g.V().hasLabel('team').
  project('team','technologies').
    by('teamnumber').
    by(out('supports').
       out('has_implemented').
       groupCount().
         by('name').
       order(local).
         by(values, desc))

仅仅因为它不需要路径跟踪(因此它应该运行得更快并且使用更少的内存)。

此外,我不确定您是否真的在乎技术名称。上面的查询中的组计数只有在多个客户端使用相同的技术时才有意义(然后结果可以告诉您“ Team X支持其客户端Z所使用的技术Y”)。也许您只想知道每个团队支持多少种独特技术,那么查询将更加容易:

g.V().hasLabel('team').
  project('team','technologies').
    by('teamnumber').
    by(out('supports').
       out('has_implemented').
       dedup().count()).
  order().
    by(select('technologies'), desc)