如何返回两个独立的DISTINCT列表?现有查询出现重复问题
问题分析与解决
你的代码问题在于两次UNWIND会生成两个列表的笛卡尔积,后续的DISTINCT是对listElement和listElement2的组合去重,而非单独对每个列表的元素去重。
比如原列表list去重后是[1,2,3],list2去重后是[1,2,3,4,5,6,7],两次UNWIND会生成3×7=21条配对记录,DISTINCT只是去掉重复的配对(比如(1,2)多次出现会保留一次),但每个listElement依然会和多个listElement2关联,最终collect时自然会重复收集同一个listElement。
正确解法
方法1:分步处理每个列表的去重
通过分步UNWIND和DISTINCT,分别处理两个列表:
WITH [1,1,1,2,2,3] AS list, [2,3,4,5,6,7,1,2,1] AS list2 // 处理第一个列表的去重 UNWIND list AS elem1 WITH DISTINCT elem1, list2 COLLECT(elem1) AS distinctElements, list2 // 处理第二个列表的去重 UNWIND list2 AS elem2 WITH distinctElements, DISTINCT elem2 RETURN distinctElements, COLLECT(elem2) AS distinctElements2;
方法2:使用列表推导式(Neo4j 4.0+支持)
这种写法更简洁,直接通过列表推导式加DISTINCT实现去重:
WITH [1,1,1,2,2,3] AS list, [2,3,4,5,6,7,1,2,1] AS list2 RETURN [elem IN list | elem][DISTINCT] AS distinctElements, [elem IN list2 | elem][DISTINCT] AS distinctElements2;
两种方法都会返回你想要的结果:
distinctElements: [1,2,3] distinctElements2: [1,2,3,4,5,6,7]
内容的提问来源于stack exchange,提问作者KWriter
相关产品推荐
相关产品推荐

