Равенство списков с Cypher включает в себя порядок, поэтому самым простым способом будет сортировка списков, предпочтительно с помощью apoc.coll.sortNodes()
из процедур APOC, что позволяет сортировать внутри коллекций, что затем позволяет DISTINCT предоставлять правильные результаты.
Тем не менее, есть некоторые проблемы с этим запросом, которые нужно исправить.
Во-первых, вы должны использовать метки, в противном случае это превращается в AllNodesScan.: Store and: Пищевые этикетки, вероятно, следует использовать.Также обычно имеют значение отношения, поэтому, если возможно, используйте типы отношений в запросе.
Вы также можете уменьшить число задействованных переменных, используя отношение переменной длины с нижней границей 0.
Кроме того, чтобы избежать большого количества дубликатов, так как вам кажется, что в результатах запроса вас не заботят магазины, лучше всего было бы иметь только один магазин в МАТЧ, упорядочивать и собирать продукты, а затем получать списки, в которых подсчитывается количество.из списков> 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