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:mlbda:tmes:xquery

TME XQuery

Documentation XQuery

Comme pour le TME sur XPath, BaseX se utilisé pour interroger les données.

Récupération de BaseX

Si ce n'est pas encore fait,

* Télécharger et décompresser, dans votre répertoire de travail, l'archive BaseX944.zip

Windows: cliquer sur l'icône **BaseX GUI** (ou lancer le script basexgui.bat)
Unix: exécuter bin/basexgui depuis le répertoire racine de basex

Récupération des données

  • Créer un répertoire de travail pour ce tme.
  • Télécharger et décompresser, dans votre répertoire de travail, le fichier tmexquery.tgz, cela va créer le répertoire tmexquery

Utilisation de BaseX

Après avoir lancé l'outil BaseX, commencer par créer une BD à partir d'un fichier XML. Pour ce faire, suivre les étapes suivantes :

1- aller dans le menu Database puis New. La fenêtre Create Database va s'ouvrir comme suit

2- Cliquer bouton Browse et sélectionner le fichier rencontre.xml pour charger le document dans la base.

Remarque Pour charger le contenu d'un repertoire, sélectionner le répertoire en question au lieu d'un fichier.

3- Activer l'affichage de la représentation arborescente. Pour ce faire, dérouler le menu Visualization et cliquer Tree. Le résultat est comme suit

4- Tester la requête ci-dessous et appuyer sur le triangle vert pour exécuter la requête. Les résultats de cette requete sont en rouge dans l'arbre original.

  for $r in //rencontre
  return $r

Remarque 1 Il est évident que si le résultat de votre requete est un nouvel élément construit par copie d'autres éléments de votre document interrogé, les éléments de ce dernier ne seront pas coloriés.

Remarque 2 Pour (dé)commenter un paragraphe, sélectionner le paragraphe et saisir Ctrl-k

Exercice 1

Pour cet exercice, utiliser les données Xmark contenues dans le fichier xmark10MB.xml. Les données Xmark sont synthétiques mais reflètent un scénario réel, celui des enchères.

  • Les éléments item sont des objets à vendre ou qui sont déjà vendus.
  • Les éléments auction sous open_auctions correspondent à des enchères en cours qui peuvent soit augmenter soit diminuer.
  • Les éléments auction sous closed_auctions correspondent à des enchères terminées.

Afin de faciliter la formulation des requêtes, vous pouvez vous appuyer sur structure globale du document XMark représentée ci-dessous ou sur la définition de schéma fournie en XSD

Il vous est demandé de formuler en XQuery les requêtes permettant de retourner les informations ci-dessous. Les résultats sont consultables sur la page Résultat requêtes Xmark.

  1. Le nom de la personne dont l'identifiant est “person0”.
  2. La valeur initiale (élément initial) des trois premières enchères en cours.
  3. La valeur de la première et de la dernière augmentation (élément increase de bidder) effectuée sur les trois premières des enchères en cours, selon l'ordre des enchères défini dans les données xml (ne pas trier les enchères chronologiquement).
  4. Le nom et le prix des objets vendus à plus de 480.
  5. Le nom des objets du continent africain
  6. Le nom des objets du continent africain avec leur prix de vente
  7. Le nombre de personnes qui n'ont pas de page web (i.e. les personnes sans élément homepage)

Réponses

- Le nom de la personne dont l'identifiant est “person0”.

for $x in /site/people/person[@id="person0"]
return $x/name

- La valeur initiale des trois premières enchères en cours.

for $x in /site/open_auctions/auction[position()<4]
return <result id="{$x/@id}" >{$x/initial}</result>

- La valeur de la première et de la dernière augmentation effectuée sur les trois premières des enchères en cours, selon l'ordre des enchères défini dans les données xml (ne pas trier les enchères chronologiquement).

for $x in /site/open_auctions/auction[position()<4]
return <result id="{$x/@id}" ><first>{$x/bidder[1]/increase/text()}</first><last>{$x/bidder[last()]/increase/text()}</last></result>

- Le nom et le prix des objets vendus à plus de 480.

for $x in //closed_auctions/auction,
$y in //item
where $x/price/text()>480 and $x/itemref/@item =$y/@id
return <result>{ $y/name, $x/price}</result>

- Le nom des objets du continent africain

for $x in //regions/africa
return $x/item/name

- Le nom des objets du continent africain avec leur prix de vente

