Gremlin 按多个属性分组

Gremlin group by on multiple properties

我可以通过查询单个顶点 属性 来编写 aggregation/group。 以下查询在检索数据时包含 ACL 评估,您在回答问题时可以忽略这些数据。

 g.V().has('user','userId',123).emit().until(__.not(outE('member_of'))).repeat(out('member_of')).outE('has_permission').has('permission','view').inV().as('f').select('f').group().by('folderType').by(count())

这给了我以下结果

==>[PROJECT:2,RegularFolder:4,ORGANISATION:7,DIVISION:4]

就像 folderType 一样,文件夹顶点有多个属性。

期望是像elasticsearch聚合查询结果。

"folderType":[PROJECT:2,RegularFolder:4,ORGANISATION:7,DIVISION:4]
"CreatedBy":[user1:2,user2:4,user3:7,user4:4]

如何编写给出上述结果并接近预期的 gremlin 查询。

我知道你说过要忽略你的初始查询,但我忍不住重写为:

g.V().has('user','userId',123).
  emit().
  until(__.not(outE('member_of'))).
  repeat(out('member_of')).
  outE('has_permission').has('permission','view').inV().
  groupCount().
    by('folderType')

因为不需要 "f" 的步骤标签,在这种情况下使用 groupCount() 更精确。如果您需要 groupCount() 多个属性,我想可能有几种方法,但在您描述的这种情况下,我认为最简单的方法是计算两个 groupCount() 副作用,然后 cap() 他们两个一起出来:

g.V().has('user','userId',123).
  emit().
  until(__.not(outE('member_of'))).
  repeat(out('member_of')).
  outE('has_permission').has('permission','view').inV().
  groupCount('folderType').
    by('folderType').
  groupCount('CreatedBy').
    by('CreatedBy').
  cap('folderType','CreatedBy')