2013-12-08 11 views
29

Sto provando Neo4j per la prima volta. Sto usando l'edizione community 2.0-RC1.Aggiunta di una relazione ai nodi esistenti con Cypher

Ho creato alcuni nodi:

MERGE (u:User{username:'admin',password:'admin'}) 
MERGE (r1:Role{name:'ROLE_ADMIN'}) 
MERGE (r2:Role{name:'ROLE_WEB_USER'}) 
MERGE (r3:Role{name:'ROLE_REST_USER'}) 

e ora voglio aggiungere le relazioni tra i nodi. Tuttavia, I non desidera eliminare il database esistente creato con lo script precedente, aggiungere le istruzioni ed eseguirlo di nuovo. Voglio aggiungere relazioni ai nodi esistenti. Google mi ha aiutato a trovare questo:

START n=node(*), m=node(*) 
where has(n.username) and has(m.name) and n.username = 'admin' 
and m.name = 'ROLE_WEB_USER' 
create (n)-[:HAS_ROLE]->(m) 

Che funziona bene (anche se non capisco tutta la sintassi). Tuttavia, sono consapevole che questo trova qualsiasi nodo con una proprietà username e qualsiasi nodo con una proprietà name, invece di usare le etichette per verificare che abbia il giusto tipo di nodo.

Come posso fare lo stesso utilizzando le etichette?

risposta

49

In Neo4j 2.0 è possibile creare indici di schema per le etichette e le proprietà che si utilizza per la ricerca:

CREATE INDEX ON :User(username) 
CREATE INDEX ON :Role(name) 

di creare relazioni è possibile utilizzare:

MATCH (u:User {username:'admin'}), (r:Role {name:'ROLE_WEB_USER'}) 
CREATE (u)-[:HAS_ROLE]->(r) 

Il MATCH sarà utilizzare un indice se possibile. Se non ci sono indici, cercherà tutti i nodi che portano l'etichetta e vedrà se la proprietà corrisponde.

N.B. la sintassi sopra funzionerà solo con Neo4j 2.0.0-RC1 e versioni successive.

+4

r non è la scelta migliore di un nome di variabile per il secondo nodo, spesso r è designato come nome della variabile per la relazione. –

Problemi correlati