Neo4j Cypher - 如何使用 Cypher 有效地计算多个 属性 值并正确分页

Neo4j Cypher - How to Count Multiple Property Values With Cypher Efficiently And Paginate Properly

我正在努力获得既高效又允许通过跳过和限制进行分页的正确密码。

这是一个简单的场景:我有相关节点 (company)<-[A]-(set)<-[B]-(job) 其中有多个 (set) 实例与不同的 (job ) 与他们相关的实例。 (作业)节点具有特定状态 属性,可以保持多种状态之一。我们需要计算每个(集合)处于特定状态的(作业)节点的数量,并使用 skip 和 limit 对不同的(集合)节点进行分页。

所以我们可以使用这个非常有效地查询 job.status 计数。

match (c:Company {id: 'MY.co'})<-[:type_of]-(s:Set)<-[:job_for]-(j:Job) 
return s.Description, j.Status, count(*) as StatusCount;

这将为我们提供 Set.Description、Job.Status 和 JobStatus 计数的行。但是我们会根据 Job.Status 得到 Set 的多行。但是,这不利于在不同的集合上进行分页。类似于:

s.Description        j.Status       StatusCount
-------------------+--------------+----------------
Set 1              | Unassigned   | 10
Set 1              | Completed    | 2
Set 2              | Unassigned   | 3
Set 1              | Reviewed     | 10
Set 3              | Completed    | 4
Set 2              | Reviewed     | 7

我们试图用正确的密码实现的是基于不同集合的结果行。像这样:

s.Description        Unassigned      Completed    Reviewed
-------------------+--------------+-------------+----------
Set 1              | 10           | 2           | 10
Set 2              | 3            | 0           | 7
Set 3              | 0            | 4           | 0

这样我们就可以使用 skip 和 limit 正确地对集合进行分页。

我尝试了很多不同的方法,但似乎无法找到适合此类结果的正确组合。谁有想法?谢谢!

** 编辑 - 使用 MIchael 提供的答案,这里是如何获取 java 中的状态计数值 **

match (c:Company {id: 'MY.co'})<-[:type_of]-(s:Set)<-[:job_for]-(j:Job) 
with s, j.Status as Status,count(*) as StatusCount
return s.Description, collect({Status:Status,StatusCount:StatusCount]) as StatusCounts;


   List<Object> statusMaps =  (List<Object>) row.get("StatusCounts");
   for(Object statusEntry : statusMaps ) {
     Map<String,Object> statusMap = (Map<String,Object>) statusEntry;
     String status = (String) statusMap.get("Status");
     Number count = statusMap.get("StatusCount");
    }

您可以使用 WITH 和聚合,以及可选的地图结果

match (c:Company {id: 'MY.co'})<-[:type_of]-(s:Set)<-[:job_for]-(j:Job) 
with s, j.Status as Status,count(*) as StatusCount
return s.Description, collect([Status,StatusCount]);

match (c:Company {id: 'MY.co'})<-[:type_of]-(s:Set)<-[:job_for]-(j:Job) 
with s, j.Status as Status,count(*) as StatusCount
return s.Description, collect({Status:Status,StatusCount:StatusCount]);