2015-06-24 14 views
5

Diciamo che abbiamo n nodi con etichetta : Test e una proprietà univoca chiamata tipo.Creazione di strutture univoche in Neo4j con i nodi che fanno parte di un'altra struttura

UNWIND[{ type:"a" }, { type:"b" }, { type:"c" }, { type:"d" }] AS x 
MERGE (t:Test { type: x.type }) 
RETURN t 

che assomiglia a questo

Base structure

Ora introduciamo un nodo di un'etichetta : Collection. Lo scopo se questo nodo deve avere un modello di relazione univoco con i nodi : Test.

MATCH (a:Test { type:"a" }),(b:Test { type:"b" }) 
CREATE UNIQUE (x:Collection)-[:HAS]->(a),(x:Collection)-[:HAS]->(b) 
Return * 

1st collection

Il problema che faccia parte si verifica quando si tenta di fare un'altra struttura unica, come il precedente, ma con alcuni nodi in comune.

MATCH (a:Test { type:"a" }) 
CREATE UNIQUE (x:Collection)-[:HAS]->(a) 
RETURN * 

Il risultato atteso è che un altro nodo di etichetta : Collezione viene creato e collegato a : test{type: "a"} ma il risultato effettivo è che corrisponde alla struttura dati precedenti e restituisce quello invece di crearne uno nuovo.

2nd collection

Il risultato atteso dovrebbe avere 2 : Collezione nodi, un obiettivo legato alla tipo: "a", l'altro legato alla tipo: "a" e tipo: "b ".

expected result

Qualsiasi tipo di ingresso dell'ingresso sarà molto apprezzato: D

+0

Una potenziale soluzione rapida e sporca consiste nell'avere una proprietà univoca per **: Raccolta ** fatta dal **: Test ** ** tipo ** s ordinato alfanumerico. Qualcosa come **: Collection {type: "ab"} ** e **: Collection {type: "a"} ** e hanno la query visualizzata in quel modo prima di inviarla al parser Cypher –

risposta

2

Dal neo4j docs on CREATE UNIQUE:

CREATE UNIQUE è nel mezzo di CORRISPONDENZA e CREATE - farà corrispondere quello può, e creare ciò che manca. CREATE UNIQUE sarà sempre rendere il minimo cambiamento possibile al grafico - se può usare parti di il grafico esistente, lo farà.

Si aggiungono i nodi Collection senza proprietà. Penso che se CREATE UNIQUE trova un nodo Collection, lo userà. Questo è il modo in cui CREATE UNIQUE dovrebbe funzionare.

Quindi, se si desidera una nuova Collection che è collegato ad alcuni Test nodi, è possibile aggiungere alcune proprietà uniche al nodo:

MATCH (a:Test { type:"a" }) 
CREATE UNIQUE (x:Collection {key: 'unique value'})-[:HAS]->(a) 
RETURN * 

O crearlo in una fase separata:

MATCH (a:Test { type:"a" }) 
CREATE (x:Collection) 
CREATE (x)-[:HAS]->(a) 
RETURN * 

Oppure utilizzare MERGE anziché CREATE UNIQUE.

+0

O in realtà: 'PARTITA (a: Test {type: "a"}), (x: Collection) CREATE UNIQUE (x) - [: HAS] -> (a) RETURN * ' –

Problemi correlati