Neo4j Cypher含UNWIND子句时,如何筛选计数大于1的行?
解决Cypher中UNWIND后实现SQL HAVING效果的问题
我明白你的问题所在了——你修改后的查询没返回结果,核心原因是分组时机和分组键选错了!
你原来的修改是在UNWIND之后直接用WITH t, COUNT(DISTINCT(t.propThree)) AS num,这时候Cypher会把每一条t记录单独作为一个分组,所以每条分组里的propThree自然只有1个不同值,num永远是1,WHERE num > 1自然过滤掉了所有结果。
要实现你想要的“仅保留计数大于1的行”,你需要先按t.propTwo进行分组统计,再对统计结果做过滤。具体修改如下:
MATCH (a:MyNode)-[:SOME_RELATIONSHIP]->()<-[:SOME_RELATIONSHIP]-(b:MyNode {prop: 'value'}) WHERE a.prop<>'value' WITH collect(b) AS excluded MATCH (m:MyNode {prop: 'value'}) WITH excluded, COLLECT(m) AS superset UNWIND [n IN superset WHERE NOT n IN excluded] AS t -- 先按propTwo分组,统计每个组内不同propThree的数量 WITH t.propTwo AS propTwo, COUNT(DISTINCT t.propThree) AS num -- 过滤数量大于1的分组 WHERE num > 1 RETURN propTwo, num
逻辑说明:
- 前半部分和你原查询一致,先筛选出符合条件的
t集合; - 关键修改:用
t.propTwo作为分组键,对所有相同propTwo的t记录聚合,计算该组内不同propThree的总数; - 最后通过
WHERE num > 1过滤掉计数为1的分组,只保留你需要的结果。
这样就能得到你想要的“仅计数大于1的行”了。
内容的提问来源于stack exchange,提问作者smacdav
相关产品推荐
相关产品推荐

