Neo4j: Как создать уникальный узел вместо множества узлов - PullRequest
2 голосов
/ 23 марта 2019

Я хочу создать новый узел (event nodes) среди набора узлов (report nodes) в соответствии с indicator nodes (каждый узел отчета имеет несколько связанных с ним узлов индикатора).Я хочу установить новый event nodes с правилами:

  1. a report nodes подключен только один event node
  2. , если более одного indicator nodes имеет одинаковое свойство«шаблон», то они принадлежат одному и тому же узлу события

вот мой код запроса:

OPTIONAL MATCH 
(indicator_1_1:indicator)<-[:REFERS_TO]-(report_1:report)-[:REFERS_TO]->(indicator_1_2:indicator),
(indicator_2_1:indicator)<-[:REFERS_TO]-(report_2:report)-[:REFERS_TO]->(indicator_2_2:indicator)
WHERE
indicator_1_1.pattern=indicator_2_1.pattern
and
indicator_1_2.pattern=indicator_2_2.pattern
MERGE
(report_1)-[:related_to]->(event:EVENT)<-[:related_to]-(report_2)

и получим результат, как показано ниже, enter image description here

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

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 26 марта 2019

У меня нет данных для подтверждения, но я думаю, что небольшое изменение в вашем запросе Cypher приведет к тому, что вы хотите.

Из главы руководства Neo4j Cypher по MERGE (мой акцент добавлен).

При использовании MERGE на полных шаблонах поведение таково, что либо весь шаблон соответствует, или весь шаблон создан. MERGE будет не использовать частично существующие шаблоны - это все или ничего . Если частичные совпадения необходимы, это может быть достигнуто путем разделения шаблон на несколько MERGE предложений.

Итак, после этого, я думаю, если вы измените

MERGE (report_1)-[:related_to]->(event:EVENT)<-[:related_to]-(report_2)

до

MERGE (report_1)-[:related_to]->(event:EVENT)
MERGE (event)<-[:related_to]-(report_2)

... вы предотвратите создание дополнительных :EVENT узлов и получите график, который вы ищете.

0 голосов
/ 24 марта 2019

Наконец-то я нахожу ответ.Мое решение - объединить узел: событие, а затем отношения

шаг 1: объединить узлы: события

MATCH ()-[r_1:related_to]->(event_1:EVENT)<-[r_2:related_to]-()-[r_3:related_to]->(event_2:EVENT)<-[r_4:related_to]-()
call apoc.refactor.mergeNodes([event_1,event_2]) YIELD node
RETURN node

шаг 2: объединить дублирующиеся отношения

MATCH (X)-[r]-(Y)
WITH X,Y, TAIL (collect(r)) as rr
FOREACH (r IN rr | DELETE r)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...