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]);
我正在努力获得既高效又允许通过跳过和限制进行分页的正确密码。
这是一个简单的场景:我有相关节点 (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]);