首页 > 解决方案 > 返回不同的组

问题描述

鉴于此查询:

match (store)-->(food1)-[:LIKE*]-(food2)<--(store)
return food1 + collect(distinct food2) as group

我得到这样的结果:

group
[orange, apple, banana],
[orange, banana, apple],
[apple, orange, banana],
[apple, banana, orange],
[banana, orange, apple],
[banana, apple, orange],
[melon, watermelon],
[watermelon, melon]

我预计只有 2 个组而不是 8 个。我怎样才能获得不同的组?

标签: neo4jcypher

解决方案


与 Cypher 的列表相等性包括顺序,因此最简单的方法是对列表进行排序,最好使用apoc.coll.sortNodes()APOC 程序,它允许在集合内排序,然后允许 DISTINCT 提供正确的结果。

也就是说,该查询存在一些问题需要修复。

首先,您应该使用标签,否则这会变成 AllNodesScan。:Store 和 :Food 标签可能应该被使用。关系通常也很重要,因此请尽可能在查询中使用关系类型。

您还可以通过使用下限为 0 的变长关系来减少涉及的变量数量。

此外,为了防止出现大量重复,因为您似乎并不关心查询结果中的商店,最好在 MATCH 中只有一个商店,订购和收集食物,然后获取计数的列表的列表> 1(意味着不止一家商店与这些相同的食物有关系)。

MATCH (s:Store)-[:CARRIES]->(:Food)-[:LIKE*0..]-(food:Food)
WITH s, food
ORDER BY id(food) DESC
WITH s, collect(food) as foods
WITH foods, count(foods) as count
WHERE count > 1
RETURN foods

推荐阅读