Процентная категоризация в Neo4j - PullRequest
0 голосов
/ 30 апреля 2020

Я написал код, который показывает процент расходов клиента. Я хотел бы разделить покупателей на категории в зависимости от этого процента. Например, если процент <50, то клиент относится к категории A (мне нужен столбец, в котором это будет написано). Как я могу это реализовать? </p>

  MATCH  (c:Customer)-[b:BUY]->(p:Product)
      WITH SUM(b.count*p.unit_price) As total
      MATCH (c:Customer)-[b:BUY]->(p:Product)
    RETURN c.name AS Customer, 
           100.0 * SUM(b.count*p.unit_price) / total AS percent 
    ORDER BY percent DESC

Neo4j

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Использование 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).

0 голосов
/ 30 апреля 2020

Я предполагаю, что вы хотите установить новое свойство на узлах Customer, чтобы отразить эту «категорию». Как насчет этого?

MATCH  (c:Customer)-[b:BUY]->(p:Product)
WITH SUM(b.count*p.unit_price) As total
MATCH (c:Customer)-[b:BUY]->(p:Product)
WITH c, 100.0 * SUM(b.count*p.unit_price) / total AS percent 
SET c.category = CASE
                   WHEN percent < 50 THEN 'A'
                   WHEN percent >= 50 AND percent < 75 THEN 'B'
                   ELSE 'C'
                 END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...