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.
Question
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.
Indice
Le label est :personnage
.
Indice
Les propriétés sont :
{name : '...', nickname : '...' }
Solution
CREATE(n:personnage { name : 'Mon_nom', nickname : 'Mon_prénom' }) RETURN n
Question
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.
Indice
Créer d'abord les deux nœuds avec l'instruction CREATE.
CREATE(gregor:personnage { name : '...', nickname : '...' })
CREATE(oberyn:...)
...
Indice
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(...)-[...]->(...)
...
Indice
CREATE(gregor:personnage { name : 'Gregor Clegane', nickname : 'The Mountain' })
CREATE(oberyn:personnage { name : 'Oberyn Martell', nickname : 'The Viper' })
CREATE(gregor)-[...]->(oberyn)
RETURN gregor, oberyn
Indice
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
Solution
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
Question
Affichez l'ensemble des nœuds présents dans votre base de données.
Solution
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)
Question
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.
Solution
match (n) return n
Question
Question
Afficher le nœud qui possède comme nickname The Imp.
Solution
match (n {nickname:'The Imp'}) return n
Question
Affichez le clan qui a pour clanname The Starks.
Solution
match (c:clan {clanname:'The Starks'}) return c