Проверьте, существует ли node, если не создавать

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

Моя проблема в том, что если я попытаюсь подключить 2 существующих узла, второй w630 будет воссоздан. Я пытался с MERGE и CREATE UNIQUE, оба не работали.

Мой код exmaple:

CREATE (test1 name:'1'})
MATCH (n)
WHERE n.name = '1'
MERGE (n)-[:know {r:'123'}]->(test3 {name:'3'})

MATCH (n)
WHERE n.name = '1'
MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'})

До этого он работает, но с помощью:

MATCH (n)
WHERE n.name = '3'
MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'})

он создает новый node "2" вместо подключения к существующему.

Ответ 1

При использовании MERGE на полных шаблонах поведение заключается в том, что либо весь шаблон совпадает, либо весь шаблон создан. MERGE не будет частично использовать существующие шаблоны - все это или ничего. Если необходимы частичные совпадения, это может быть достигнуто путем разделения шаблона на несколько предложений MERGE. http://docs.neo4j.org/chunked/stable/query-merge.html

MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'}) будет пытаться сопоставить весь шаблон и, поскольку он не существует, он создает его. Что вы можете сделать, это:

MERGE (n {name: '3'}) //Create if a node with name='3' does not exist else match it
MERGE (test2 {name:'2'}) //Create if a node with name='2' does not exist else match it
MERGE (n)-[:know {r:'123'}]->(test2) //Create the relation between these nodes if it does not already exist