0% ont trouvé ce document utile (0 vote)
37 vues18 pages

Xquery

XQuery est un langage de requêtes pour les données XML, similaire à SQL pour les données relationnelles, avec des versions allant de XQuery 1.0 à XQuery 3.0. Il permet d'effectuer des requêtes fonctionnelles sur des séquences ordonnées d'items, en utilisant des expressions simples et complexes, ainsi que des opérations sur les séquences. Les expressions FLOWR facilitent l'itération, la définition de variables, le tri et le filtrage des résultats.

Transféré par

wirakaf349
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
37 vues18 pages

Xquery

XQuery est un langage de requêtes pour les données XML, similaire à SQL pour les données relationnelles, avec des versions allant de XQuery 1.0 à XQuery 3.0. Il permet d'effectuer des requêtes fonctionnelles sur des séquences ordonnées d'items, en utilisant des expressions simples et complexes, ainsi que des opérations sur les séquences. Les expressions FLOWR facilitent l'itération, la définition de variables, le tri et le filtrage des résultats.

Transféré par

wirakaf349
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

XQuery

Dan VODISLAV

CY Cergy Paris Université


Licence Informatique L3

Plan

• Principes, historique
• Modèle de données
• Expressions XQuery
– Expressions simples
– Expressions complexes

• Expressions FLOWR
• Fonctions et opérateurs

CY Cergy Paris Université, Licence L3: XQuery 2


XQuery

• Langage de requêtes pour données XML


– L’équivalent de SQL pour les données relationnelles

• XQuery 1.0:
– W3C Working Draft 02/05/2003  W3C Recommendation 23/01/2007
 W3C Edited Recommendation 14/12/2010

• XQuery 3.0 (Proposed Recommendation) : XQuery 1.0 +


GROUP BY, WINDOW, TRY/CATCH, etc.

CY Cergy Paris Université, Licence L3: XQuery 3

Pourquoi un autre langage?

• XPath
– Seulement extraction de fragments d’arbres
• SQL
– Le document XML doit être transformé en relations
• SQL + XPath
– Document (ou fragments) sous forme d’attributs XML (CLOB)
– Mélange des deux langages  problèmes d’optimisation
• XSLT
– Pour créer une copie transformée d’un document  pourrait servir à
extraire des parties d'un document, donc à interroger un document
– Mal adapté à de gros volumes de données
• XQuery
– Vrai langage de requêtes XML

CY Cergy Paris Université, Licence L3: XQuery 4


Langage fonctionnel

• XQuery = langage fonctionnel typé


– Requête = composition d’expressions (fonctions)
– Chaque expression retourne une valeur (typée) ou une erreur
– Expressions sans effets de bord (sans modification des données)

• Expressions
– Simples: valeurs atomiques, constructeurs, variables, etc.
– Complexes: expressions de chemin, expressions FLWOR, etc.

• Éléments de syntaxe
– On fait la différence entre minuscules et majuscules  les mots-clés du
langage (for, let, where, if, …) doivent être écrits en minuscules
– Commentaires: n'importe où (: Ceci est un commentaire :)

CY Cergy Paris Université, Licence L3: XQuery 5

Modèle de données de XQuery

• Modèle de données XDM spécifique à XQuery (et XPath 2.0)


– Basé sur les séquences ordonnées
– Valeur = séquence ordonnée (liste) d’items
– Item = nœud (tout type DOM) ou valeur atomique
• Document, élément, attribut, texte, … + valeurs atomiques de différents types
– Chaque nœud et chaque valeur atomique a un type (XML Schema)
– Résultat de requête XQuery = valeur = séquence d'items

valeur item
*
item noeud valeur atomique

CY Cergy Paris Université, Licence L3: XQuery 6


Séquences

• Pas de distinction entre item et séquence de longueur 1


– Ex: 39 = (39)

• Une séquence peut contenir des valeurs hétérogènes


– Ex: (39, "toto", <toto/>)

• Pas de séquences imbriquées


