Neo4j Cypher查询:查找与指定节点共享至少n个关联节点的实现方法
错误原因排查
- 聚合函数(
count()/sum()等)属于分组统计操作,不能直接在MATCH后的WHERE子句中使用,WHERE仅用于过滤单条匹配记录,分组后的过滤需要在统计完成后执行。 - 第二次尝试的WITH子句携带了
m节点,相当于按「Tom Hanks、合作演员、单部电影」三个维度分组,每个分组仅对应1部电影,count(m)结果恒为1,因此无符合条件的结果。 - 第三次查询可以正常统计的核心是分组维度正确:仅按
p2(合作演员)分组统计共同电影数,只需调整返回字段和后续关联逻辑,就能拿到完整节点。
正确Cypher查询
写法1:一次匹配完成,支持两种返回格式
MATCH (p1:Person {name: "Tom Hanks"})-->(m:Movie)<--(p2:Person) // 按合作演员分组,收集所有共同电影 WITH p2, collect(m) AS co_movies // 过滤合作次数≥3的演员 WHERE size(co_movies) >= 3 // --- 以下二选一,根据你需要的返回格式调整 --- // 格式1:每行返回1个符合条件的演员 + 所有合作电影的数组 // RETURN p2, co_movies // 格式2:每行返回1个符合条件的演员 + 1部合作电影(和你最初预期的返回结构一致) UNWIND co_movies AS m RETURN p2, m
写法2:先过滤符合条件的演员再关联电影(适合数据量更大的场景)
// 第一步:筛选出合作≥3次的演员 MATCH (p1:Person {name: "Tom Hanks"})-->(m:Movie)<--(p2:Person) WITH p2, count(m) AS common_count WHERE common_count >= 3 // 第二步:关联查询这些演员和Tom Hanks的所有合作电影 MATCH (p1:Person {name: "Tom Hanks"})-->(m:Movie)<--(p2) RETURN p2, m
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

