web-dev-qa-db-fra.com

Ajout de relations aux nœuds existants avec Cypher

J'essaie Neo4j pour la première fois. J'utilise l'édition communautaire 2.0-RC1.

J'ai créé des nœuds:

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'})

et maintenant je veux ajouter des relations entre les nœuds. Cependant, je ne pas veux effacer la base de données existante créée avec le script ci-dessus, ajouter les instructions et l'exécuter à nouveau. Je veux ajouter des relations aux nœuds existants. Google m'a aidé à trouver ceci:

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)

Ce qui fonctionne bien (même si je ne comprends pas toute la syntaxe). Cependant, je suis conscient du fait que ceci trouve n'importe quel noeud avec une propriété de nom d'utilisateur et n'importe quel noeud avec une propriété de nom, au lieu d'utiliser des étiquettes pour vérifier qu'il a le bon type de noeud.

Comment puis-je faire la même chose en utilisant des étiquettes?

42
Paul Grenyer

Dans Neo4j 2.0, vous pouvez créer des index de schéma pour vos étiquettes et les propriétés que vous utilisez pour la recherche:

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

Pour créer des relations, vous pouvez utiliser:

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

Le MATCH utilisera un index si possible. S'il n'y a pas d'index, tous les nœuds portant l'étiquette sont recherchés et la propriété correspondante.

N.B. la syntaxe ci-dessus ne fonctionnera qu'avec Neo4j 2.0.0-RC1 et supérieur.

72
Stefan Armbruster