Запрос слияния Cypher создает новые узлы вместо слияния

#neo4j #cypher

#neo4j #cypher

Вопрос:

Итак, я пытаюсь выяснить, почему это продолжает создавать новые узлы вместо создания связей с существующими узлами. Используя этот пример:https://neo4j.com/docs/cypher-manual/current/clauses/unwind /

Я чувствую, что мой запрос — это в основном то же самое. Но, как вы можете видеть ниже, вместо того, чтобы связывать 222 и 333 с 111, он создает 2 узла как 111

Параметры

 :params {components:[{targetId: "111", dependencyId: "222"},{targetId: "111", dependencyId:"333"}]}
  

Запрос

 UNWIND $components AS component
MERGE (dependency:Component {Id: component.dependencyId })
MERGE (dependency)<-[:DEPENDS_ON]-(target:Component {Id: component.targetId })
RETURN dependency, target
  

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

 MERGE (c:Component {Id: "111"})
  

введите описание изображения здесь

Ответ №1:

Второй запрос СЛИЯНИЯ пытается сопоставить, используя весь шаблон.

Как только запрос выполняется снова для второй записи в вашем списке компонентов, он не просто соответствует (: Component {Id: "111"}) , но (: Component {Id: "333"})<-[:DEPENDS_ON]-(: Component {Id: "111"}) вместо этого. Поскольку указанный шаблон еще не существует, узел для 111 создается снова.

Чтобы 111 не создавался снова, вам нужно добавить запрос на СЛИЯНИЕ только для этого узла.

 UNWIND $components AS component
MERGE (dependency:Component {Id: component.dependencyId })
MERGE (target:Component {Id: component.targetId })
MERGE (dependency)<-[:DEPENDS_ON]-(target)
RETURN dependency, target
  

Комментарии:

1. Спасибо за ответ, я действительно пришел к такому же выводу прошлой ночью! Были некоторые другие проблемы, с которыми я столкнулся, когда он не объединял новую информацию, поскольку проходили другие экземпляры запроса, но в итоге я решил это.