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 avec Neo4J
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. Notons que comme Neo4J est schema-less, si la propriété n’existait dans aucun noeud de ce label cela ne pose aucun soucis. Vous pouvez ajouter tout ce qu’il vous plait sans risque.
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
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:
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. Josianne est donc désormais complètement 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:
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:
MATCH (m:User {name: "medru"}), (g:User)-[:WORKS_AT]->(google:Company {name: "Google"}),
path = (m)-[:FRIEND_WITH*]-(g)
RETURN path, 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é:
Voilà, c’est tout pour cette fois. Vous avez désormais toutes les bases pour vous servir de Neo4J de façon simple. Dans l’article suivant nous verrons un cas plus pratique pour utiliser le shortestPath dans des cas de figure concrets utilisables dans des applications Web.