Complémentaire : Grateful Dead Concerts
Exploitation de la base de données de démonstration
OrientDB est fournit avec une base de données de démonstration, permettant ainsi de se familiariser avec l'environnement et d'effectuer quelques requêtes. Nous allons donc utiliser cette base de donnée pour cet exercice.
Cette base contient les chansons chantées et écrites par le groupe de rock américain Grateful Dead, ainsi qu'un grand nombre d'artiste les ayant interprétées.
Elle est représentée par le modèle suivant :
Une chanson possède un nom, un type de chanson et le nombre de fois où elle a été chantée.
Un artiste possède seulement un nom.
Une chanson et un artiste sont liés par les relations "sung_by" et "written_by". Une chanson peut également être suivie d'une autre chanson lors d'un concert, cette relation est représentée par "followed_by".
Question
Question
Récupérer la liste des rid des chansons chantées par l'artiste Welnick
Les chansons chantées par un artiste sont représentées par la relation "sung_by". C'est un arc entrant, partant d'une chanson vers l'artiste.
Il faut utiliser la fonction in('nom_relation')
SELECT in('sung_by') FROM V WHERE name="Welnick" AND type="artist"
Question
Question
Même question que précédemment, mais en utilisant le mot-clé TRAVERSE
Il faut procéder par sous-requête. D'abord, récupérer les informations de l'artiste Welnick.
Ensuite, il faut appliquer le TRAVERSE à ce résultat
TRAVERSE in('sung_by') FROM (SELECT * FROM V WHERE name="Welnick" AND type="artist")
Question
Quelle différence notez-vous entre les deux résultats précédents ?
En utilisant TRAVERSE, le noeud représentant l'artiste Welnick reste présent dans les résultats.
En utilisant la méthode avec expand(), ce noeud n'est pas présent.
Conseil :
L'utilisation de TRAVERSE est préférable lors de la visualisation du graphe, afin de visualiser les relations entre les résultats et le noeud sur lequel on a effectué le TRAVERSE.
Si l'on souhaite avoir la liste des résultats seuls, alors l'utilisation de expand() est plus facile et répond mieux aux attentes.
Question
Question
Afficher le nom des artistes qui ont écrit les chansons chantées par Welnick
Il faut une nouvelle fois procéder par sous requête.
D'abord, il faut récupérer les chansons chantées par Welnick.
Depuis ce résultat, il faut sélectionner les arcs sortants "written_by"
SELECT expand(out('written_by')) FROM (SELECT expand(in('sung_by')) FROM V WHERE name="Welnick" and type="artist")
Question
Afficher les chansons chantées par au moins 2 artistes différents
Il faut sélectionner les noeuds de type "song"
Sur ces noeuds, il faut utiliser la fonction out('sung_by') pour récupérer les chanteurs. La fonction out() peut également être utilisé dans une clause WHERE.
La fonction size() peut être utilisée directement avec la fonction out() pour connaître le nombre de résultat
SELECT * FROM V WHERE type="song" AND out('sung_by').size() > 1
Question
Depuis la vue sous forme de graphe, ajoutez un nouveau noeud "Artist" avec votre prénom. Ensuite, ajouter un lien de façon à ce que la chanson "HEY BO DIDDLEY" ait déjà été chantée par vous-même.
Lors de l'ajout du noeud, il ne faut pas oublier de préciser le type de ce noeud.
Pour ajouter un lien, il faut cliquer sur un noeud, puis sur l'icône lien et enfin sélectionner le noeud destination.
Attention au sens de la relation !
Question
Afficher le nom des artistes qui ont chanté au moins 3 fois des chansons écrites par Hunter. Il faut également faire apparaître, pour chaque artiste, le nombre total de chansons chantées écrites par Hunter.
Il faut d'abord récupérer toutes les chansons écrites par Hunter, puis les chanteurs de ces chansons.
Depuis ce résultat, il ne faut garder que le nom des artistes, et pour chacun d'eux compter le nombre de chansons chantées.
Sur le résultat précédent, il ne faut garder que les chanteurs qui ont chantées au moins 3 fois les chansons.
Il faut penser à entourer la requête précédente de parenthèse, afin de l'exécuter comme sous-requête.
SELECT * FROM (requête précédente) WHERE ...
SELECT * FROM (SELECT name, count(*) AS nb FROM (SELECT expand(in('written_by').out('sung_by')) FROM V WHERE name="Hunter") GROUP BY name) WHERE nb > 2