如何用Cypher查询Neo4j中两组特定路径的交集?
嘿,我知道你卡在哪了——你之前重复用MATCH p=...的方式会直接覆盖掉第一个p变量,根本没法对比两组路径的交集。我给你几个实用的解决方案,看哪种符合你的需求:
方法1:对比两个独立路径集合的完全交集
如果你的目标是找出完全相同的路径,同时出现在两组不同条件的路径集合里(比如一组是group=10的2步路径,另一组是group=20的2步路径),可以先分别收集两组路径,再找它们的交集:
-- 第一步:收集第一组路径(比如group=10的节点间2步路径) MATCH p1=(g:Node)-[:FOLLOWED_BY *2..2]->(g2:Node) WHERE g.group = 10 AND g2.group = 10 WITH collect(p1) AS group10Paths -- 第二步:收集第二组路径,然后筛选出同时存在于第一组的路径 MATCH p2=(g3:Node)-[:FOLLOWED_BY *2..2]->(g4:Node) WHERE g3.group = 20 AND g4.group = 20 WITH group10Paths, collect(p2) AS group20Paths -- 展开第一组路径,找出在第二组里的共同路径 UNWIND group10Paths AS sharedPath WHERE sharedPath IN group20Paths RETURN sharedPath
方法2:直接匹配同时满足双条件的路径(更高效)
如果你的两组路径的条件可以合并(比如路径需要同时满足group=10和另一组的条件),直接在WHERE子句里组合条件就行,不用额外收集集合:
比如,如果你要找的路径既是group=10节点间的2步路径,又是group=20节点间的2步路径(也就是起始和结束节点同时属于这两个分组):
MATCH p=(g:Node)-[:FOLLOWED_BY *2..2]->(g2:Node) WHERE g.group = 10 AND g2.group = 10 AND g.group = 20 AND g2.group = 20 RETURN p
额外情况:如果交集指的是路径共享节点
要是你要的不是完全相同的路径,而是两组路径中存在公共节点的路径对,那可以这么写:
MATCH p1=(g1:Node)-[:FOLLOWED_BY *2..2]->(g2:Node) WHERE g1.group=10 AND g2.group=10 MATCH p2=(g3:Node)-[:FOLLOWED_BY *2..2]->(g4:Node) WHERE g3.group=20 AND g4.group=20 -- 检查两条路径是否有至少一个公共节点 WHERE ANY(node IN nodes(p1) WHERE node IN nodes(p2)) RETURN p1, p2
内容的提问来源于stack exchange,提问作者insalada
相关产品推荐
相关产品推荐

