Neo4j 1 к 1 Отношения - PullRequest
       7

Neo4j 1 к 1 Отношения

0 голосов
/ 30 января 2019

У меня есть два узла, «клиент» и «строитель».Я хочу найти только те отношения, в которых у клиента есть только один строитель, а у этого строителя только один клиент, поэтому отношения 1-1.Пока что мой запрос

MERGE(b:Person{name:csv.name) 
MERGE(c:Person{name:csv.name})
WITH collect(distinct b) as builder, collect(distinct c) as client
UNWIND builder as builders
UNWIND client as clients
WITH builders, clients
WHERE builders = 1 and clients = 1
MATCH (builders:Person)-[bu:builder_for]->(clients:Person)
WITH builders,clients, count(distinct bu) as builds
WHERE builds=1

RETURN distinct builders, clients

Это возвращает только отношение 1 ко многим и все еще показывает дубликаты в моем списке клиентов.

Выделены те, которые я хотел бы вернуть

ОБНОВЛЕНИЕ Реализация киберсам работает, спасибо вам большое!

1 Ответ

0 голосов
/ 30 января 2019

Предполагая, что вы хотите получить все пары builder / client, которые имеют только одну связь builder_for между ними, в этом запросе используется агрегирующая функция COUNT для этого:

MATCH (builder:Person)-[rel:builder_for]->(client:Person)
WITH builder, client, COUNT(rel) AS rel_count
WHERE rel_count = 1
RETURN builder, client;

[ОБНОВЛЕНИЕ]

Если вместо этого вы хотите builder / client пар, в которых builder имеет только эту clientи наоборот, тогда этот запрос должен работать:

MATCH (builder:Person)
WHERE SIZE((builder)-[:builder_for]->()) = 1
MATCH (builder)-[:builder_for]->(client:Person)
WHERE SIZE(()-[:builder_for]->(client)) = 1
RETURN builder, client;

Этот запрос использует эффективные проверки степени взаимосвязи (в предложениях WHERE), чтобы гарантировать, что только узлы builder и clientиметь, соответственно, одну исходящую или входящую builder_for связь.

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