De Neo4J à Game of Thrones

[1h]

Un beau matin, vous vous réveillez en Westeros, le monde de Game Of Thrones, sans aucune connaissance historique. Afin d'y survivre, il va falloir intégrer les informations du royaume. Nous allons pour cela utiliser une base de données orientée graphe Neo4J.

Avant toute chose vous allez vous allez devoir vous ajouter au monde que vous venez de rejoindre.

Créer un nouveau personnage avec votre nom et prénom.

Le label est :personnage.

Les propriétés sont :

{name : '...', nickname : '...' }

CREATE(n:personnage { name : 'Mon_nom', nickname : 'Mon_prénom' }) RETURN n

Seconde chose, il faut apprendre à créer des relations, car le monde de Game Of Thrones est très complexe.

Créez deux personnages et exprimez une relation qui les relie.

Par exemple, un des combats les plus célèbres oppose Oberyn Martell, dit The Viper et Gregor Clegane, dir The Mountain. Gregor Clegane tue Oberyn Martell en duel.

Créer d'abord les deux nœuds avec l'instruction CREATE.

CREATE(gregor:personnage { name : '...', nickname : '...' })
CREATE(oberyn:...)
...

Toujours avec CREATE, créer une relation de type « :TUE » entre les deux nœuds avec comme attribut : « type : 'duel' »

CREATE(gregor:personnage { name : 'Gregor Clegane', nickname : 'The Mountain' })
CREATE(oberyn:personnage { name : 'Oberyn Martell', nickname : 'The Viper' })
CREATE(...)-[...]->(...)
...
CREATE(gregor:personnage { name : 'Gregor Clegane', nickname : 'The Mountain' })
CREATE(oberyn:personnage { name : 'Oberyn Martell', nickname : 'The Viper' })
CREATE(gregor)-[...]->(oberyn)
RETURN gregor, oberyn
CREATE(gregor:personnage { name : 'Gregor Clegane', nickname : 'The Mountain' })
CREATE(oberyn:personnage { name : 'Oberyn Martell', nickname : 'The Viper' })
CREATE(gregor)-[:TUE { type : ... }]->(oberyn)
RETURN gregor, oberyn
CREATE(gregor:personnage { name : 'Gregor Clegane', nickname : 'The Mountain' })
CREATE(oberyn:personnage { name : 'Oberyn Martell', nickname : 'The Viper' })
CREATE (gregor)-[:TUE { type : 'duel' }]->(oberyn)
RETURN gregor, oberyn

Affichez l'ensemble des nœuds présents dans votre base de données.

match (n) return n

Nous pouvons à présent alimenter notre base d'un ensemble de connaissance dont nous disposons. Pour cela copier et exécuter le code Cypher ci-après.

