Cypher UNION应用于聚合列表失效问题及解决方法咨询
解决Cypher中UNION与聚合冲突的问题
你的问题出在先聚合再UNION:两个MATCH语句各自用collect()生成了单个列表行,UNION会把这两行合并返回,但你想要的是把两个列表里的元素合并成一个列表,而不是得到两个独立的列表行。
有两种直接的解决方式:
1. 先UNION合并记录,再统一聚合
这是最原生的方案,不需要依赖任何插件:
// 先获取第一个条件下的用户字段 MATCH (user:User)-[]-(org:Organization) WHERE org.size > 100 RETURN user.name, user.age // 合并第二个条件下的用户字段,UNION ALL保留重复,UNION自动去重 UNION ALL MATCH (user:User)-[]-(family:Family) WHERE family.mood = "Happy" RETURN user.name, user.age // 最后统一聚合所有记录成一个列表 WITH collect({name: user.name, age: user.age}) AS userList RETURN userList
- 用
UNION ALL:如果同一个用户同时满足两个条件,会在列表里出现两次 - 用
UNION:自动去重,同一个用户只会出现一次
2. 用APOC函数合并两个聚合列表(需安装APOC插件)
如果你的环境允许使用Neo4j的APOC库,可以直接合并两个已聚合的列表:
MATCH (user:User)-[]-(org:Organization) WHERE org.size > 100 WITH collect({name: user.name, age: user.age}) AS list1 MATCH (user:User)-[]-(family:Family) WHERE family.mood = "Happy" WITH list1, collect({name: user.name, age: user.age}) AS list2 // 合并两个列表,apoc.coll.union会自动去重,apoc.coll.unionAll保留重复 RETURN apoc.coll.union(list1, list2) AS userList
内容的提问来源于stack exchange,提问作者Jonathan Livni
相关产品推荐
相关产品推荐

