Neo4j Cypher-запрос для создания единого отношения между несколькими совпадениями в иерархическом формате - PullRequest
0 голосов
/ 30 января 2020

Итак, мне нужно установить связь между узлами в форме (A) - managed_by -> (b)

Я сопоставляю их с неким атрибутом id, но проблема в том, что существует несколько б значения с тем же атрибутом id, и я хочу только создать отношение к одному. Важно отметить, что узлы b уже имеют отношения, которые объясняют, почему эти значения повторяются. Допустим, отношение выглядит следующим образом: номера идентификаторов представляют собой узел ab:

1111 - есть суб-> 1112 - есть суб-> 1112 - есть суб-> 1112 - есть суб-> 1113 и c .

Я хочу создать управляемую связь между узлом a (со значением 1112) и узлом верхнего уровня b, имеющим 1112. Таким образом, в этом случае это будет единственный узел 1112 b, который является не на получающем конце отношения «имеет под» с узлом ab, имеющим тот же идентификатор.

Мой текущий запрос выглядит примерно так:

MATCH(a:`a thing`),(b:`b thing`) WHERE a.resp_id = b.item_id
MERGE (a)-[r:`Managed By`]->(b)

В этом случае, если a.resp_id равен 1112, он создает три отношения, но я хочу, чтобы он только создавал отношение к вершине узел уровня b с этим значением. Как мне изменить этот запрос, чтобы это произошло?

1 Ответ

1 голос
/ 30 января 2020

Если это относится только к узлам b, то добавьте условие, что узел b, которому вы соответствуете, не должен иметь над ним узел ab с тем же идентификатором:

MATCH(a:`a thing`)
WITH a, a.resp_id as resp_id
MATCH (b:`b thing`) 
WHERE resp_id = b.item_id
AND NOT (:`b thing`{item_id:resp_id})-[:`has sub`]->(b)
MERGE (a)-[r:`Managed By`]->(b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...