Interrogation de données XML avec XQuery

Transcription

Interrogation de données XML avec XQuery
Modèle simple, puissant avec des
fondements théoriques bien connus
Modèle figé
Importance du schéma de BD
Utilisé pour le stockage efficace, la définition et
l’optimisation de langage de requêtes, la
cohérence, …
Tout doit rentrer dans ce moule
Information pas ou peu structurée
Structure est implicite et tolérante
Pas de schéma des données
Pas de langage de requêtes, pas d’optimisation,
de cohérence
Beaucoup de souplesse
B. Defude - INT Evry - 2003
Intermédiaire entre modèle relationnel (BD)
et modèle de fichier
Présence d’un schéma mais souple
Possibilité de langages de requêtes
Différentes propositions
Modèle OEM
XML
1
SQL
XSLT, XPATH,
XQUERY
Modèle relationnel
Modèle XPATH
Modèle de données et langages de requêtes
XML
Publication XML de données relationnelles
Stockage de documents XML
JDBC/ODBC/SQL- DOM et SAX API
CLI
Bases de données Document XML
relationnelles
""
""
#$
XPATH (1.0 puis 2.0)
#$
langage commun de navigation, sélection, extraction
Utilisé dans XSLT, XQUERY, XPOINTER, …
XSLT 2.0 : XML vers XML, HTML, texte
Langage à typage faible, orienté transformation
XQUERY 1.0 : XML vers XML
Langage fonctionnel à typage fort (entrées et sorties)
Orienté accès BD
!
B. Defude - INT Evry - 2003
%
2
""
#$
""
XPATH 2.0 = XPATH 1.0 +
#$
XQUERY 1.0 = XPATH 2.0 +
Typage XML schema
Séquences ordonnées de nœuds typés et de
valeurs atomiques
For-let-where-return (FLWR) : SQL like
Sort-by
Construction de XML
Opérateurs sur les types
Fonctions définies par le programmeur
Typage fort (statique ou dynamique)
For VAR in EXPR return EXPR
Expression conditionnelles
If EXPR then EXPR else EXPR
Expressions quantifiées
Some | every VAR in EXPR satisfies EXPR
&
(
)*
GuideExotique :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<Guide region="exotique" version="2.0">
<Restaurant type="indhou" categorie="**">
<Nom>Le passage Brady</Nom>
<Adresse>
<No>43</No><Rue>Faubourg Saint-Denis</Rue><Ville>Paris 10</Ville>
</Adresse>
<Telephone>0142112310</Telephone>
</Restaurant>
<Restaurant type="thibetain" categorie="**">
<Nom>Le Lhassa</Nom>
<Adresse>
<No>13</No><Rue>Montagne Sainte-Genevieve</Rue><Ville>Paris 5</Ville>
</Adresse>
<Telephone>0144122112</Telephone><Manager>Dicky</Manager>
</Restaurant>
<Epicerie type="egyptienne">
<Nom>Le Caire</Nom>
<Telephone>0146134582</Telephone><Manager>Ali Moussa</Manager>
<Specialité>falavel</Specialite>
</Epicerie>
</Guide>
B. Defude - INT Evry - 2003
'
BD Guide (2)
GuideNormand:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<Guide region="normandie" version="2.0">
<Restaurant type="francais" categorie="***">
<Nom>Le Grand Hotel</Nom>
<Adresse>
<Rue>Promenade M. Proust</Rue><Ville>Cabourg</Ville>
</Adresse>
<Prix menu="midi">200</Prix> <Prix menu="soir">300</Prix>
</Restaurant>
<Restaurant type="francais" categorie="**">
<Nom>L’absinthe</Nom>
<Adresse>
<No>10</No><Rue>Quai Quarantaine</Rue><Ville>Honfleur</Ville>
</Adresse>
<Prix menu="midi">150</Prix> <Prix menu="soir">250</Prix>
<Telephone>0234142189</Telephone>
<Specialité>Fruits de Mer</Specialite>
</Restaurant>
</Guide>
3
(
)*
(
(
Nom
BD XML = forêt de documents XML
Schéma de BD =
No
Restaurant
Schéma XML si existant
Guide de données :
Schéma faible généré à partir d’un ensemble de
documents par union des arbres de structure décrivant
tous les cheminements possibles dans la collection et
par typage des données en texte
X
Adresse
Guide
B. Defude - INT Evry - 2003
Ville
Telephone
X
Prix0,2
Manager
Epicerie
BD Répertoire (1)
Rue
Code
Schéma plus flexible que schéma relationnel
<?xml version="1.0" encoding="ISO-8859-1" ?>
<Repertoire>
<Hotel categorie="***">
<Nom>California</Nom>
<Adresse><Num>32</Num>
<Rue>Rue des Ecoles</Rue><Code>75005</Code><Ville>Paris</Ville>
</Adresse>
<Commentaire>Charmant hotel pres du centre</Commentaire><Prix>150</Prix>
</Hotel>
<Hotel categorie="****">
<Nom>Napoleon</Nom>
<Adresse><No>40</No>
<Rue>Avenue de Friedland</Rue><Code>75008</Code><Ville>Paris</Ville>
</Adresse>
<Commentaire>Hotel Art Deco</Commentaire><Prix >500</Prix>
</Hotel>
<Hotel categorie="***">
<Nom>Le Saint Simon</Nom>
<Adresse><No>32</No>
<Rue>Rue Saint Simon</Rue><Code>75005</Code><Ville>Paris</Ville>
</Adresse>
<Commentaire>Proche restaurant celebre</Commentaire><Prix >300</Prix>
</Hotel>
</Repertoire>
X
Nom
Manager
Telephone
X
(
Specialite
+
Num
Nom
Repertoire
X
Hotel
X
Adresse
Rue
X
Commentaire
Ville
Code
Prix
4
,-./0
.1+
Navigation
Support XPATH
Sélection
Jointure
Tri
Construction
Recherche textuelle
Fonction
Imbrication
agrégat
2345
Lister les noms des restaurants du guide
normand
document("http://gnormand.fr")//Restaurant/Nom/text()
Lister les noms des restaurants de la forêt
Guide
collection("Guide")//Restaurant/Nom/text()
!
.1+
6/
1
for $var in <forêt> [, $var in <forêt>]...
// itération
let $var := <sous-arbre> // assignation
where <condition>
// élagage
return <résultat>
// construction
For
let
6/
return
where
Liste ordonnée
De tuples
De variables liées
&
B. Defude - INT Evry - 2003
%
Liste élaguée
De tuples
De variables liées
Instances XML
'
5
.1 +
)*
Q1 : nom des restaurants de Cabourg (liste triée)
for $R in collection("Guide")/Restaurant
where $R/Adresse/Ville="Cabourg"
return $R/Nom
sortby Nom descending
Q2 : Nom et adresse des restaurants deux étoiles
for $R in collection("Guide")/Restaurant
where $R/@categorie="**"
return
<Restau2E>{$R/Nom}
<Adresse>{$R/Adresse//text()}</Adresse>
</Restau2E>
.1 +
)*
Q4 : Noms et téléphones des restaurants
situés dans la même ville que l’hotel
Napoléon
for $R in collection("Guide")/Restaurant,
$H in collection("Repertoire")/Hotel
where $R//Ville=$H//Ville and
$H//Nom="Napoleon"
return <RestauHRN>
<Nom>{$R/Nom/text()} </Nom>
<Tel> {$R/Telephone/text()} </Tel>
</RestauHRN>
B. Defude - INT Evry - 2003
.1 +
)*
Q3 : Rechercher toutes les valeurs des
attributs des restaurants ayant un manager
for $R in collection("Guide")/Restaurant
where $R/Manager
return
<RestauAM>
{for $A in $R//@* return $A}
</RestauAM>
.1 +
)*
Q5 : nombre de restaurants dans la collection Guide
let $R := collection("Guide")/Restaurant
Return <NbRest> {count($R)}</NbRest>
Q6 : noms et adresses des restaurants dont la rue
contient la chaine « Quai »
for $R in collection("Guide")/Restaurant
where contains($R//Rue, "Quai")
return <Res>$R/Nom
<Adr>{$R/Adresse//text()} </Adr>
</Res>
6
.1 +
)*
.1 +
Q7 : Noms des restaurants par ville
Q8 : Adresse et deuxième prix des restaurants
parisiens (pour ceux qui en ont deux)
for $V in distinct-values (collection ("Guide")
/Restaurant/Ville)
return
<Restauparville>
<Ville>$V/text()</Ville>
<Restaus>
{ for $R in collection("Guide")/Restaurant
where $R//Ville=$V return $R/Nom }
</Restaus>
</Restauparville>
.1 +
for $R in
(for $S in collection("Guide")/Restaurant where
$S/Prix[2] return $S)
where $R/Ville="Paris"
return
<AdPrix2>{$R/Adresse}{$R/Prix[2]}</Adprix2>
)!*
.1 +
Q9 : Nom de chaque restaurant avec le prix
moyen proposé
)%*
Q10 : noms et adresses des restaurants
ayant au moins un prix supérieur à 200
for $R in collection("Guide")/Restaurant
let $A := $R//Prix
return <res>
{$R/Nom}
<MoyPrix>{avg($A)}</MoyPrix>
</res>
for $R in collection("Guide")/Restaurant
where some $P in $R/Prix satisfies
(number(200)<$P)
return
<RestC>{$R/Nom}{$R/Adresse}</RestC>
!
B. Defude - INT Evry - 2003
)*
%
7
.1 +
)&*
3"
Q11 : noms et adresses des restaurants
ayant tous les prix inférieurs à 100
,-./0
une algèbre a été définie pour Xquery
Permet le support d’optimisations
Assez complexe (sur-ensemble de l’algèbre
relationnelle)
for $R in collection("Guide")/Restaurant
where every $P in $R/Prix satisfies
(number(100)>$P)
return
<RestPC>{$R/Nom}{$R/Adresse}</RestPC>
&
-2 34.
Il manque le support des mises à jour dans
XQUERY
Il existe une proposition mais basée sur
XPATH
On peut utiliser DOM ou SAX pour faire les
mises à jour (mais pas déclaratif)
B. Defude - INT Evry - 2003
'
" +
G. Gardarin; XML des bases de données aux
services web, 2002, Dunod
M. Fernandez, M. Benedikt, J. Freire, A.
Sahuguet; XML and Data Management,
Tutorial WWW2002 Conference, Hawai
D. Chamberlin; Xquery: An XML Query
Language, IBM Systems Journal, Vol41, No4,
2002
8