Initiation Ludique à Neo4J
De Neo4J à Game of Thrones
Un beau matin, vous vous réveillez en Westeros... Sans aucune connaissance historique... Avant de vous mettre à réfléchir, il va falloir intégrer les informations du royaume ! L'idée est de découvrir de manière ludique le système de gestion de base de données Neo4J. |
Votre première tâche va être de créer les nœuds et relations dans votre base de données : Pour cela vous allez avoir besoin du fichier suivant :
Question
Avant de se servir de l'ensemble du fichier, nous allons essayer d'ajouter nous même un nœud au graphe :
(n'hésitez pas à regarder les indices pour les premières étapes)
Créer un noeud personnage ayant le formalisme suivant (commande CREATE) :
« (p:personnage { name : 'Gregor Clegane', nickname : 'The Mountain' }) »
Vous pouvez vous aider des scripts déjà réalisé dans le menu "étoile" ! |
Il suffisait d'utiliser la commande CREATE de la manière suivante :
CREATE(gregor:personnage { name : 'Gregor Clegane', nickname : 'The Mountain' })
"gregor" est l'identificateur du noeud
"personnage" permet de lui donner un label pour le différentier des autres
"name" et "nickname" désignent des attributs du noeud qui permettent d'enrichir le noeud en informations
Question
Nous allons maintenant chercher à créer une relation :
Tout d'abord, ajouter un nouveau nœud comme ceci :
CREATE(oberyn:personnage { name : 'Oberyn Martell', nickname : 'The Viper' })
Ensuite il va falloir créer un lien entre les deux nœuds déjà créés :
Créez une relation de type
« :TUE »
entre les deux noeuds avec comme paramètre :« type : 'duel' »
On utilise toujours la fonction CREATE
le formalisme pour les relations est très visuel :
()<-[]-() ou ()-[]->() ou ()<-[]->() ()-[]-()
où :
on mettra nos nœuds à l'intérieur des parenthèses ()
on mettra nos relations à l'intérieur des crochets []
enfin on désignera le sens de la relation avec la flèche
Voici la requête :
CREATE (gregor)-[:TUE{type : 'duel'}]->(oberyn)
Nous allons maintenant charger les informations du royaume.
Pour cela, deux choix s'offrent à vous, soit :
-Vous ouvrez le fichier exercice_1.cypher dans un éditeur de texte et vous copier-coller son contenu dans la ligne de commande de Neo4J
-Soit vous l'ajoutez à vos scripts favoris dans le menu "étoile" du volet de gauche en glissant le fichier script dans "Drop Cypher script file to import", vous pourrez alors lancer le script en double cliquant dessus.
Voilà vous avez tout Westeros devant vous ! « (non contractuel) »
Petite astuce :
CTRL + ENTER -> Lance la commande présente dans la ligne de commande.
SHIFT + ENTER -> Permet de faire un saut de ligne dans la ligne de commande sans lancer celle-ci.
Pour les questions suivantes voici quelques commandes qui pourraient vous être utiles :
match (n) return n
"match" agit presque comme un SELECT de SQL.
"return" renvoie l'ensemble des matchs.
Comme () désigne un noeud et que n est ici juste une variable, on va matcher avec l'ensemble des nœuds du graphes et donc récupérer l'intégralité des nœuds du graphe en retour ! On peut donc préférer sur un gros graphe rajouter un LIMIT 100 après le "return".
Il est possible de compter les nœuds en remplaçant "n" par COUNT(n) comme paramètre de retour.
Entraînez-vous sur Westeros !
Question
J'ai entendu dire que le clan des Starks avaient un grande influence sur l'univers, cependant, je ne m'y retrouve pas...
J'ai cru comprendre qu'il existait des nœuds clan comme celui-ci : (stark:clan { clanname : 'The Starks'}) et qu'ils pouvaient être liés à des personnages à l'aide de cette relation : (arya)-[:LIER{type : 'liendeclan'}]->(stark)
Pourriez vous m'aider en me montrant l'ensemble des Starks du graphe ?
Il va falloir utiliser la fonction MATCH (et RETURN) sur une relation.
Il peut être utile de préciser le type de noeud de la relation que l'on souhaite trouver.
Je vous aide (les * sont des trous) :
match ( * )-[result:LIER]->(:clan { *}) return *
Bravo !
match (:personnage)-[result:LIER]->(:clan { clanname : 'The Starks'}) return result
Ca devrait donner ce résultat :
Complément :
Vous pouvez essayer avec les Lanisters si vous voulez.
Si vous avez des doutes sur les clanname -> regardez dans le fichier exercice_1.cypher
Question
Merci, maintenant que je sais qui sont les Starks et les Lanister, il est temps que quelqu'un meurt, n'est-ce pas ?
Mais, dites-moi, qui a déjà tué qui ? (relation de label :TUE)
Cela ressemble vraiment à la précédente instruction.
Requête :
match (:personnage)-[result:TUE]->(:personnage)
return result
Hum, c'est pas génial... Je crois que je ne me rends pas compte si je ne sais pas à quel clan les différents personnages appartiennent...
Vous-pourriez m'aider ?
Juste après la ligne de "match" on peut ajouter des "optional match" afin d'obtenir des informations complémentaires !
Voici la requête
match (p1:personnage)-[result:TUE]->(p2:personnage)
optional match p1-[:LIER]->(c1:clan)
optional match p2-[:LIER]->(c2:clan)
return result,c1,c2
Hum, c'est complexe, mais j'y vois plus clair :
Complément :
Vous pouvez faire pareil avec ":AIME" si vous avez le temps et que vous êtes plus poétique.
Question
Bon, maintenant que je sais qui tue qui, à qui je peux faire confiance ?
Qui n'a pas de revanche à prendre en Westeros ?
Si on part du principe qu'un personnage n'a pas de revanche à prendre si aucun membre de son clan n'est mort, à qui puis-je me fier ?
Pour commencer, pour chaque personnage, on va devoir chercher son(ses) clan(s)
Une fois l'ensemble des clans de chaque personnage trouvé, il faut dans la même requête, réduire cette ensemble :
Pour cela on utilise la clause "WHERE" qui à l'image du SQL permet d'effectuer une restriction sur les données.
Dans une clause de ce type, on peut utiliser AND / OR / NOT...
Aussi on peut mettre une relation derrière un "WHERE".
On peut composer les relations : (c étant ici un des résultats du match, un nœud clan)
c<-[]-()<-[]-()
Voici la requête :
match (p:personnage)-[:LIER]->(c:clan)
where not(c<-[:LIER]-(:personnage)<-[:TUE]-())
return p,c
Je choisis la richesse ou l'île ?