Gremlin:针对多个连接垂直面的分组问题
我正处于学习gremlin的早期阶段,因此我正在使用gremlin启动OrientDB tinkerpop中的一个项目。我有以下顶点 团队 客户 人 技术 无论出于何种目的,我们只与团队、客户和技术合作 团队支持客户,客户实施技术。因此,此问题的模式如下所示 Vertexlabel:team->Edgelabel:supports->Vertexlabel:client->Edgelabel:has_implemented->Vertexlabel:technology 每个客户机将只由一个团队支持,但技术可以用于我的多个客户机 我试图通过检查每个团队所支持的客户机以及这些客户机正在使用的技术,得到他们所支持的技术的数量 使用下面的代码,我能够获得每个团队编号和技术的计数,但我无法按计数降序排序。我已经看过了stack exchange上的其他分组示例,我认为select出现了问题,但我不确定应该做什么Gremlin:针对多个连接垂直面的分组问题,gremlin,Gremlin,我正处于学习gremlin的早期阶段,因此我正在使用gremlin启动OrientDB tinkerpop中的一个项目。我有以下顶点 团队 客户 人 技术 无论出于何种目的,我们只与团队、客户和技术合作 团队支持客户,客户实施技术。因此,此问题的模式如下所示 Vertexlabel:team->Edgelabel:supports->Vertexlabel:client->Edgelabel:has_implemented->Vertexlabel:technology 每个客户机将只由一个团队
g.V().hasLabel('team').as('a').out('supports').out('has_implemented').as('b').select('a','b').by('teamnumber').by('name').groupCount().as('count').unfold()
groupCount步骤返回一个映射。您可以使用order按映射的值进行排序-以下操作应该有效:
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)
因为问题主要是关于订购,我认为斯蒂芬回答得很好;但是,我想我更喜欢以下查询:
g.V().hasLabel('team').
project('team','technologies').
by('teamnumber').
by(out('supports').
out('has_implemented').
groupCount().
by('name').
order(local).
by(values, desc))
因为它不需要路径跟踪,所以它应该运行得更快,占用的内存更少
另外,我不确定你是否真的关心技术名称。只有当多个客户端使用相同的技术时,上面查询中的组计数才有意义。然后,结果可能会告诉您一些事情,比如团队X支持技术Y,而Z的客户端使用了技术Y。也许您只想知道每个团队支持多少独特的技术,那么查询就更容易了:
g.V().hasLabel('team').
project('team','technologies').
by('teamnumber').
by(out('supports').
out('has_implemented').
dedup().count()).
order().
by(select('technologies'), desc)