Шифр: коррелированные переменные в объединении

#neo4j #cypher #union #correlated-subquery

#neo4j #шифр #объединение #коррелированный подзапрос

Вопрос:

Мне нужно ответить на следующий запрос: три лучших города-магазина на основе продаж в магазинах и продаж в магазинах для всех остальных городов вместе взятых.

Со следующим запросом

 // Top 3 cities
MATCH (t:Store)<-[:HasStore]-(s:Sales)
WITH t.StoreCity AS StoreCity, t, sum(s.StoreSales) AS StoreSales
ORDER BY sum(s.StoreSales) DESC LIMIT 3
// All other cities
WITH StoreCity, StoreSales, collect(t) AS TopThreeCities
MATCH (t1:Store)<-[:HasStore]-(s:Sales)
WHERE NOT(t1 IN TopThreeCities)
// JOIN of the two results -> I would need the UNION
RETURN StoreCity, StoreSales, "Other cities" AS StoreCity1, sum(s.StoreSales) AS StoreSales1
 

Я смог получить следующий ответ

 "A" 10  "Other Cities"  50
"B" 9   "Other Cities"  50
"C" 8   "Other Cities"  50
 

Но я хотел бы получить

 "A" 10
"B" 9
"C" 8
"Other Cities"  50
 

Есть идеи, как это получить? Я перепробовал много возможностей без какого-либо успеха 🙁

Ответ №1:

Использование ОБЪЕДИНЕНИЯ:

 // Top 3 cities
MATCH (t:Store)<-[:HasStore]-(s:Sales)
RETURN t.StoreCity AS StoreCity, sum(s.StoreSales) AS StoreSales
ORDER BY sum(s.StoreSales) DESC LIMIT 3
// All other cities
UNION
MATCH (t:Store)<-[:HasStore]-(s:Sales)
WITH t.StoreCity, sum(s.StoreSales) AS AllStoreSales
ORDER BY AllStoreSales DESC SKIP 3
RETURN "Other cities" AS StoreCity, sum(AllStoreSales) AS StoreSales
 

ОБЪЕДИНЕНИЕ выполняет два разных запроса, поэтому перед ОБЪЕДИНЕНИЕМ мы находим три самых продаваемых города и возвращаем их имена и количество, как вы и предполагали изначально

После ОБЪЕДИНЕНИЯ снова выполняется тот же базовый запрос, чтобы найти сумму продаж по городам, упорядоченную по убыванию продаж, затем три лучших результата пропускаются. Продажи оставшегося города суммируются и возвращаются как другие города.

Две части ОБЪЕДИНЕНИЯ полностью разделены, но оба запроса должны возвращать одинаковое количество столбцов с одинаковыми именами столбцов и в одинаковом порядке столбцов.