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