multiple merge neo4j cypher

multiple - neo4j merge



Diferencia entre fusión y creación única en Neo4j (1)

Estoy tratando de descubrir cuál es la diferencia entre MERGE y CREATE UNIQUE. Conozco estas características:

UNIR

Puedo crear un nodo, si no existe el patrón.

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

Este crea el nodo "n" con nombre de propiedad, nodo vacío "m" y relación RELACIONADA.

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

CREAR ÚNICO

No puedo crear un nodo como este.

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

Si existe el nodo "n", crea un nodo vacío que hace "m" y una relación RELACIONADA.

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

Si este patrón existe, nada creado, solo regresa el patrón.

Desde mi punto de vista, veo que MERGE y CREATE UNIQUE son exactamente las mismas consultas, pero con CREATE UNIQUE no se puede crear un nodo de inicio en la relación. Estaría agradecido, si alguien pudiera explicar este problema y comparar estas consultas, gracias.


CREATE UNIQUE tiene una semántica un poco más oscura que MERGE . MERGE se desarrolló como una alternativa con un comportamiento más intuitivo que CREATE UNIQUE ; si tiene dudas, MERGE suele ser la elección correcta.

La manera más fácil de pensar en MERGE es como MATCH-or-create. Es decir, si algo en la base de datos MATCH el patrón que está utilizando en MERGE , entonces MERGE simplemente devolverá ese patrón. Si nada coincide, el MERGE creará todos los elementos faltantes en el patrón, donde un elemento faltante significa cualquier identificador desatado.

Dado

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

"a" es un identificador vinculado desde la perspectiva de MERGE. Esto significa que Cypher de alguna manera ya sabe qué nodo representa.

Esta declaración puede tener dos resultados. O bien el patrón completo ya existe, y no se creará nada, o faltarán partes del patrón, y se creará un nuevo conjunto de relaciones y nodos que coincidan con el patrón.

Ejemplos

// 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]->()