Bases de Données / Databases

Site Web de l'équipe BD du LIP6 / LIP6 DB Web Site

Outils pour utilisateurs

Outils du site


site:enseignement:master:bdle:tmes:algebrespark

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
site:enseignement:master:bdle:tmes:algebrespark [25/10/2017 17:44] – [Exercice 1: Requêtes simples sur les données de Yago] hubertsite:enseignement:master:bdle:tmes:algebrespark [09/10/2018 14:12] (Version actuelle) amine
Ligne 2: Ligne 2:
  
  
-====== [TME II-3] Algèbre Spark: Dataset ======+====== [TME II-2] Algèbre Spark: Dataset ======
 Ce TME aborde le traitement de requêtes Sparql dans la plateforme Spark. Ce TME aborde le traitement de requêtes Sparql dans la plateforme Spark.
   * Formulation des requêtes dans le langage Scala avec les API de Spark RDD et Dataset.   * Formulation des requêtes dans le langage Scala avec les API de Spark RDD et Dataset.
Ligne 17: Ligne 17:
 </code> </code>
  
 +<showif isloggedin>
 +**TODO (oct 2017): page MPI pour sparql endpoint sur Yago**
 +</showif>
  
 Aller dans votre répertoire de travail et lancer le spark-shell avec l'option <fc #ff0000>--driver-memory 10G</fc> Aller dans votre répertoire de travail et lancer le spark-shell avec l'option <fc #ff0000>--driver-memory 10G</fc>
Ligne 37: Ligne 40:
 Exemple, soient les trois triplets suivants : Exemple, soient les trois triplets suivants :
   (james joue guitare) (marie joue piano) (james ami_de marie) (marie  ami_de james)   (james joue guitare) (marie joue piano) (james ami_de marie) (marie  ami_de james)
-le motif ( ?x joue piano) retourne la liaison ?x->james+le motif ( ?x joue piano) retourne la liaison ?x->marie
 le motif ( ?x joue ?y) retourne les liaisons ?x->james, ?y-> guitare d’une part et  le motif ( ?x joue ?y) retourne les liaisons ?x->james, ?y-> guitare d’une part et 
 ?x->maire, ?y->piano d’autre part. ?x->maire, ?y->piano d’autre part.
Ligne 50: Ligne 53:
  
 ===== Exercice 1: Requêtes simples sur les données de Yago ===== ===== Exercice 1: Requêtes simples sur les données de Yago =====
 +
 +Lire un exemple de données 
 +<code>
 +more /Infos/bd/spark/dataset/yago/yagoMiniSample.txt 
 +</code>
 +Lire la liste des propriétés
 +<code>
 +more /Infos/bd/spark/dataset/yago/yagoFacts5M_properties.txt
 +</code>
  
 ===Charger le dataset YAGO=== ===Charger le dataset YAGO===
Ligne 130: Ligne 142:
  
 ===R3: Les leaders parisiens === ===R3: Les leaders parisiens ===
 +
 +La requête est une **étoile** formée de deux triplets 
 <code sparql> <code sparql>
     ?x <livesIn> <Paris> .     ?x <livesIn> <Paris> .
     ?x <isLeaderOf> ?z     ?x <isLeaderOf> ?z
 </code> </code>
 +
 +
 +<showif isloggedin>
 +**<fc #008000>REPONSE</fc>** 
 + <code scala>
 +val t1 = yago.where("prop = '<livesIn>' and objet = '<Paris>'").
 +    withColumnRenamed("sujet","x").
 +    select("x")
 +
 +val t2 = yago.where("prop = '<isLeaderOf>' ").
 +    withColumnRenamed("sujet","x").
 +    withColumnRenamed("objet","z").
 +    select("x","z")
 +
 +val t1t2 = t1.join(t2, "x")
 +t1t2.show(5)
 + </code>
 +</showif>
 +
  
 Le résultat doit être: Le résultat doit être:
