如何用纯Cypher获取一组匹配节点间的所有关系?
纯Cypher实现多匹配节点间的所有关系查询
问题场景
你已经通过多个MATCH语句匹配了一组不同标签的节点:
MATCH (a:`SOME.LABEL.1` {...}) MATCH (b:`SOME.LABEL.2` {...}) MATCH (c:`SOME.LABEL.3` {...}) ... MATCH (z:`SOME.LABEL.n` {...})
需要获取这些节点之间的所有关系,但手动枚举所有节点组合的MATCH语句太过繁琐,想用纯Cypher替代APOC的apoc.algo.cover函数实现需求。
纯Cypher解决方案
核心是把所有匹配到的节点收集到一个集合,再匹配集合内节点间的关系,无需手动枚举组合:
// 先执行所有节点的匹配逻辑 MATCH (a:`SOME.LABEL.1` {...}) MATCH (b:`SOME.LABEL.2` {...}) MATCH (c:`SOME.LABEL.3` {...}) // ... 继续添加其他节点的MATCH语句 // 将所有节点存入一个集合 WITH [a, b, c, ..., z] AS nodes // 匹配集合内任意节点间的关系 MATCH (n1)-[r]-(n2) WHERE n1 IN nodes AND n2 IN nodes AND id(n1) < id(n2) // 可选:避免重复返回同一节点对的双向/无向关系 // 返回所有符合条件的关系 RETURN r
细节说明
- 用集合
nodes统一管理所有匹配到的节点,省去了手动编写所有节点组合的麻烦 id(n1) < id(n2)是可选条件:如果你的场景中需要保留双向有向关系(比如a→b和b→a都要),或者不介意无向关系被重复返回两次,可以删除这个条件- 如果只需要特定方向的关系,把
-[r]-替换为-[r]->(外向关系)或<-[r]-(内向关系)即可
内容的提问来源于stack exchange,提问作者Владислав Ветров
相关产品推荐
相关产品推荐

