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

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

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

Indice

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

1
CREATE(gregor:personnage { name : 'Gregor Clegane', nickname : 'The Mountain' })
2
CREATE(oberyn:personnage { name : 'Oberyn Martell', nickname : 'The Viper' })
3
CREATE(...)-[...]->(...)
4
...

Indice

1
CREATE(gregor:personnage { name : 'Gregor Clegane', nickname : 'The Mountain' })
2
CREATE(oberyn:personnage { name : 'Oberyn Martell', nickname : 'The Viper' })
3
CREATE(gregor)-[...]->(oberyn)
4
RETURN gregor, oberyn

Indice

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

Solution

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

Question

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

Solution

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

1
//GameOfThrones:
2
3
//sans clan :
4
CREATE (sansclan:clan { clanname : 'Clan des sans lien de sang'})
5
6
CREATE (hodor:personnage { name : 'Hodor', nickname : 'I am the only good actor here !' })
7
CREATE (khal:personnage { name : 'Khal Drogo', nickname : 'Horse Man' })
8
CREATE (petyr:personnage { name : 'Petyr Baelish', nickname : 'LittleFinger' })
9
CREATE (shae:personnage { name : 'Shae for the Imp', nickname : 'Dead' })
10
11
12
//lanister :
13
CREATE (lanister:clan { clanname : 'The Lannisters'})
14
15
CREATE (tyrion:personnage { name : 'Tyrion Lannister', nickname : 'The Imp' })
16
CREATE (tywin:personnage { name : 'Tywin Lannister', nickname : 'Father of the Lannisters' })
17
CREATE (jaime:personnage { name : 'Jaime Lannister', nickname : 'King Slayer' })
18
CREATE (cersei:personnage { name : 'Cersei Lannister', nickname : 'Brother Lover' })
19
CREATE (joffrey:personnage { name : 'Joffrey Lannister', nickname : 'Mad King 2' })
20
21
22
//baratheons :
23
CREATE (baratheon:clan { clanname : 'The Baratheons'})
24
25
CREATE (robert:personnage { name : 'Robert Baratheon', nickname : 'King Robert' })
26
CREATE (renly:personnage { name : 'Renly Baratheon', nickname : 'King Gay' })
27
CREATE (stannis:personnage { name : 'Stannis Baratheon', nickname : 'Stéphane' })
28
CREATE (gendry:personnage { name : 'Gendry ???Baratheon', nickname : 'What happened to my story ?' })
29
30
31
//tyrells :
32
CREATE (tyrell:clan { clanname : 'The Tyrells'})
33
34
CREATE (margeary:personnage { name : 'Margeary Tyrell', nickname : 'Tyrell asset' })
35
CREATE (loras:personnage { name : 'Loras Tyrell', nickname : 'King Gay Knight' })
36
37
38
//targaryens :
39
CREATE (targaryen:clan { clanname : 'The Targaryen'})
40
41
CREATE (daenerys:personnage { name : 'Daenerys Targaryen', nickname : 'Mother of Dragons' })
42
CREATE (viserys:personnage { name : 'Viserys Targaryen', nickname : 'Gold Head' })
43
44
45
//Stark :
46
CREATE (stark:clan { clanname : 'The Starks'})
47
48
CREATE (arya:personnage { name : 'Arya Stark', nickname : 'I am 20' })
49
CREATE (sansa:personnage { name : 'Sansa Stark', nickname : 'I am sorry I can t smile.' })
50
CREATE (rosse:personnage { name : 'Roose Bolton', nickname : 'Come by the house I ll kill you' })
51
CREATE (eddard:personnage { name : 'Eddard Stark', nickname : 'Whhhhy ???' })
52
CREATE (robb:personnage { name : 'Robb Stark', nickname : 'King of the North' })
53
CREATE (john:personnage { name : 'John Snow', nickname : 'The Bastard' })
54
CREATE (bran:personnage { name : 'Bran Stark', nickname : 'Stop boring me' })
55
56
57
//tullys :
58
CREATE (tully:clan { clanname : 'The Tullys'})
59
60
CREATE (catelyn:personnage { name : 'Catelyn Stark', nickname : 'Mother of Stark ?' })
61
CREATE (lysa:personnage { name : 'Lyse Tully', nickname : 'Crazy' })
62
63
64
//greyjoys :
65
CREATE (greyjoy:clan { clanname : 'The Greyjoys'})
66
67
CREATE (theon:personnage { name : 'Theon Greyjoy', nickname : 'The enuque' })
68
CREATE (balon:personnage { name : 'Balon Greyjoy', nickname : 'Nicest father ever' })
69
70
71
//actions :
72
73
CREATE (tyrion)-[:TUE{type : 'homicide'}]->(shae)
74
CREATE (tyrion)-[:TUE{type : 'homicide'}]->(tywin)
75
CREATE (petyr)-[:TUE{type : 'homicide'}]->(joffrey)
76
CREATE (stannis)-[:TUE{type : 'homicide'}]->(renly)
77
CREATE (khal)-[:TUE{type : 'homicide'}]->(khal)
78
CREATE (khal)-[:TUE{type : 'homicide'}]->(viserys)
79
CREATE (joffrey)-[:TUE{type : 'homicide'}]->(eddard)
80
CREATE (rosse)-[:TUE{type : 'homicide'}]->(robb)
81
CREATE (rosse)-[:TUE{type : 'homicide'}]->(catelyn)
82
CREATE (petyr)-[:TUE{type : 'homicide'}]->(lysa)
83
84
CREATE (jaime)-[:AIME{type : 'amour'}]->(cersei)
85
CREATE (cersei)-[:AIME{type : 'amour'}]->(jaime)
86
CREATE (tyrion)-[:AIME{type : 'amour'}]->(shae)
87
CREATE (shae)-[:AIME{type : 'amour'}]->(tywin)
88
CREATE (robert)-[:AIME{type : 'amour'}]->(cersei)
89
CREATE (loras)-[:AIME{type : 'amour'}]->(renly)
90
CREATE (renly)-[:AIME{type : 'amour'}]->(loras)
91
CREATE (margeary)-[:AIME{type : 'amour'}]->(joffrey)
92
CREATE (joffrey)-[:AIME{type : 'amour'}]->(margeary)
93
CREATE (khal)-[:AIME{type : 'amour'}]->(daenerys)
94
CREATE (daenerys)-[:AIME{type : 'amour'}]->(khal)
95
CREATE (petyr)-[:AIME{type : 'amour'}]->(catelyn)
96
CREATE (eddard)-[:AIME{type : 'amour'}]->(catelyn)
97
CREATE (catelyn)-[:AIME{type : 'amour'}]->(eddard)
98
99
100
//liens de clan :
101
102
CREATE (theon)-[:LIER{type : 'liendeclan'}]->(greyjoy)
103
CREATE (balon)-[:LIER{type : 'liendeclan'}]->(greyjoy)
104
105
CREATE (khal)-[:LIER{type : 'liendeclan'}]->(sansclan)
106
CREATE (john)-[:LIER{type : 'liendeclan'}]->(sansclan)
107
CREATE (petyr)-[:LIER{type : 'liendeclan'}]->(sansclan)
108
CREATE (gendry)-[:LIER{type : 'liendeclan'}]->(sansclan)
109
CREATE (hodor)-[:LIER{type : 'liendeclan'}]->(sansclan)
110
111
CREATE (gendry)-[:LIER{type : 'liendeclan'}]->(baratheon)
112
CREATE (joffrey)-[:LIER{type : 'liendeclan'}]->(baratheon)
113
CREATE (robert)-[:LIER{type : 'liendeclan'}]->(baratheon)
114
CREATE (renly)-[:LIER{type : 'liendeclan'}]->(baratheon)
115
CREATE (stannis)-[:LIER{type : 'liendeclan'}]->(baratheon)
116
117
CREATE (margeary)-[:LIER{type : 'liendeclan'}]->(tyrell)
118
CREATE (loras)-[:LIER{type : 'liendeclan'}]->(tyrell)
119
120
CREATE (daenerys)-[:LIER{type : 'liendeclan'}]->(targaryen)
121
CREATE (viserys)-[:LIER{type : 'liendeclan'}]->(targaryen)
122
123
CREATE (lysa)-[:LIER{type : 'liendeclan'}]->(tully)
124
CREATE (catelyn)-[:LIER{type : 'liendeclan'}]->(tully)
125
126
CREATE (arya)-[:LIER{type : 'liendeclan'}]->(stark)
127
CREATE (hodor)-[:LIER{type : 'liendeclan'}]->(stark)
128
CREATE (rosse)-[:LIER{type : 'liendeclan'}]->(stark)
129
CREATE (sansa)-[:LIER{type : 'liendeclan'}]->(stark)
130
CREATE (petyr)-[:LIER{type : 'liendeclan'}]->(stark)
131
CREATE (eddard)-[:LIER{type : 'liendeclan'}]->(stark)
132
CREATE (robb)-[:LIER{type : 'liendeclan'}]->(stark)
133
CREATE (john)-[:LIER{type : 'liendeclan'}]->(stark)
134
CREATE (bran)-[:LIER{type : 'liendeclan'}]->(stark)
135
CREATE (catelyn)-[:LIER{type : 'liendeclan'}]->(stark)
136
CREATE (theon)-[:LIER{type : 'liendeclan'}]->(stark)
137
138
CREATE (shae)-[:LIER{type : 'liendeclan'}]->(lanister)
139
CREATE (rosse)-[:LIER{type : 'liendeclan'}]->(lanister)
140
CREATE (tyrion)-[:LIER{type : 'liendeclan'}]->(lanister)
141
CREATE (tywin)-[:LIER{type : 'liendeclan'}]->(lanister)
142
CREATE (jaime)-[:LIER{type : 'liendeclan'}]->(lanister)
143
CREATE (cersei)-[:LIER{type : 'liendeclan'}]->(lanister)
144
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

1
match (n) return n

Question

Affichez à présent la liste des clans.

Indice

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

Trouver des nœuds et des relations

Solution

1
match (n:clan) return n

Question

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

Solution

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

Question

Affichez le clan qui a pour clanname The Starks.

Solution

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

Question

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

Indice

1
match (c:clan {clanname:'The Starks'})<-[...]-(...) return ...

Indice

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

Solution

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

Question

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

Indice

1
match (:personnage)-[...]->(:personnage) 
2
return result

Solution

1
match (:personnage)-[result:TUE]->(:personnage) 
2
return result