给出此查询:
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个。我如何获得不同的小组?
答案 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