返回不同的组

时间:2018-12-09 02:50:31

标签: neo4j cypher

给出此查询:

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个。我如何获得不同的小组?

1 个答案:

答案 0 :(得分:1)

与Cypher的列表相等性包括顺序,因此最简单的方法是对列表进行排序,最好使用APOC Procedures中的apoc.coll.sortNodes(),它允许在集合内进行排序,然后使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