Сортировка по элементам в коллекции в Cypher Query
Я работаю над приложением, использующим Neo4J, и у меня возникают проблемы с сортировкой в некоторых запросах. У меня есть список магазинов, в которых есть акции, поэтому у меня есть узел для каждого магазина и узел для каждой акции. В каждом магазине может быть несколько рекламных акций, так что это отношения один ко многим. Некоторые рекламные акции представлены (featured property = true), поэтому я хочу, чтобы они появлялись первыми. Я пытаюсь построить запрос, который делает следующее:
- Возвращает список магазинов с рекламными акциями в виде коллекции (возвращая ее так, как будто это идеально для подкачки страниц)
- Сортирует магазины так, чтобы в первую очередь появлялись магазины с наиболее популярными акциями
- Сортирует коллекцию так, чтобы показанные рекламные акции появлялись первыми
Пока у меня есть следующее:
MATCH (p:Promotion)-[r:BELONGS_TO_STORE]->(s:Store) WITH p, s, collect(p.featured) as featuredCol WITH p, s, LENGTH(FILTER(i IN featuredCol where i='true')) as featuredCount ORDER BY p.featured DESC, featuredCount DESC RETURN s, collect(p) skip 0 limit 10
Сначала я пытаюсь создать коллекцию, используя свойство featured, используя предложение WITH. Затем я пытаюсь создать вторую коллекцию, в которой свойство featured равно true, а затем получить длину во втором предложении WITH. Это сортирует коллекцию по акциям правильно, но не по магазинам. Я получаю сообщение об ошибке, если пытаюсь добавить другую сортировку в конце, как это, потому что переменная featuredCount отсутствует в предложении RETURN. Я не хочу переменную featuredCount в предложении RETURN, потому что она отбрасывает мою нумерацию страниц.
Вот мой второй запрос:
MATCH (p:Promotion)-[r:BELONGS_TO_STORE]->(s:Store) WITH p, s, collect(p.featured) as featuredCol WITH p, s, LENGTH(FILTER(i IN featuredCol where i='true')) as featuredCount ORDER BY p.featured DESC, featuredCount DESC RETURN s, collect(p) ORDER BY featuredCount skip 0 limit 10
Я очень новичок в Neo4J, поэтому любая помощь будет принята с благодарностью.
1 ответ
Этот запрос ( см. Эту консоль) работает для вас?
MATCH (p:Promotion)-[r:BELONGS_TO_STORE]->(s:Store)
WITH p, s
ORDER BY p.featured DESC
WITH s, COLLECT(p) AS pColl
WITH s, pColl, REDUCE(n = 0, p IN pColl | CASE
WHEN p.featured
THEN n + 1
ELSE n END ) AS featuredCount
ORDER BY featuredCount DESC
RETURN s, pColl
LIMIT 10
Этот запрос выполняет следующие шаги:
- Он упорядочивает совпадающие строки так, чтобы строки с показанными акциями были первыми.
- Он объединяет все
p
узлы для каждого отдельногоs
вpColl
коллекция. Показанные рекламные акции по-прежнему появляются в начале каждогоpColl
, - Он рассчитывает количество рекомендуемых акций в каждом
pColl
и заказывает магазины так, чтобы в первую очередь появлялись магазины с наибольшим количеством рекламных акций. - Затем он возвращает результаты.
Примечание. Этот запрос предполагает, что featured
имеет логическое значение, а не строку. (FYI: ORDER BY
считает true
быть больше чем false
). Если это предположение неверно, вы можете изменить WHEN
пункт к WHEN p.featured = 'true'
,