À la découverte de Neo4J partie 2 – Update et Delete

neo4j

Suite à la première partie de ce tutoriel où nous avions appris la création et la recherche de noeuds et de relations sous Neo4J en Cypher, nous allons maintenant nous attaquer à la modification d’un noeud ou d’une relation et à leur suppression. Nous verrons également une petite fonction bonus : le shortestPath.

Mettre un jour les propriétés d’un noeud

Pour modifier un noeud ou une relation, il faut passer par le mot clé SET :

//Update user
MATCH (medru:User {name:"medru"})
SET medru.name = "medrupaloscil"
RETURN medru

La syntaxe de cette instruction devrait maintenant vous paraître familière, on récupère tout d’abord un noeud en utilisant MATCH puis après avoir modifié une valeur, on retourne le noeud en question.

Si vous avez besoin d’entièrement modifier un noeud, vous pouvez également utiliser la syntaxe suivante :

//Update all in user
MATCH (n:User {name:"Patrick"})
SET n = {name:"Sebastien", age:"33"}
RETURN n
Modification d'une entité
Le résultat retourné nous montre bien que les valeurs ont été ajoutées au noeud

Ici en plus de modifier d’un coup toutes les propriété, nous effaçons les propriétés anciennement présentes. Par exemple si un champ « favouriteColor » était autrefois précisé chez notre cher Patrick, il sera désormais absent du noeud. En écrivant simplement deux accolades sans rien à l’intérieur vous pouvez supprimer toutes les propriétés anciennement présentes dans le noeud.

En se servant encore une fois de cette syntaxe, vous pouvez ajouter d’un coup plusieurs propriétés qui étaient absentes:

//Add values in user
MATCH (n:User {name:"medrupaloscil"})
SET n += {favouriteColor: "red", status:"active"}
RETURN n

Supprimer un noeud

Si par malheur vous avez créé un noeud dont vous ne voulez pas (par exemple un User nommé « Truc »), vous pouvez le supprimer en utilisant la syntaxe suivante:

//Delete node
MATCH (n:User {name: "Truc"})
DELETE n

Je ne vous fait pas l’affront de vous expliquer la syntaxe, je pense que vous l’avez ! Cependant, si vous essayez maintenant de supprimer Josiane avec cette même syntaxe, vous risquez de tomber sur cette jolie erreur:

Erreur Neo4J
Neo4J refuse de nous laisser supprimer ce noeud

Comme l’erreur l’indique, notre chère Josiane a encore des relations qui l’empêchent d’être supprimée. Cela vous évitera notamment de supprimer par erreur des noeuds importants de votre base de donnée. Et étant donné que les relations sont dans Neo4J une entité à part entière, supprimer une entité seule aurait laissé des relations ne pointant sur rien, ce qui est problématique. Si en revanche vous êtes sûrs de vouloir supprimer Josiane de votre base malgré ses relations pas de panique: il existe une syntaxe qui permet d’éviter cette erreur !

//Delete node
MATCH (n:User {name:"Josiane"})
DETACH DELETE n

Le mot-clé « DETACH » permet de d’abord détacher toutes ses relations (donc de les supprimer de la base) avant de supprimer un noeud. On évite ainsi les relations laissées sans entité, et ça évite également de devoir supprimer une à une les relations d’un noeud.

Josiane est supprimée
Josiane est supprimée

ShortestPath : un petit dernier pour la route ?

Histoire d’aller un peu plus loin dans cet article, nous allons voir une fonction qui peut s’avérer fort utile, créez d’abord une série d’utilisateur qui nous relie à Google :

//Add many Users
MATCH (medru:User {name:"medrupaloscil"}), (google:Company {name: "Google"})
CREATE (medru)-[:FRIEND_WITH]->(jean:User {name:"Jean"})-[:FRIEND_WITH]->(paul:User {name: "Paul"})-[:FRIEND_WITH]->(ginette:User {name: "Ginette"})-[:WORKS_AT]->(google)
RETURN medru, jean, paul, ginette, google

Ainsi qu’une série d’amis reliant Caroline à Google sans passer par Patrick:

//Add friends to caro
MATCH (caro:User {name:"Caroline"}), (google:Company {name: "Google"})
CREATE (caro)-[:FRIEND_WITH]->(victor:User {name:"Victor"})-[:FRIEND_WITH]->(geraldine:User {name: "Geraldine"})-[:WORKS_AT]->(google)
RETURN caro, victor, geraldine, google

Vous devez donc vous retrouver avec quelque chose dans le genre:

Un bien joli graph
Un bien joli graph

Si je recherche qui connait quelqu’un qui connait quelqu’un (…) qui travaille chez Google comme dans la partie 1 de ce tutoriel, Neo4J va me sortie quelque chose dans le genre:

//Who works at google ?
MATCH (m:User {name: "medrupaloscil"}), (g:User)-[:WORKS_AT]->(google:Company {name: "Google"}),
path = (m)-[:FRIEND_WITH*]-(g)
RETURN path, google
Mes relations chez Google
Mes relations chez Google

Comme vous pouvez le voir, non seulement on me propose plusieurs chemins possibles, mais en plus pour trouver le plus court je dois moi-même vérifier chaque chemin. Nous allons donc essayer de trouver uniquement le chemin le plus court entre moi et Google:

//Who works at google ?
MATCH (m:User {name: "medrupaloscil"}), (g:Company {name: "Google"}),
path = shortestPath((m)-[*]-(g))
RETURN path

Ici nous récupérons déjà les deux noeuds que nous voulons cibler, à savoir moi et Google. Ensuite avec la syntaxe (m)-[*]-(g) on récupère tous les chemins existants entre moi et Google (même des particulièrement longs) puis avec la fonction shortestPath() on récupère simplement le plus court qu’on stocke dans une variable path qu’on retourne ensuite. Voici donc le résultat retourné:

Lien le plus court vers google
Lien le plus court vers google avec shortestPath

 

Voilà, c’est tout pour cette fois. Vous avez désormais toutes les bases pour vous servir de Neo4J de façon simple. Je prépare actuellement un tutoriel pour apprendre à créer une API en Golang. Comme vous l’avez deviné cette API utilisera Neo4J comme base de donnée histoire de faire une dernière partie à ce tutoriel où on utilise enfin Neo4J (avec cypher) dans un cas pratique !

1 thought on “À la découverte de Neo4J partie 2 – Update et Delete”

  1. Pingback: Graph Databases: à la découverte de Neo4J et Cypher - Blog de Steloria

Laisser un commentaire