过滤节点或关系属性时如何匹配Neo4j节点或关系计数

问题描述 投票:0回答:2

我有一个图表:

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完成这项工作?

neo4j cypher
2个回答
1
投票

@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

1
投票

neo4j aggregating functions(如COUNT())在同一个WITHRETURN子句中使用非聚合术语作为“分组键”。

在您的示例的WITH子句中,分组键是pclaim,因此COUNT()函数计算每个不同的rp对之间的claim关系的数量(因此计数将始终为1)。你真正想要的是每个rp关系的数量。

假设每个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)

© www.soinside.com 2019 - 2024. All rights reserved.