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