//GameOfThrones:
//sans clan :
CREATE (sansclan:clan { clanname : 'Clan des sans lien de sang'})
CREATE (hodor:personnage { name : 'Hodor', nickname : 'I am the only good actor here !' })
CREATE (khal:personnage { name : 'Khal Drogo', nickname : 'Horse Man' })
CREATE (petyr:personnage { name : 'Petyr Baelish', nickname : 'LittleFinger' })
CREATE (shae:personnage { name : 'Shae for the Imp', nickname : 'Dead' })
//lanister :
CREATE (lanister:clan { clanname : 'The Lannisters'})
CREATE (tyrion:personnage { name : 'Tyrion Lannister', nickname : 'The Imp' })
CREATE (tywin:personnage { name : 'Tywin Lannister', nickname : 'Father of the Lannisters' })
CREATE (jaime:personnage { name : 'Jaime Lannister', nickname : 'King Slayer' })
CREATE (cersei:personnage { name : 'Cersei Lannister', nickname : 'Brother Lover' })
CREATE (joffrey:personnage { name : 'Joffrey Lannister', nickname : 'Mad King 2' })
//baratheons :
CREATE (baratheon:clan { clanname : 'The Baratheons'})
CREATE (robert:personnage { name : 'Robert Baratheon', nickname : 'King Robert' })
CREATE (renly:personnage { name : 'Renly Baratheon', nickname : 'King Gay' })
CREATE (stannis:personnage { name : 'Stannis Baratheon', nickname : 'Stéphane' })
CREATE (gendry:personnage { name : 'Gendry ???Baratheon', nickname : 'What happened to my story ?' })
//tyrells :
CREATE (tyrell:clan { clanname : 'The Tyrells'})
CREATE (margeary:personnage { name : 'Margeary Tyrell', nickname : 'Tyrell asset' })
CREATE (loras:personnage { name : 'Loras Tyrell', nickname : 'King Gay Knight' })
//targaryens :
CREATE (targaryen:clan { clanname : 'The Targaryen'})
CREATE (daenerys:personnage { name : 'Daenerys Targaryen', nickname : 'Mother of Dragons' })
CREATE (viserys:personnage { name : 'Viserys Targaryen', nickname : 'Gold Head' })
//Stark :
CREATE (stark:clan { clanname : 'The Starks'})
CREATE (arya:personnage { name : 'Arya Stark', nickname : 'I am 20' })
CREATE (sansa:personnage { name : 'Sansa Stark', nickname : 'I am sorry I can t smile.' })
CREATE (rosse:personnage { name : 'Roose Bolton', nickname : 'Come by the house I ll kill you' })
CREATE (eddard:personnage { name : 'Eddard Stark', nickname : 'Whhhhy ???' })
CREATE (robb:personnage { name : 'Robb Stark', nickname : 'King of the North' })
CREATE (john:personnage { name : 'John Snow', nickname : 'The Bastard' })
CREATE (bran:personnage { name : 'Bran Stark', nickname : 'Stop boring me' })
//tullys :
CREATE (tully:clan { clanname : 'The Tullys'})
CREATE (catelyn:personnage { name : 'Catelyn Stark', nickname : 'Mother of Stark ?' })
CREATE (lysa:personnage { name : 'Lyse Tully', nickname : 'Crazy' })
//greyjoys :
CREATE (greyjoy:clan { clanname : 'The Greyjoys'})
CREATE (theon:personnage { name : 'Theon Greyjoy', nickname : 'The enuque' })
CREATE (balon:personnage { name : 'Balon Greyjoy', nickname : 'Nicest father ever' })
//actions :
CREATE (tyrion)-[:TUE{type : 'homicide'}]->(shae)
CREATE (tyrion)-[:TUE{type : 'homicide'}]->(tywin)
CREATE (petyr)-[:TUE{type : 'homicide'}]->(joffrey)
CREATE (stannis)-[:TUE{type : 'homicide'}]->(renly)
CREATE (khal)-[:TUE{type : 'homicide'}]->(khal)
CREATE (khal)-[:TUE{type : 'homicide'}]->(viserys)
CREATE (joffrey)-[:TUE{type : 'homicide'}]->(eddard)
CREATE (rosse)-[:TUE{type : 'homicide'}]->(robb)
CREATE (rosse)-[:TUE{type : 'homicide'}]->(catelyn)
CREATE (petyr)-[:TUE{type : 'homicide'}]->(lysa)
CREATE (jaime)-[:AIME{type : 'amour'}]->(cersei)
CREATE (cersei)-[:AIME{type : 'amour'}]->(jaime)
CREATE (tyrion)-[:AIME{type : 'amour'}]->(shae)
CREATE (shae)-[:AIME{type : 'amour'}]->(tywin)
CREATE (robert)-[:AIME{type : 'amour'}]->(cersei)
CREATE (loras)-[:AIME{type : 'amour'}]->(renly)
CREATE (renly)-[:AIME{type : 'amour'}]->(loras)
CREATE (margeary)-[:AIME{type : 'amour'}]->(joffrey)
CREATE (joffrey)-[:AIME{type : 'amour'}]->(margeary)
CREATE (khal)-[:AIME{type : 'amour'}]->(daenerys)
CREATE (daenerys)-[:AIME{type : 'amour'}]->(khal)
CREATE (petyr)-[:AIME{type : 'amour'}]->(catelyn)
CREATE (eddard)-[:AIME{type : 'amour'}]->(catelyn)
CREATE (catelyn)-[:AIME{type : 'amour'}]->(eddard)
//liens de clan :
CREATE (theon)-[:LIER{type : 'liendeclan'}]->(greyjoy)
CREATE (balon)-[:LIER{type : 'liendeclan'}]->(greyjoy)
CREATE (khal)-[:LIER{type : 'liendeclan'}]->(sansclan)
CREATE (john)-[:LIER{type : 'liendeclan'}]->(sansclan)
CREATE (petyr)-[:LIER{type : 'liendeclan'}]->(sansclan)
CREATE (gendry)-[:LIER{type : 'liendeclan'}]->(sansclan)
CREATE (hodor)-[:LIER{type : 'liendeclan'}]->(sansclan)
CREATE (gendry)-[:LIER{type : 'liendeclan'}]->(baratheon)
CREATE (joffrey)-[:LIER{type : 'liendeclan'}]->(baratheon)
CREATE (robert)-[:LIER{type : 'liendeclan'}]->(baratheon)
CREATE (renly)-[:LIER{type : 'liendeclan'}]->(baratheon)
CREATE (stannis)-[:LIER{type : 'liendeclan'}]->(baratheon)
CREATE (margeary)-[:LIER{type : 'liendeclan'}]->(tyrell)
CREATE (loras)-[:LIER{type : 'liendeclan'}]->(tyrell)
CREATE (daenerys)-[:LIER{type : 'liendeclan'}]->(targaryen)
CREATE (viserys)-[:LIER{type : 'liendeclan'}]->(targaryen)
CREATE (lysa)-[:LIER{type : 'liendeclan'}]->(tully)
CREATE (catelyn)-[:LIER{type : 'liendeclan'}]->(tully)
CREATE (arya)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (hodor)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (rosse)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (sansa)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (petyr)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (eddard)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (robb)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (john)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (bran)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (catelyn)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (theon)-[:LIER{type : 'liendeclan'}]->(stark)
CREATE (shae)-[:LIER{type : 'liendeclan'}]->(lanister)
CREATE (rosse)-[:LIER{type : 'liendeclan'}]->(lanister)
CREATE (tyrion)-[:LIER{type : 'liendeclan'}]->(lanister)
CREATE (tywin)-[:LIER{type : 'liendeclan'}]->(lanister)
CREATE (jaime)-[:LIER{type : 'liendeclan'}]->(lanister)
CREATE (cersei)-[:LIER{type : 'liendeclan'}]->(lanister)
CREATE (joffrey)-[:LIER{type : 'liendeclan'}]->(lanister)

Affichez l'ensemble des nœuds présents dans votre base de données.

Manipulez le graphe quelques minutes afin de vous faire une idée des données.

match (n) return n

Affichez à présent la liste des clans.

On utilise le label :clan après l'alias de nœud n.

Trouver des nœuds et des relations

match (n:clan) return n

Afficher le nœud qui possède comme nickname The Imp.

match (n {nickname:'The Imp'}) return n

Affichez le clan qui a pour clanname The Starks.

match (c:clan {clanname:'The Starks'}) return c

Affichez tous les personnages qui ont une relation :LIER avec le clan The Starks.

match (c:clan {clanname:'The Starks'})<-[...]-(...) return ...
match (c:clan {clanname:'The Starks'})<-[l:...]-(p) return l,c,p
match (c:clan {clanname:'The Starks'})<-[l:LIER]-(p) return l,c,p

Affichez toutes les relations de type :TUE, pour savoir qui a tué qui.

match (:personnage)-[...]->(:personnage) 
return result
match (:personnage)-[result:TUE]->(:personnage) 
return result
AccueilRéférence d'objets avec Neo4J (BD orientée graphe) > Exercice > Exercice : De Neo4J à Game of Thrones< PrécédentSuivant >