– Ex: (39, (1, 2), "toto", <toto/>) = (39, 1, 2, "toto", <toto/>)

• Une séquence peut être vide


– Ex: ()

• L’ordre est important


– Ex: (1, 2) ≠ (2, 1)

CY Cergy Paris Université, Licence L3: XQuery 7

Expressions XQuery simples

• Valeurs atomiques littérales (des types simples XML Schema)


Ex: 39, "toto", 3.9, etc.
• Nœuds XML sous forme littérale
Ex: <film annee="2007">
<titre>La môme</titre>
</film>
• Valeurs obtenues par des constructeurs simples
Ex: true(), false(), date("2006-12-08")
• Collections de documents, documents
– doc(uri-document)  retourne un item de type nœud Document
– collection(uri-collection)  retourne une séquence de nœuds Document
Ex: doc("[Link]"), collection("cinema/films")
• Séquences construites
Ex: (1, 2, 3, 4, 5), 1 to 5, (1 to 3, 4, 5)
• Variables
– Ont un nom (précédé du signe $): $x, $toto, etc.
– Ont une valeur: séquence d'items

CY Cergy Paris Université, Licence L3: XQuery 8


Expressions XQuery complexes

• Expressions de chemin (XPath 2.0)


– Toute expression produisant une séquence de nœuds peut être une étape
• Expressions FLWOR (For-Let-Where-Order by-Return) avec définition de
variables
• Tests (If-Then-Return-Else-Return)
• Fonctions
– Fonctions prédéfinies: les mêmes que pour XPath 2.0
• voir « XQuery 1.0 and XPath 2.0 Functions and Operators »
[Link]
– Fonctions utilisateur
• Mélange de littéraux et expressions complexes
– Chaque expression doit être placée entre {} pour qu'elle soit évaluée
Ex. <comedies>
{doc("[Link]")//film[@genre="comedie"]}
</comedies>

CY Cergy Paris Université, Licence L3: XQuery 9

Opérations

• Opérations arithmétiques
– Ex: 1+2, 3.14-$x, $y mod 2

• Opérations sur les séquences


– Concaténation: virgule
• Ex: (1, 2), (‘a’, <toto/>) = (1, 2, ’a’, <toto/>)
– Union, intersection, différence

• Opérateurs de comparaison
– Valeurs atomiques
– Nœuds
– Séquences

• Opérateurs booléens
– and, or, not, …

CY Cergy Paris Université, Licence L3: XQuery 10


Exemple

• Document [Link]
<bib>
<book title="Comprendre XSLT">
<author><la>Amann</la><fi>B.</fi></author>
<author><la>Rigaux</la><fi>P.</fi></author>
<publisher>O’Reilly</publisher>
<price>28.95</price>
</book>
<book year="2001" title="Spatial Databases">
<author><la>Rigaux</la><fi>P.</fi></author>
<author><la>Scholl</la><fi>M.</fi></author>
<author><la>Voisard</la><fi>A.</fi></author>
<publisher>Morgan Kaufmann Publishers</publisher>
<price>35.00</price>
</book>
<book year="2000" title="Data on the Web">
<author><la>Abiteboul</la><fi>S.</fi></author>
<author><la>Buneman</la><fi>P.</fi></author>
<author><la>Suciu</la><fi>D.</fi></author>
<publisher>Morgan Kaufmann Publishers</publisher>
<price>39.95</price>
</book>
</bib>

CY Cergy Paris Université, Licence L3: XQuery 11

Expressions de chemin

• Requête:
doc("[Link]")//author

• Résultat:
<author><la>Amann</la><fi>B.</fi></author>,
<author><la>Rigaux</la><fi>P.</fi></author>,
<author><la>Rigaux</la><fi>P.</fi></author>,
<author><la>Scholl</la><fi>M.</fi></author>,
<author><la>Voisard</la><fi>A.</fi></author>,
<author><la>Abiteboul</la><fi>S.</fi></author>,
<author><la>Buneman</la><fi>P.</fi></author>,
<author><la>Suciu</la><fi>D.</fi></author>

• Le résultat est une séquence de noeuds XML

CY Cergy Paris Université, Licence L3: XQuery 12


Expressions de chemins XPath 1.0 et 2.0

• XPath 1.0
– expression de chemin = suite d’étapes séparées par ’/’
– étape = un axe, un filtre et une séquence de prédicats

• XPath 2.0 (fonctionnel)


– expression de chemin = suite d’expressions d’étape
– expression d’étape =
• soit une étape XPath 1.0 (axe, filtre, prédicats)
• soit une expression XQuery (simplifiée)

CY Cergy Paris Université, Licence L3: XQuery 13

Exemple: expressions de chemin

• doc("[Link]")/bib//book[1]/publisher
– L’éditeur du premier livre

• doc("[Link]")//(book union author union publisher)


– tous les livres, auteurs et éditeurs
• doc("[Link]")//book/(* except price)
– pour chaque livre tous les éléments fils sauf le prix.
• doc("[Link]")//book[every $a in author satisfies
contains($a/la,'a')]
– tous les livres dont tous les auteurs ont la lettre ’a’ dans leur nom de
famille

