Introduction à Neo4J

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 :

Création de la bdd Game Of Thrones

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

Indice

On entre les commandes dans le champ en jaune.

Indice

Vous pouvez vous aider des scripts déjà réalisé dans le menu "étoile" !

Solution

Il suffisait d'utiliser la commande CREATE de la manière suivante :

1
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 :

1
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' »

Indice

On utilise toujours la fonction CREATE

Indice

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

Solution

Voici la requête :

1
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 :

1
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 ?

Indice

Il va falloir utiliser la fonction MATCH (et RETURN) sur une relation.

Indice

Il peut être utile de préciser le type de noeud de la relation que l'on souhaite trouver.

Indice

Je vous aide (les * sont des trous) :

match ( * )-[result:LIER]->(:clan { *}) return *

Solution

Bravo !

1
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)

Indice

Cela ressemble vraiment à la précédente instruction.

Indice

Requête :

1
match (:personnage)-[result:TUE]->(:personnage) 
2
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 ?

Indice

Juste après la ligne de "match" on peut ajouter des "optional match" afin d'obtenir des informations complémentaires !

Solution

Voici la requête

1
match (p1:personnage)-[result:TUE]->(p2:personnage) 
2
optional match p1-[:LIER]->(c1:clan)
3
optional match p2-[:LIER]->(c2:clan)
4
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 ?

Indice

Pour commencer, pour chaque personnage, on va devoir chercher son(ses) clan(s)

Indice

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".

Indice

On peut composer les relations : (c étant ici un des résultats du match, un nœud clan)

c<-[]-()<-[]-()

Solution

Voici la requête :

1
match (p:personnage)-[:LIER]->(c:clan)
2
where not(c<-[:LIER]-(:personnage)<-[:TUE]-())
3
return p,c

Je choisis la richesse ou l'île ?

  1. http://www.gameof-thrones.fr

PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Ulysse Meyer, 2014 (Contributions : Stéphane Crozat, les étudiants de l'UTC) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)