Ceci est une ancienne révision du document !
Conectez vous à Oracle et exécutez la commande:
SQL> @facebook-bdle
On considère une base de données qui contient des informations (fictives) sur des utilisateurs Facebook et leurs amis. Ces informations sont stockées dans les deux tables suivantes :
Users(id, name, age) Edges(usr, neighbor)
Les clés primaires sont soulignées. Les attributs usr et neighbor dans la table Edges sont des clés étrangères. La table Users contient 4039 utilisateurs, la table Edges contient 88234 arcs. Le graphe contient 1612010 triangles (voir ce site pour plus d'informations: http://snap.stanford.edu/data/egonets-Facebook.html). Une description de ces tables peut être obtenue avec les commandes suivantes:
DESC Users DESC Edges
Par défaut le graphe est dirigé (e.g on stocke dans Edges seulement les arcs a → b sans stocker aussi les arcs b → a).
Écrivez une requête SQL sans récursivité qui retourne les voisins de l'utilisateurs 'Kendall' (il existe une seule personne avec ce nom), en considérant que le graphe est dirigé. Écrivez la même requête en considérant que le graphe est non-dirigé.
Résultat: graphe dirigé 7 lignes, graphe non dirigé 9 lignes
Écrivez une requête SQL sans récursivité pour connaître les noms des amis des amis de Kendall (à distance 2 de Kendall), en considérant d'abord que le graphe est dirigé. Même question pour un graphe non dirigé.
Résultat: graphe dirigé 52 lignes, graphe non dirigé 548 lignes
Donnez les noms des utilisateurs atteignables à une distance donnée à partir de l'utilisateur 'Kendall'. Essayez la requête pour plusieurs distances (pour distance 2 vérifiez que vous obtenez le même résultat que pour la question 2). Donnez une solution avec une requête hiérarchique (clause CONNECT BY) et une version récursive (clause WITH). Le graphe est considéré comme étant dirigé.
Résultat: 52 lignes pour la profondeur 2
Affichez tous les chemins de longueur inférieure ou égale à une distance donnée entre 'Kendall' et 'Ricci' en utilisant CONNECT BY. Les requêtes doivent afficher pour chaque chemin sa description et sa longueur. A titre d'exemple, un chemin possible entre Kendall et Ricci est : /Kendall/Shamika/Ricci de longueur 2. Le graphe est considéré comme étant dirigé (Indication : utiliser SYS_CONNECT_BY_PATH dans la requête hiérarchique). Même question en utilisant une requête récursive (clause WITH). Pour construire le chemin on peut concaténer deux chaînes de caractères en utilisant || (Exemple: '/' || chaîne ajoute '/' devant chaîne).
Résultat: 13 lignes pour profondeur⇐ 4
Donnez une requête qui affiche, pour les utilisateurs 'Kendall' et 'Baylee' l'identifiant de chaque utilisateur atteignable à une profondeur d'exploration de maximum 3, avec la longueur du plus court chemin vers cet utilisateur (les degrés de séparation entre Kendall ou Baylee et les autres utilisateurs). Donnez une solution en utilisant la clause CONNECT BY. (Indication : utiliser la clause CONNECT_BY_ROOT dans la requête hiérarchique). Même question en utilisant une quête récursive (clause WITH). Le graphe est considéré comme étant dirigé.
Résultat: 154 lignes
Écrivez une requête qui affiche les noms des utilisateurs qui sont atteignables à la fois à partir de 'Kendall' et de 'Donny' par des parcours à une profondeur maximum 3. Donnez une solution en utilisant la clause WITH.
Résultat: 223 ligne(s) sélectionnée(s).
Écrivez en SQL sans récursivité la requête qui calcule le nombre total de triangles contenant l'utilisateur 'Kendall'. Le graphe sera transformé d'abord dans un graphe non dirigé avec la commande suivante :
CREATE VIEW edges_view(usr, neighbor) AS( SELECT usr, neighbor FROM edges UNION ALL SELECT neighbor,usr FROM edges);
Résultat: 1612010
Calculez le nombre de triangles contenant 'Kendall' avec une requête hiérarchique (CONNECT BY) et une requête récursive (WITH).
Résultat: 34
Écrivez le code PL/SQL permettant de calculer les noeuds atteignables à partir d'un utilisateur donné comme paramètre. Vérifiez la procédure avec le script read_start_node_fermeture.sql. Créer une table temporaire pour stocker les noeuds distincts rencontrés pendant la traversée: On s'arrête lorsqu'il n'y a plus de nouveau noeud à ajouter à la table temporaire.
CREATE GLOBAL TEMPORARY TABLE fermeture (id INTEGER PRIMARY KEY); @proc_fermeture_transitive @read_start_node_fermeture DROP TABLE fermeture; DROP TABLE fermeture;
Le fichier read_start_node_fermeture.sql est donné à la fin de l'énoncé.
Écrivez le code PL/SQL permettant de calculer le nombre de triangles qui contiennent un utilisateur donné comme paramètre. Le code sera écrit dans le fichier proc_compter_triangles.sql. Afin de le tester, utilisez les commandes suivantes :
@proc_compter_triangles @read_start_node_triangles read_start_node_fermeture.sql : ACCEPT start_user PROMPT "Donnez un nom d'utilisateur : " SET SERVEROUTPUT ON SET VERIFY OFF EXECUTE fermeture_transitive('&start_user'); read_start_node_triangles.sql : ACCEPT start_user PROMPT "Donnez un nom d'utilisateur : " SET SERVEROUTPUT ON SET VERIFY OFF EXECUTE proc_compter_triangles('&start_user');