for $x in //regions/africa/item
for $y in //closed_auctions/auction
where $x/@id=$y/itemref/@item
return <res>{$x/name, $y/price}</res>

- Le nombre de personnes qui n'ont pas de page web (i.e. les personnes sans élément homepage)

count(for $p in //person
where empty($p/homepage)
return $p)

Exercice 2

Ecrire en XQuery les requêtes sur la base tennis (fichiers joueur.xml, gain.xml, rencontre.xml).

  1. afficher tous les tournois (lieu,année) triés par année, puis lieu. Utiliser la fonction distinct-values(…) pour obtenir un ensemble sans doubles. Le résultat doit être res0.txt
  2. pour chaque tournoi (lieu, année) donner les nom et prénom des participants qui sont dans le fichier gain.xml. Le résultat doit être res1.txt
  3. pour chaque année, donner le nombre tournois auxquels chaque joueur a participé. pour chaque année, donner le nombre tournois auxquels chaque joueur a participé. Le résultat doit être res2.txt

Réponses

  • afficher tous les tournois (lieu,année) triés par année, puis lieu. Utiliser la fonction distinct- values(…) pour obtenir un ensemble sans doubles.
<tournois>
	   {
	   for $a in distinct-values(document("rencontre.xml")//rencontre/annee) sort by (.),
               $l in distinct-values(document("rencontre.xml")//rencontre[annee=$a]/lieutournoi) sort by (.)
           return
                 <tournoi lieu="{$l/text()}" annee="{$a/text()}"/>
 
           }
</tournois>

ou bien

<tournois>
	   {
	   for $l in distinct-values(document("rencontre.xml")//rencontre/lieutournoi),
               $a in distinct-values(document("rencontre.xml")//rencontre[lieutournoi=$l]/annee)
           order by $a, $l
           return
                 <tournoi lieu="{$l/text()}" annee="{$a/text()}"/>
 
           }
</tournois>

ou bien

<tournois>
	   {
	   for $a in distinct-values(document("rencontre.xml")//annee) sort by (.),
               $l in distinct-values(document("rencontre.xml")//lieutournoi) sort by (.)
 
           let $r:= document("rencontre.xml")//rencontre[annee=$a and lieutournoi=$l]
           where exists($r)
 
           return
                 <tournoi lieu="{$l/text()}" annee="{$a/text()}"/>
 
           }
</tournois>
  • pour chaque tournoi (lieu, année) donner les nom et prénom des participants qui sont dans le fichier gain.xml.
<tournois>
	   {
	   for $a in distinct-values(document("rencontre.xml")//rencontre/annee) sort by (.) 
	   return 
 
              for $l in distinct-values(document("rencontre.xml")//rencontre[annee=$a]/lieutournoi) sort by (.)
              let $r:= document("rencontre.xml")//rencontre[annee=$a and lieutournoi=$l]
              return 
                 <tournoi lieu="{$l/text()}" annee="{$a/text()}">
 		 {
                 for $j in document("joueur.xml")//joueur[nujoueur=$r/nugagnant or nujoueur=$r/nuperdant]
                 return 
                    <participant nom="{$j/nom/text()}" prenom="{$j/prenom/text()}" />
                 }
 
                 </tournoi>
 
           }
</tournois>
  • pour chaque année, donner le nombre tournois auxquels chaque joueur a participé.
<reponse>
	   {
	    for $a in distinct-values(document("rencontre.xml")//annee) sort by (.) 
  	    return  
               <annee valeur="{$a/text()}">
              {
               for $j in document("joueur.xml")//joueur
               let $r := document("rencontre.xml")//rencontre[annee=$a and (nugagnant=$j/nujoueur or nuperdant=$j/nujoueur)],
                $nbt:= count(distinct-values($r/lieutournoi))
               where $nbt > 0
 
              {-- order by $nbt, $j/nom --}
 
               return <joueur nom="{$j/nom/text()}" tournois="{$nbt}"/>
              }
              </annee>
          }
</reponse>

Exercice 3

Poursuivre sur les questions de l'exercice 2 du TD en utilisant les données bib.xml. Pour ce faire, commencer par charger dans BaseX le fichier bib.xml en suivant les instructions décrites précédemment.

FAQ

site/enseignement/master/mlbda/tmes/xquery.txt · Dernière modification: 22/11/2023 11:28 par amine