Подтвердить что ты не робот

Разница между слиянием и созданием уникальной в Neo4j

Я пытаюсь понять, в чем разница между MERGE и CREATE UNIQUE. Я знаю эти функции:

Объединить

Я могу создать node, если не существует шаблона.

    MERGE (n { name:"X" }) RETURN n;

Создайте node "n" с именем свойства, пустое node "m" и отношение RELATED.

    MERGE (n { name:"X" })-[:RELATED]->(m) RETURN n, m;

СОЗДАТЬ УНИКАЛЬНЫЙ

Я не могу создать node, как это.

    CREATE UNIQUE (n { name:"X" }) RETURN n;

Если существует node "n", создайте уникальные символы пустых node "m" и отношение RELATED.

    MATCH (n { name: 'X' }) CREATE UNIQUE (n)-[:RELATED]->(m) RETURN n, m;

Если этот шаблон существует, ничего не создается, возвращается только шаблон.

С моей точки зрения, я вижу, что MERGE и CREATE UNIQUE - это те же самые запросы, но с CREATE UNIQUE вы не можете создать start node в отношениях. Буду признателен, если кто-то сможет объяснить эту проблему и сравнить эти запросы, спасибо.

4b9b3361

Ответ 1

CREATE UNIQUE имеет немного более неясную семантику, чем MERGE. MERGE был разработан как альтернатива с более интуитивным поведением, чем CREATE UNIQUE; если есть сомнения, MERGE обычно является правильным выбором.

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

Учитывая

MATCH (a {uid:123})
MERGE (a)-[r:LIKES]->(b)-[:LIKES]->(c)

"a" является связанным идентификатором с точки зрения MERGE. Это означает, что cypher как-то уже знает, какой node он представляет.

Это утверждение может иметь два результата. Либо весь шаблон уже существует, и ничего не будет создано, или части шаблона отсутствуют, и будет создан целый новый набор отношений и узлов, соответствующих шаблону.

<сильные > Примеры

// Before merge:
(a)-[:LIKES]->()-[:LIKES]->()

// After merge:
(a)-[:LIKES]->()-[:LIKES]->()


// Before merge:
(a)-[:LIKES]->()-[:OWNS]->()

// After merge:
(a)-[:LIKES]->()-[:OWNS]->()
(a)-[:LIKES]->()-[:LIKES]->()


// Before merge:
(a)

// After merge:
(a)-[:LIKES]->()-[:LIKES]->()