我正处于学习gremlin的早期阶段,因此我开始了一个使用gremlin的OrientDB (启用了修补程序)的项目。我得到了下面的顶点
团队、客户、人员、技术
所有的意图和目的都只是与团队、客户和技术一起工作。
团队支持客户,客户实现技术。因此,这个问题的模式如下所示
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()发布于 2019-04-17 19:55:54
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)发布于 2019-04-17 23:07:35
由于问题主要是关于排序的,我认为Stephen完美地回答了这个问题;但是,我认为我更喜欢以下问题:
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)https://stackoverflow.com/questions/55658546
复制相似问题