CY Cergy Paris Université, Licence L3: XQuery 14


Construction de nœuds XML

• Cas 1: nom connu, contenu construit par une expression


– Requête:
<auteurs>
{ doc("[Link]")//book[2]/author/la }
</auteurs>
– Résultat:
<auteurs>
<la>Rigaux</la>
<la>Scholl</la>
<la>Voisard</la>
</auteurs>

• La requête fait partie d’un document XML, le résultat est


transformé en fragment XML

CY Cergy Paris Université, Licence L3: XQuery 15

Construction de nœuds XML (suite)

• Cas 2: le nom et le contenu sont calculés


– Constructeurs d’élément et d’attribut
• element { expr-nom } { expr-contenu }
• attribute { expr-nom } { expr-contenu }

– Requête:
element { doc("[Link]")//book[1]/name(@*[1]) } {
attribute { doc("[Link]")//book[1]/name(*[3]) }
{ doc("[Link]")//book[1]/*[3] }
}

– Résultat:

<title publisher="O’Reilly"/>

CY Cergy Paris Université, Licence L3: XQuery 16


Différence de séquences

• On garde les éléments de la première séquence qui


n’apparaissent pas dans la seconde séquence
– Élimination des doublons
• Exemple: séquences de noeuds
– Requête:
<livre>
Tous les sous-elements sauf les auteurs:
{ doc("[Link]")//book[1]/(* except author) }
</livre>

– Résultat:
<livre>
Tous les sous-elements sauf les auteurs:
<publisher>O’Reilly</publisher>
<price>28.95</price>
</livre>

CY Cergy Paris Université, Licence L3: XQuery 17

Concaténation de séquences

• Différences avec l’union


– La concaténation préserve l’ordre
– L’union élimine les doublons
• Exemple
– Requête:
<livre>
Le prix suivi des auteurs:
{ doc("[Link]")//book[1]/(price,author) }
</livre>
– Résultat:
<livre>
Le prix suivi des auteurs:
<price>28.95</price>
<author><la>Amann</la><fi>B.</fi></author>
<author><la>Rigaux</la><fi>P.</fi></author>
</livre>

CY Cergy Paris Université, Licence L3: XQuery 18


Transformation nœud  valeur

• Exemple: utilisation de la fonction prédéfinie string()

– Requête:
"Les auteurs du premier livre sont",
doc("[Link]")//book[1]/author/string(la)

– Résultat: la séquence

Les auteurs du premier livre sont, Amann, Rigaux

CY Cergy Paris Université, Licence L3: XQuery 19

Comparaison de valeurs atomiques avec eq

• Requête:
doc("[Link]")//book/author[la eq "Scholl"]

• Résultat:
<author><la>Scholl</la><fi>M.</fi></author>

• Requête:
doc("[Link]")//book[author/la eq "Scholl"]

• Résultat:
ERROR
– Erreur, car l’expression author/la (dans le prédicat) retourne une
séquence de longueur > 1 !

• Autres comparaisons de valeurs atomiques: lt, gt, le, ge, ne


CY Cergy Paris Université, Licence L3: XQuery 20
Comparaison de séquences avec =

• s1 = s2 ⇔ il existe un élément dans s1 égal à un élément dans s2


– Sémantique existentielle

• Exemple:
– Requête:

count(doc("[Link]")//book[author/la =
("Scholl", "Rigaux", "Abiteboul")])

– Résultat: 3

• Autres opérations de comparaison (<, <=, !=, >, >=)


– Remarques:
• s1 = s2 et s1 != s2 peuvent être vraies en même temps !
• Si s1=s2 et s2=s3, il n’est pas nécessairement vrai que s1=s3 !

CY Cergy Paris Université, Licence L3: XQuery 21

Comparaison par la position avec <<

• n1 << n2 ⇔ n1 apparaît avant n2 dans le document


• Exemple
– Requête:

<livre>
{ doc("[Link]")//book[author[la="Abiteboul"] <<
author[la="Suciu"]]/@title }
</livre>

– Résultat:

<livre title="Data on the Web"/>

CY Cergy Paris Université, Licence L3: XQuery 22


Comparaison de nœuds avec is

• n1 is n2 si n1 est identique à n2
– Comparaison de l’identité des nœuds, pas de leur valeur

• Exemple
– Requête:

doc("[Link]")//book[author[2] is author[last()]]

– Résultat:
<book title="Comprendre XSLT">
<author><la>Amann</la><fi>B.</fi></author>
<author><la>Rigaux</la><fi>P.</fi></author>
<publisher>O’Reilly</publisher>
<price>28.95</price>
</book>

CY Cergy Paris Université, Licence L3: XQuery 23

Expressions FLOWR

• Une expression FLOWR (on dit "flower")


– Itère sur des séquences (for)
– Définit des variables (let)
– Trie les résultats (order by)
– Applique des filtres (where)
– Construit et retourne un résultat (return)

• for et return sont obligatoires

CY Cergy Paris Université, Licence L3: XQuery 24


Itération : for

• for $var in exp


– affecte à la variable $var successivement chaque item dans la séquence
retournée par exp.

• Requête:
for $a in doc("[Link]")//author[la eq "Voisard"]
return $a

• Résultat:

<author><la>Voisard</la><fi>A.</fi></author>

CY Cergy Paris Université, Licence L3: XQuery 25

Affectation d’ensembles: let

• let $var := exp


– affecte à la variable $var la séquence entière retournée par exp

• Requête:
for $b in doc("[Link]")//book[1]
let $al := $b/author
return <livre nb_auteurs="{count($al)}">
{ $al }
</livre>

• Résultat:
<livre nb_auteurs="2">
<author><la>Amann</la><fi>B.</fi></author>
<author><la>Rigaux</la><fi>P.</fi></author>
</livre>

CY Cergy Paris Université, Licence L3: XQuery 26


Trier avec order by

• expr1 order by expr2 (ascending | descending)?


– trier les éléments de la séquence retournée par l’expression expr1 selon
les valeurs retournées par expr2
• Requête:
<livres>
{ for $b in doc("[Link]")//book
order by $b/@year
return <livre> { $b/@title, $b/@year } </livre>
}
</livres>

• Résultat:
<livres>
<livre title="Comprendre XSLT"/>
<livre title="Data on the Web" year="2000"/>
<livre title="Spatial Databases" year="2001"/>
</livres>

CY Cergy Paris Université, Licence L3: XQuery 27

Sélection : where

• where exp
– permet de filtrer le résultat par rapport au résultat booléen de l’expression
exp

• Requête:
for $a in doc("[Link]")//book
where $a/author[1]/la eq "Abiteboul"
return <livre>{$a/@title}</livre>

• Résultat:
<livre title="Data on the Web"/>

CY Cergy Paris Université, Licence L3: XQuery 28


Requêtes motif d'arbre

• Les requêtes les plus courantes


– Correspondent aux requêtes relationnelles de sélection/projection
• Exemple : noms des auteurs français doc("[Link]")
et titres des livres qu'ils ont publiés
book
• Principe
– Une variable par nœud de jonction @title author
– Conditions dans le "where"
name country
– Résultats dans le "return" ="FR"
• Équivalent en XQuery
for $b in doc("[Link]")//book, $a in $b/author
where $a/country="FR"
return <resultat>
{$a/name}
{$b/@title}
</resultat>

CY Cergy Paris Université, Licence L3: XQuery 29

Tests: if-then-else

• Requête:
<livres>
{ for $b in doc("[Link]")//book
where $b/author/la = "Rigaux"
return if ($b/@year > 2000)
then <livre recent="true"> {$b/@title}
</livre>
else <livre> {$b/@title} </livre>
}
</livres>

• Résultat:
<livres>
<livre title="Comprendre XSLT"/>
<livre recent="true" title="Spatial Databases"/>
</livres>

CY Cergy Paris Université, Licence L3: XQuery 30


Quantification

• some $var in expr1 satisfies expr2


– il existe au moins un noeud retourné par l’expression expr1 qui satisfait
l’expression expr2 (quantification existentielle).
• every $var in expr1 satisfies expr2
– tous les nœuds retournés par l’expression expr1 satisfont l’expression expr2
(quantification universelle)
• Requête:
for $a in doc("[Link]")//author
where every $b
in doc("[Link]")//book[author/la = $a/la]
satisfies $b/publisher="Morgan Kaufmann Publishers"
return string($a/la)

• Résultat:
Scholl, Voisard, Abiteboul, Buneman, Suciu

CY Cergy Paris Université, Licence L3: XQuery 31

Fonctions et opérateurs

• Ils permettent
– L’accès au nom et au type d’un nœud
– La construction, comparaison et transformation de valeurs
– L’agrégation des valeurs d’une séquence
– …

• Typage
– Les fonctions et opérateurs sont typés (XML Schema)
– Ils manipulent des séquences et des valeurs typées

CY Cergy Paris Université, Licence L3: XQuery 32


Exemple: fonction avg

• Requête:
for $p in distinct-values(doc("[Link]")//publisher)
let $l := doc("[Link]")//book[publisher = $p]
return element publisher {
attribute name {string($p)},
attribute avg_price { avg($l/price) }
}

• Résultat :
<publisher name="O’Reilly"
avg_price="28.95"/>,
<publisher name="Morgan Kaufmann Publishers"
avg_price="37.48"/>

CY Cergy Paris Université, Licence L3: XQuery 33

Exemple: fonction index-of

• Requête:
<books> {
let $bl := doc("[Link]")//book
for $b in $bl
return <book> {
$b/@title,
attribute no {index-of($bl, $b)}
}
</book>
}
</books>
• Résultat:
<books>
<book title="Comprendre XSLT" no="1"/>
<book title="Spatial Databases" no="2"/>
<book title="Data on the Web" no="3"/>
</books>

CY Cergy Paris Université, Licence L3: XQuery 34


Fonctions utilisateur

• XQuery permet à l’utilisateur de définir ses propres fonctions


• Exemple

define function NombreAuteurs(book $b)


returns xsd:integer {
return count($b/author)
}

• Le résultat est de type xsd:integer

CY Cergy Paris Université, Licence L3: XQuery 35

Bibliographie spécifique

• XQuery sur le site W3C


[Link]
[Link]
• Différents types de requêtes XQuery
[Link]
• J. Melton, J. Buxton, Querying XML, Morgan Kaufmann

CY Cergy Paris Université, Licence L3: XQuery 36

Vous aimerez peut-être aussi