Cypher запрос, чтобы найти узлы, затем найти количество тех узлов, которые имеют определенные отношения - PullRequest
1 голос
/ 27 января 2020

Я использую neo4j для представления информации о работодателях и их предложениях в отношении здоровья. ie:

(client)-[OFFERED_PLAN]->(planOffering)-[HAS_PLAN_DETAIL {value:number}]->(benefitPlanType)

Я пытаюсь запросить этот график, чтобы получить список 50 лучших клиентов в ЦА, а затем определить число тех 50 клиентов, которые предлагают медицинский план (значение = 1) и сколько предлагается стоматологических (значение = 5). Я перепробовал много вариантов приведенного ниже запроса, но я думаю, что это самый близкий. Вывод этого в настоящее время будет возвращать одно и то же число для всех трех переменных, 25, что является числом этих клиентов, предлагающих стоматологические услуги.

MATCH (client:Client)-[:LOCATED_IN]->(:State {stateCode:'CA'})
LIMIT 50
with client as mc, client as dc, client
MATCH (mc)-[:OFFERED_PLAN]->(mp:PlanOffering)-[mbpt:HAS_PLAN_DETAIL]->(:BenefitPlanType),
      (dc)-[:OFFERED_PLAN]->(:PlanOffering)-[dbpt:HAS_PLAN_DETAIL]->(:BenefitPlanType)
WHERE mbpt.value = 1 and dbpt.value = 5
with  count(distinct(client.clientID)) as clientCount,  
      count(distinct(mc.clientID)) as numberMedicalClients,  
      count(distinct(dc.clientID)) as numberDentalClients
return *

1 Ответ

4 голосов
/ 27 января 2020

Невозможно протестировать этот запрос, но если вы просто агрегируете клиентов по значению плана, вы получите количество клиентов в каждом плане без необходимости их повторного соответствия

MATCH (client:Client)-[:LOCATED_IN]->(:State {stateCode:'CA'})
WITH client LIMIT 50
MATCH (client)-[:OFFERED_PLAN]->(mp:PlanOffering)-[mbpt:HAS_PLAN_DETAIL]->(:BenefitPlanType)
WHERE mbpt.value IN [1,5]
RETURN mbpt.value, count(*)
...