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

时间:2015-05-15 18:14:23

标签: neo4j cypher

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

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

因此,我们可以使用此方法获得job.status计数的非常有效的查询。

pip install python-igraph

这将为我们提供一行Set.Description,Job.Status和JobStatus计数。但是我们将根据Job.Status为Set获取多行。但这不利于对不同集合进行分页。类似的东西:

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

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

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

然后,这将允许我们使用跳过和限制正确地对集合进行分页。

我尝试了很多不同的方法,似乎找不到适合这种结果的组合。有人有主意吗?谢谢!

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用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]);