Вернуть разные группы - PullRequest
       5

Вернуть разные группы

0 голосов
/ 09 декабря 2018

Учитывая этот запрос:

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 голосов
/ 09 декабря 2018

Равенство списков с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...