Neo4j Cypher查询需求:获取同市人员及目标人员所有居住城市
解决方案
要实现获取与指定人员p同住过至少一个城市的所有人员p1,同时返回p居住过的所有城市名称,可以分两步匹配:
- 先匹配并收集
p的所有居住城市 - 再匹配所有与
p有共同居住城市的p1,并关联第一步收集的城市列表
对应的Cypher查询如下:
// 第一步:获取p的所有居住城市集合 MATCH (p:Person)-[:LIVED_IN]->(c:City) WHERE p.id = 0 WITH p, collect(DISTINCT c.name) AS all_p_cities // 第二步:匹配所有和p有共同居住城市的p1 MATCH (p)-[:LIVED_IN]->(:City)<-[:LIVED_IN]-(p1:Person) // 可选:排除p自己,根据实际需求决定是否保留这行 WHERE p1 <> p // 返回结果,DISTINCT确保同一个p1只出现一次 RETURN DISTINCT p1, all_p_cities
说明
- 第一步通过
WITH将p的所有城市集合传递到下一个匹配阶段,彻底避免了原查询只返回共同居住城市的问题 RETURN中的DISTINCT是为了避免同一个p1因和p在多个城市居住过而重复出现- 如果不需要排除
p自己,直接删除WHERE p1 <> p这一行即可
内容的提问来源于stack exchange,提问作者lazycoder
相关产品推荐
相关产品推荐

