Как сопоставить количество узлов или отношений Neo4j при фильтрации по свойству узла или отношения - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть график:

CREATE (c1:Contract { id: "V-9087-4321" }),
       (c2:Contract { id: "V-8046-2304" }),
       (p:Partner {id: "C-4837-4536"}),
       (p)-[:POLICY_HOLER]->(c1),
       (p)-[:POLICY_HOLER]->(c2)

MATCH (p:Partner) WHERE p.id = "C-4837-4536"
CREATE (c:Claim { id: "ef70", date: "2019-04-27" }),
       (p)-[:CLAIMANT {on: "2019-04-27"}]->(c)

MATCH (p:Partner) WHERE p.id = "C-4837-4536"
CREATE (c:Claim { id: "ab90", date: "2019-04-28" }),
       (p)-[:CLAIMANT {on: "2019-04-28"}]->(c)

Я хочу найти всех партнеров, у которых более 1 заявки после 1 апреля:

Я пробовал это:

MATCH (claim:Claim)<-[r:CLAIMANT]-(p:Partner)
WITH count(r) as cnt, p, claim
WHERE cnt > 1 AND claim.date > '2019-04-01'
RETURN cnt, p.id

Это не работает, потому что (если я удалю предложение where), он возвращает два утверждения, каждое с cnt=1, вместо того, чтобы на самом деле их агрегировать. Я пробовал выбирать на основе claim.date, а также r.on.

Как это можно сделать с помощью Cypher?

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

@ cybersam объяснил агрегатные функции очень хорошо.Я предлагаю посмотреть на их ответ, чтобы понять, как работают агрегатные функции.Но их запрос не фильтрует заявки по количеству.

Вы можете использовать следующий запрос, чтобы найти всех партнеров, у которых более 1 заявки после 1 апреля:

MATCH (claim:Claim)<-[r:CLAIMANT]-(p:Partner)
WHERE claim.date > '2019-04-01'
WITH count(r) as cnt, p 
WHERE cnt > 1
RETURN cnt, p.id
1 голос
/ 27 апреля 2019

Функции агрегирования neo4j (например, COUNT()) используют неагрегирующие термины в том же предложении WITH или RETURN в качестве "ключей группировки".

InВ предложении WITH в вашем примере ключи группировки: p и claim, поэтому функция COUNT() считает количество r отношений между каждой отдельной парой p и claim (и поэтомувсегда будет 1).Вместо этого вам действительно нужно количество r отношений для каждого p.

. Предполагая, что каждый узел Partner имеет уникальный id, вы можете найти всех партнеров, у которых есть более одной заявки после1 апреля с использованием этого упрощенного запроса:

MATCH (claim:Claim)<-[:CLAIMANT]-(p:Partner)
WHERE claim.date > '2019-04-01'
RETURN COUNT(claim) AS cnt, p.id

Если вы также хотите вернуть список всех претензий для каждого подходящего партнера:

MATCH (claim:Claim)<-[:CLAIMANT]-(p:Partner)
WHERE claim.date > '2019-04-01'
RETURN COUNT(claim) AS cnt, COLLECT(claim) AS claims, p.id

Кроме того, следует создать более быстрые поисковые запросы. index или ограничение уникальности on :Claim(date).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...