Virgole nella clausola MERGE come ci sono nella clausola MATCH?

Aug 18 2020

Quanto segue funziona bene in neo4j 4:

MATCH (a)-->(b)<--(c), (b)-->(d)
RETURN a

Ma quanto segue restituisce un errore:

MERGE (a)-->(b)<--(c), (b)-->(d)
RETURN a

Testo errore: Neo.ClientError.Statement.SyntaxError

Invalid input ',': expected whitespace, a relationship pattern, ON, FROM GRAPH, USE GRAPH, CONSTRUCT, LOAD CSV, START, MATCH, UNWIND, MERGE, CREATE UNIQUE, CREATE, SET, DELETE, REMOVE, FOREACH, WITH, CALL, RETURN, UNION, ';' or end of input (line 1, column 22 (offset: 21))
"MERGE (a)-->(b)<--(c), (b)-->(d)"
                     ^

Se ho capito bene, l'unione fornisce un livello di funzionalità di upsert. Ma l'unione è più limitata nella capacità di corrispondenza rispetto alla corrispondenza? Come si uniscono modelli non lineari complessi che richiedono separazioni virgole ?

Risposte

1 cybersam Aug 18 2020 at 18:36

L' intero MERGE modello verrà creato se un elemento nel modello non esiste ancora. Quindi, per essere sicuro, devi sempre assicurarti che ogni MERGEmodello abbia un solo elemento che potrebbe non esistere.

Questo è il motivo per cui ha senso MERGEsupportare modelli con un solo termine.

Ad esempio, invece di questo (che comunque non è legale Cypher):

MERGE
  (a:Foo {id: 'a'})-[:BAR]->(b:Foo {id: 'b'})<-[:BAR]-(c:Foo {id: 'c'}),
  (b)-[:BAR]->(d:Foo {id: 'd'})
RETURN a

dovresti effettivamente farlo:

MERGE (a:Foo {id: 'a'})
MERGE (b:Foo {id: 'b'})
MERGE (c:Foo {id: 'c'})
MERGE (d:Foo {id: 'd'})
MERGE (a)-[:BAR]->(b)
MERGE (b)<-[:BAR]-(c)
MERGE (b)-[:BAR]->(d)
RETURN a