我有一个图表:
CREATE (c1:Contract { id: "V-9087-4321" }),
(c2:Contract { id: "V-8046-2304" }),
(p:Partner {id: "C-4837-4536"}),
(p)-[:POLICY_HOLER]->(c1),
(p)-[:POLICY_HOLER]->(c2)
MATCH (p:Partner) WHERE p.id = "C-4837-4536"
CREATE (c:Claim { id: "ef70", date: "2019-04-27" }),
(p)-[:CLAIMANT {on: "2019-04-27"}]->(c)
MATCH (p:Partner) WHERE p.id = "C-4837-4536"
CREATE (c:Claim { id: "ab90", date: "2019-04-28" }),
(p)-[:CLAIMANT {on: "2019-04-28"}]->(c)
我想找到4月1日之后有多个索赔的所有合作伙伴:
我试过这个:
MATCH (claim:Claim)<-[r:CLAIMANT]-(p:Partner)
WITH count(r) as cnt, p, claim
WHERE cnt > 1 AND claim.date > '2019-04-01'
RETURN cnt, p.id
它不起作用,因为(如果我删除了where子句),它返回两个声明,每个声明都使用cnt=1
,而不是实际聚合它们。我已经尝试选择基于claim.date
以及r.on
。
如何用Cypher完成这项工作?
@cybersam很好地解释了聚合函数。我建议查看他们的答案,以了解聚合函数的工作原理。但他们的查询并未根据计数过滤索赔。
您可以使用以下查询查找4月1日之后拥有多个声明的所有合作伙伴:
MATCH (claim:Claim)<-[r:CLAIMANT]-(p:Partner)
WHERE claim.date > '2019-04-01'
WITH count(r) as cnt, p
WHERE cnt > 1
RETURN cnt, p.id
neo4j aggregating functions(如COUNT()
)在同一个WITH
或RETURN
子句中使用非聚合术语作为“分组键”。
在您的示例的WITH
子句中,分组键是p
和claim
,因此COUNT()
函数计算每个不同的r
和p
对之间的claim
关系的数量(因此计数将始终为1)。你真正想要的是每个r
的p
关系的数量。
假设每个Partner
节点都有一个唯一的id
,您可以使用此简化查询找到4月1日之后拥有多个声明的所有合作伙伴:
MATCH (claim:Claim)<-[:CLAIMANT]-(p:Partner)
WHERE claim.date > '2019-04-01'
RETURN COUNT(claim) AS cnt, p.id
如果您还想返回每个匹配合作伙伴的所有声明的列表:
MATCH (claim:Claim)<-[:CLAIMANT]-(p:Partner)
WHERE claim.date > '2019-04-01'
RETURN COUNT(claim) AS cnt, COLLECT(claim) AS claims, p.id
此外,更快的搜索你应该在index上创建uniqueness constraint或:Claim(date)
。