为何第二个列表为空时Neo4j查询无返回结果?
Neo4j UNWIND空列表的行为解析
这是有意设计的,不是Bug,核心原因和UNWIND的工作机制直接相关:
- UNWIND的本质是把列表拆分成多行记录,如果传入的是空列表,这一步会直接生成0行数据。
- 拆解你的查询流程:
- 当第一个列表为
[]时:UNWIND空列表得到0行,collect(a)对空集聚合会返回[],后续流程能正常推进,最终得到la=[], lb=[4,5,6]。 - 当第二个列表为
[]时:前面的流程生成1行数据(la=[1,2,3]),但UNWIND空列表会把这1行直接变成0行,后面的WITH和RETURN没有数据可处理,自然就没有返回结果。
- 当第一个列表为
用子查询可以规避这个问题,因为子查询会独立处理每个列表的聚合,即使列表为空也会返回对应的空集合:
WITH [1,2,3] AS listA, [] AS listB CALL { WITH listA UNWIND listA AS a RETURN collect(a) AS la } CALL { WITH listB UNWIND listB AS b RETURN collect(b) AS lb } RETURN la, lb
执行这段查询就能得到la=[1,2,3], lb=[]的结果。
内容的提问来源于stack exchange,提问作者AFatNiBBa
相关产品推荐
相关产品推荐

