TME XQuery
Préparation
- votre environnement doit déjà être configuré : votre fichier /.bash_profile doit contenir la ligne source /usr/local/oracle/config
- Installer les fichiers du TME
Commande | Description |
cd | aller dans votre répertoire $HOME |
tar zxvf $BD_TOOL/xquery.tgz | installer l'archive dans votre répertoire principal |
cd xquery | aller dans votre répertoire de travail |
cp /Infos/bd/basex.jar . | copier l'outil BaseX dans votre répertoire de travail |
java -jar basex.jar | lancer l'outil BaseX (attendre quelques secondes) |
Outil BaseX (avec interface graphique)
Dans l'outil BaseX,commencer par créer une BD à partir d'un fichier (ex. rencontre.xml) ou d'un répertoire contenant plusieurs fichiers (ex. rencontre.xml, gain.xml etc).
Pour ce faire, aller dans le menu Database -> New, cliquer bouton Browse et sélectionner le fichier ou le répertoire en question.
Une fois la BD créée, activer l'affichage de la représentation arborescente.
Pour ce faire, localiser le Panneau en dessous de la barre de Menus (Database, Editor, etc).
Aller dans le 4e groupe de bouton et cliquer sur le symbole d'arbre ou bien dérouler le menu Visualization et cliquer Tree.
Une fenêtre avec une représentation arborescente du ou des document(s) sélectionnés dans l'étape précédente.
Naviguer dans la structure arborescente en double-cliquant sur les éléments (voir capture écran)
Pour revenir en arrière, clic droit -> Go Back.
L'avantage de cet affichage et de pouvoir voir les résultats des requêtes!
Par exemple, saisir la requête :
for $r in doc("rencontre.xml")//rencontre return $r
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.
Remarque 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.
Outil xquery (sans interface graphique)
Exécuter une requête avec la commande : xquery fichier_requête.xql
Exemple : xquery r1.xql
Lire attentivement les indications sur la syntaxe XQuery ci-dessous.
Exercice
1) Ecrire en XQuery les requêtes sur la base tennis (fichiers joueur.xml, gain.xml, rencontre.xml)
t0.xql : afficher tous les tournois (lieu,année) triés par année, puis lieu.
- t1.xql : pour chaque tournoi (lieu, année) donner les nom et prénom des participants qui sont dans le fichier gain.xml. Le résultat de la requête doit être ainsi :
xml ( ou
txt)
t2.xql : pour chaque année, donner le nombre tournois auxquels chaque joueur a participé.
t3.xql (facultatif). Pour chaque tournoi (tournoi dames et tournoi hommes pour un lieu et une année), donner l'arbre binaire des matchs (finale, demi finale et quart de finale).
- Le résultat de t3.xql doit valider la DTD t3.dtd.
- ...
2) Ecrire en XQuery les requêtes r5.xql, r7.xsql, r9.xql, r11.xql et r12.xql sur la base de données bibliographique.
3) Faire l'ex XQuery de l'examen juin 2003. Les données sont dans les fichiers joueur2.xml (
txt) et
rencontre2.xml (
txt)
4) (facultatif) les requêtes Q1 à Q18 du use-case "R".
Questions/réponses fréquentes
- Les mots clés doivent être en lettres minuscules (ex. for, in, let, where, return, and, or, ... )
- Commentaires : accolade avec 2 tirets: {-- un commentaire --}
La clause return s'écrit sans parenthèses, par exemple :
- return expression
- return <nom_element> {expression} </nom_element>
La fonction distinct-values(...) produit un ensemble sans doubles. Cf. cours tr. 28
- for $x in distinct-values( document("bib.xml")/bib/book/author )
- Une expression XPath peut contenir un prédicat entre crochets. Cf cours tr. 25,27
document("bib.xml")//book[publisher=$p]
- La fonction xpath position() donne le rang d'un élément (i.e., le n-ième fils). Cf. cours tr.18,19
Requêtes imbriquées
- il est possible d'imbriquer des expressions FLWOR dans la clause return d'une requête ou dans une clause let.
Tri: ajouter une clause order by nom_element avant la clause return.
- à ne pas confondre avec l'opérateur sort by (nom_element) servant à trier une collection. L'opérateur sort by est ajouté dans les clauses for ou let.
Comparaison de valeurs avec l'opérateur d'égalité: a eq b
- si le type de a et b est simple (simpleType), alors a eq b est vrai ssi leur valeurs sont égales.
- si le type de a et b est complexe (complexType), alors a eq b est vrai ssi xs:string(a) eq xs:string(b)
Comparaison générale de deux ensembles : A = B lorsque les opérandes A et B sont des ensembles
- A = B est vrai ssi il existe au moins un elt a dans A et un elt b dans B tels que a eq b
- Comparaison "en profondeur" de deux éléments: utiliser la fonction deep-equal(a,b) au lieu de l'opérateur d'égalité =
Comparaison des identifiants de 2 éléments :
- a is b est vrai ssi a représente le même élément que b
Message d'erreur rencontré "context item not defined"
- erreur dans le noeud contextuel d'une expression xpath. Le premier terme d'une expression xpath est erroné.
- Vérifier la présence des guillemets dans les expressions xpath commençant par document("fichier")
- Vérifier la présence du $ au début des expressions xpath commençant par un nom de variable.
Documentation
- Un
tutoriel XQuery (à lire, en anglais)
- Les exemples de
cas d'utilisation (use case XMP et R avec LES SOLUTIONS)
- La norme
XQuery ,
XQuery and XPath Data Model
- Les
fonctions et opérateurs prédéfinis et la
sémantique formelle du langage XQuery.
Outils
*Deux moteurs de requêtes XQuery : Galax,
oracle xquery (installer chez soi le moteur Galax de préférence).
*Pour vérifier la syntaxe d'une requête :
XQuery grammar test page ,
*Divers prototypes en ligne :
Galax,
Microsoft,
Cogneticsystems,
Ipsi,
Qizx,
MXquery
Aller vers XSL, Retour vers Les Travaux Dirigés, Accueil