Использование 2 одинаковых предложений MATCH
обычно является признаком того, что вы делаете ненужные обращения к БД, чего следует избегать, если вы хотите эффективный запрос.
Вот запрос, для которого требуется только один MATCH
и также возвращает category
:
MATCH (c:Customer)-[b:BUY]->(p:Product)
WITH c, SUM(b.count*p.unit_price) As cTotal
WITH COLLECT({customer:c.name, cTotal: cTotal}) AS data, SUM(cTotal) AS total
UNWIND data AS d
WITH d.customer AS customer, 100.0 * d.cTotal / total AS percent
ORDER BY percent DESC
RETURN customer, percent, CASE WHEN percent < 50 THEN 'A' ELSE 'B' END AS category
cTotal
- итоговое значение на одного клиента (поскольку в первом WITH
предложении c
используется в качестве ключа группировки для агрегирования функция SUM
).