Cypher查询执行差异:两种MATCH语句结果为何数量不同?
Cypher查询
MATCH (a)<--(b)-->(c)与MATCH (a)<--(b) MATCH (b)-->(c)结果差异原因 这两个查询的核心差异在于对重复匹配行的处理逻辑,以及查询执行时的路径匹配方式:
MATCH (a)<--(b)-->(c)是单一模式匹配,Neo4j会遍历所有满足“b同时拥有入边来自a、出边指向c”的节点-关系组合。只要是符合模式的独立路径(即使节点三元组(a,b,c)相同,但关联的关系不同),都会被作为独立结果返回。比如:- 若b有2条入边来自同一个a,同时有1条出边指向c,这个模式会生成2条结果行,每条对应不同的入边。
MATCH (a)<--(b) MATCH (b)-->(c)是两个连续的MATCH子句,Neo4j会先获取所有(a,b)对,再对每个b获取对应的(b,c)对并组合。这里的问题在于,当同一个(a,b)对因多条重复关系被多次匹配时,后续与(b,c)组合会生成大量重复的(a,b,c)行。如果统计的是去重后的不同结果,这些重复行被合并,最终数量会少于单模式匹配的结果(因为单模式匹配的“不同结果”包含了基于不同关系的重复节点组合)。
举个简单例子:
假设节点A有2条边指向B,B有1条边指向C:
- 单模式查询会返回2条
(A,B,C)结果(对应2条A→B的关系),算作2条不同结果。 - 多MATCH查询同样会返回2条
(A,B,C)结果,但如果对结果去重,就只剩1条不同结果。
如果要让两者返回的去重结果一致,只需在两个查询中都添加DISTINCT关键字:
MATCH (a)<--(b)-->(c) RETURN DISTINCT a,b,c
MATCH (a)<--(b) MATCH (b)-->(c) RETURN DISTINCT a,b,c
内容的提问来源于stack exchange,提问作者MPesi
相关产品推荐
相关产品推荐

