Cypher查询丢失Employment键值对问题及解决方法咨询
Cypher查询中Employment键值对丢失原因及解决方法
问题场景
我编写了如下Cypher查询:
WITH {} as ceNodeIds WITH ceNodeIds {`Employment`: [6, 7, 8]} WITH ceNodeIds MATCH (root3:Location ) WHERE root3.id IN ([1, 2, 3]) WITH ceNodeIds, root3 OPTIONAL MATCH (root3)-[:CONTAINS*0..]->(descendant3:Location) OPTIONAL MATCH (ascendant3:Location)-[:CONTAINS*0..]->(root3) WITH ceNodeIds, COLLECT(root3.id) AS listRoot3, COLLECT( DISTINCT ascendant3.id) AS listAscendant3, COLLECT( DISTINCT descendant3.id) AS listDescendant3 WITH ceNodeIds {`Location`: apoc.coll.union(listDescendant3, apoc.coll.union(listRoot3, listAscendant3))} WITH ceNodeIds RETURN ceNodeIds
预期返回包含两个键值对的Map对象:
"Employment": [6, 7, 8] "Location": [1, 2, 3, 4, 5]
但实际仅返回:
"Location": [1, 2, 3, 4, 5]
原因分析
Employment键值对丢失的核心原因是:
- Cypher中
ceNodeIds {Location: ...}的语法是创建全新的Map对象,而非在原Map上追加键值。这行代码会完全丢弃原ceNodeIds中的所有已有键(包括Employment),仅保留新定义的Location键,导致之前的Employment数据被覆盖。
正确实现方式
要保留原Map的所有键并新增Location,需使用Map合并运算符+,将原Map与新键的Map合并。修改后的查询如下:
WITH {} as ceNodeIds WITH ceNodeIds {`Employment`: [6, 7, 8]} WITH ceNodeIds MATCH (root3:Location ) WHERE root3.id IN ([1, 2, 3]) WITH ceNodeIds, root3 OPTIONAL MATCH (root3)-[:CONTAINS*0..]->(descendant3:Location) OPTIONAL MATCH (ascendant3:Location)-[:CONTAINS*0..]->(root3) WITH ceNodeIds, COLLECT(root3.id) AS listRoot3, COLLECT(DISTINCT ascendant3.id) AS listAscendant3, COLLECT(DISTINCT descendant3.id) AS listDescendant3 -- 用+合并原Map与新键,保留原有Employment WITH ceNodeIds + {`Location`: apoc.coll.union(listDescendant3, apoc.coll.union(listRoot3, listAscendant3))} AS ceNodeIds RETURN ceNodeIds
另外,原查询中WITH ceNodeIds, root3 OPTIONAL的写法存在语法歧义,建议将OPTIONAL单独放在MATCH前,避免解析错误。
内容的提问来源于stack exchange,提问作者alexanoid
相关产品推荐
相关产品推荐