Ligne 143: Ligne 176:
 +--------------------+--------------------+ +--------------------+--------------------+
 </code> </code>
 +
 +
 +===R4: Les joueurs du royaume uni. ===
 +
 +La requête est un **chemin** formé de deux triplets 
 +<code sparql>
 +      ?x <playsFor> ?y .
 +                    ?y <isLocatedIn> <United_Kingdom>
 +</code>
 +
 +<showif isloggedin>
 +**<fc #008000>REPONSE</fc>** 
 + <code scala>
 +val t1 = yago.where("prop = '<playsFor>'").
 +    withColumnRenamed("sujet","x").
 +    withColumnRenamed("objet","y").
 +    select("x","y")
 +
 +val t2 = yago.where("prop = '<isLocatedIn>' and objet = '<United_Kingdom>'").
 +    withColumnRenamed("sujet","y").
 +    select("y")
 +
 +val t1t2 = t1.join(t2, "y")
 +t1t2.show(5)
 + </code>
 +</showif>
 +
 +Les 5 premiers éléments du résultat sont :
 +<code>
 +|                  |                  |
 ++--------------------+--------------------+
 +|   <Royal_Air_Force>     <George_Ayres>|
 +|   <Royal_Air_Force>|<Jack_Jones_(foot...|
 +|   <Royal_Air_Force>|<John_Hinton_(foo...|
 +|<University_of_Ed...|<James_Craigen_(f...|
 +|<University_of_Ed...|    <Ronald_Brebner>|
 ++--------------------+--------------------+
 +</code>
 +
 +
 +
 +
 +===R5: Les acteurs qui influencent des créateurs ===
 +
 +La requête est un **flocon** (ou snowflake) formé de 5 triplets : 
 +<code sparql>
 +   ?x <isCitizenOf> ?y .
 +   ?x <actedIn> ?z .
 +   ?x <influences> ?t .
 +                   ?t <livesIn> ?u .
 +                   ?t <created> ?v
 +</code>
 +
 +<showif isloggedin>
 +**<fc #008000>REPONSE</fc>** 
 + <code scala>
 +val t1 = yago.where("prop = '<isCitizenOf>'").
 +    withColumnRenamed("sujet","x").
 +    withColumnRenamed("objet","y").
 +    select("x","y")
 +
 +val t2 = yago.where("prop = '<actedIn>'").
 +    withColumnRenamed("sujet","x").
 +    withColumnRenamed("objet","z").
 +    select("x","z")
 +
 +val t3 = yago.where("prop = '<influences>'").
 +    withColumnRenamed("sujet","x").
 +    withColumnRenamed("objet","t").
 +    select("x", "t")
 +
 +val t4 = yago.where("prop = '<livesIn>'").
 +    withColumnRenamed("sujet","t").
 +    withColumnRenamed("objet","u").
 +    select("t","u")
 +
 +val t5 = yago.where("prop = '<created>'").
 +    withColumnRenamed("sujet","t").
 +    withColumnRenamed("objet","v").
 +    select("t", "v")
 +
 +val r = t1.join(t2, "x").join(t3,"x").join(t4,"t").join(t5,"t")
 +r.show(10)
 + </code>
 +</showif>
 +
 +Le résultat, limité à 10 lignes, doit être:
 +<code>
 ++--------------+----------+---------+-----------------+--------------------+----------------+
 +|             t|         x|        y|                z|                   u|               v|
 ++--------------+----------+---------+-----------------+--------------------+----------------+
 +|<Irvine_Welsh>|<Iggy_Pop>|<Germany>      <Cry-Baby>           <Dublin>|<Dockers_(film)>|
 +|<Irvine_Welsh>|<Iggy_Pop>|<Germany>      <Cry-Baby>|<Republic_of_Irel...|<Dockers_(film)>|
 +|<Irvine_Welsh>|<Iggy_Pop>|<Germany>   <Suck_(film)>           <Dublin>|<Dockers_(film)>|
 +|<Irvine_Welsh>|<Iggy_Pop>|<Germany>   <Suck_(film)>|<Republic_of_Irel...|<Dockers_(film)>|
 +|<Irvine_Welsh>|<Iggy_Pop>|<Germany>|<Hardware_(film)>           <Dublin>|<Dockers_(film)>|
 +|<Irvine_Welsh>|<Iggy_Pop>|<Germany>|<Hardware_(film)>|<Republic_of_Irel...|<Dockers_(film)>|
 +|<Irvine_Welsh>|<Iggy_Pop>|<Germany>      <Dead_Man>           <Dublin>|<Dockers_(film)>|
 +|<Irvine_Welsh>|<Iggy_Pop>|<Germany>      <Dead_Man>|<Republic_of_Irel...|<Dockers_(film)>|
 +|<Irvine_Welsh>|<Iggy_Pop>|<Germany>  <Gimme_Danger>           <Dublin>|<Dockers_(film)>|
 +|<Irvine_Welsh>|<Iggy_Pop>|<Germany>  <Gimme_Danger>|<Republic_of_Irel...|<Dockers_(film)>|
 ++--------------+----------+---------+-----------------+--------------------+----------------+
 +
 +</code>
 +
 +
 +
 +===R6: Les paires de personnes mariées et nées dans le même pays ===
 +
 +===R7: Les personnes influencées par un prix nobel===
 +
 +===R8: L'acteur ayant joué dans le plus grand nombre de films ===
 +
 +
 +
 +
  
  
  
  
-===== Exercice : Requêtes sur Freebase=====+===== Exercice subsidiaire : Requêtes sur Freebase=====
 L’objectif de cet exercice est d’exprimer en Scala les différents types de motifs complexes. L’objectif de cet exercice est d’exprimer en Scala les différents types de motifs complexes.
  
Ligne 209: Ligne 358:
 </code> </code>
  
-===== Exercice 3=====+===== Exercice subsidiaire=====
  
 a) A partir de Q4 proposer une requête formant un chemin de longueur 4 puis 5 (avec des propriétés différentes de celles de Q4). a) A partir de Q4 proposer une requête formant un chemin de longueur 4 puis 5 (avec des propriétés différentes de celles de Q4).
site/enseignement/master/bdle/tmes/algebrespark.1508946245.txt.gz · Dernière modification : de hubert