Сортировка по элементам в коллекции в 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',

Другие вопросы по тегам