Vous êtes sur la page 1sur 69

3me anne Anne universitaire 2011/2012

Encadr par : Mr . Belhmar

Elabor par : Mr . Faissal Boutraba Mr . Anass Tahiri

1. 2. 3. 4. 5.

6.
7. 8.

Introduction Du relationnel XML XQuery en bref Modle de donnes Construction dexpressions XQuery Expressions FTWOR Structure dune requte Rsume

Tutorial de Chamberlin Tutorial de Moller

Tutorial de Schwartzbach
Site web officiel : http://www.w3.org/XML/Query

Lobjectif de transformation est le mme Certains lments sont communs (Xpath,

Xschema)
XSL = Procdural XQuery = Dclaratif

1998: W3C sponsors workshop on XML Query 1999: W3C charters XML Query working group

Currently 39 members, representing 25 companies 2000: WG publishes req'ts, use cases, data model 2001: WG publishes draft language spec's 2002: Working drafts updated periodically 2003: WG publishes full-text req'ts and use cases; XQuery Version 1 working drafts enter "last call"

La plupart des informations disponibles

actuellement sont stockes dans des bases relationnelles. Le langage SQL est mature, et bien implant Peut-on adapter SQL aux donnes semistructures ?
Rcuprationdapplications

Rcupration de comptences
En quoi les donnes XML sont elles diffrentes ?

Relation N-uplets Attributs Relationnel = Arbre a deux niveaux, contraint XML = Arbre quelconque

Et le langage de requtes ? Question : Peut on (et doit on) gnraliser SQL de

la mme manire ?

En XML, il est naturel de chercher de manire indpendante du


niveau. Exemple : trouver tout ce qui est rouge //*[@couleur = rouge ] Relationnel : Uniforme et rptitif Tous les comptes en banque ont une structure similaire Les mta-informations peuvent tre stockes part XML : trs variable ! Chaque page Web est diffrente Chaque objet XML doit se dcrire, les mtadonnes sont dans le document Exemple : trouver tous les lments qui ont le contenu identique leur nom //*[name(.) = string (.)]

Les requtes SQL retournent des ensembles de

rsultats homognes LesrsultatsdunerequteXMLpeuventtredetype diffrent, et des structures complexes Exemple : //*[couleur= rouge ] peut retourner unecerise,unevoiture,undrapeau On retrouve cte cte des lments et des valeurs atomiques (mixit) Les requtes XML doivent pouvoir effectuer des transformations structurelles Exemple:inverserlordredansunehierarchie

Oprations ensemblistes et non ordonnes

pour SQL
Un ordre peut tre tabli en utilisant les valeurs

des n-uplets : select nom, prenom from etudiants order by nom


EnXMLlordreauneimportance Lordreapparatplusieursniveaux
Trouver le 5e arrt Trouver les outils utiliss avant le marteau

Consquences: Lesrequtesdoiventprendrelordreencompte

Les donnes relationnelles sont denses


Chaque range a une valeur dans chaque colonne Problme des valeurs nulles

CenestpaslecasdeXML
Elments vides Elments absents

CestundegrdelibertsuprieurpourXML

XML est trs diffrent de SQL, et justifie donc le fait

de vouloir un langage de requtes ddi.


Mais la tche nest pas simple

En rsum :
Dclaratif Indpendant du protocole Respect du modle de donnes XML Comprhension des espaces de noms Coordination avec XML Schema / doit marcher sans Doit supporter des types de donnes simples et complexes Doit supporter les quantificateurs existentiels et universels

Doit supporter les oprations sur les hirarchies et squences


Doit pouvoir combiner des informations de plusieurs documents Doitsupporterlagrgation Doit pouvoir transformer et crer des structures XML

Doit tre en XML ? (XQueryX)

Lorel Abiteboul et al. Quilt Chamberlin, Florescu, Robbie

XML-QL Deutsch et al.


YATL Cluet, Simon

Fermeture
Dfinirunmodlededonnesetunensembledoprateurs

ferms sous le modle Composabilit Xqueryregroupediversesortesdexpressions Chaque expression peut tre value sans effet de bord Les expressions peuvent tre composes en toute gnralit Conformation au schma Utiliser XML Schema Types prdfinis

Compatible Xpath
Adopter Xpath comme sous ensemble syntaxique Compatibilit avec Xpath 1.0 et 2.0

Compltude
Aussi bon que le relationnel Aucunstandardnexistepourleslangages

hirarchiques Fonctions rcursives


Concisetsimpledexpression

Doit permettre une analyse statique


Phase optionnelle danalyse statique avant chaque

excution de requte Rgles dinfrence de type bases sur XML Schema Permet la dtection derreurs la compilation Facilite loptimisation

Une Valeur est une squence ordonne de 0 ou

plusieurs items. Un item estunnudouunevaleuratomique Ilya7sortesdenuds: Document Node Element Node Attribute Node Text Node Comment Node Processing Instruction Node Namespace Node

47
<A/> (1, 2, 3)

(47, <A/>, "Hello")


( ) Un document XML

Un attribut seul

Ilnyapasdedistinctionentreunitem et une

squence de longueur 1. Ilnyapasdesquencesimbriques Ilnyapasdevaleurnulle Une squence peut tre vide Une squence peut contenir des donnes htrognes Toutes les squences sont ordonnes

Lesnudsontuneidentit(lesvaleurs

atomiquesnenontpas) Lesnudsdetypeelementetattributontdes annotations de type


Ellessontdtermineslorsquelesnudssont

valids Le type peut tre complexe, voir inconnu


Chaquenudaunevaleurdetype Une squence de valeurs atomique Peut tre de type inconnu Chaquenudestordonnauseindu

document dont il est issu

<?xml version = "1.0"?> <!-- Requires one trained person --> <procedure title = "Removing a light bulb"> <time unit = "sec">15</time> <step>Grip bulb.</step> <step> Rotate it<warning>slowly</warning> counterclockwise. </step> </procedure>

Xquery est un langage sensible la casse Les mots cls sont en minuscules Chaque expression a une valeur, et pas

deffetdebord Les expressions sont composables Les expressions peuvent gnrer des erreurs Les commentaires sont possibles
(: un commentaire :)

Une requte est une expression qui


Lit une squence de fragments XML ou de valeurs atomiques Retourne une squence de fragments XML ou de valeurs

atomiques Les formes principales que peuvent prendre une expression Xquery sont : Expressions de chemins Contructeurs Expressions FLWOR Expressions de listes Conditions Expressions quantifies Expressions de types de donnes Fonctions

Les expressions sont values relatives un

contexte:
Espace de nom Variables Fonctions Date et heure Item contexte (nud courrant) Position (dans la squence en train dtre traite) Taille de cette squence

Littraux : "Hello" 47 4.7 4.7E-2


Valeurs construites :
true() false() date("2002-03-15")

Variables : $x Squences construites :


$a, $b pareil que ($a, $b) (1, (2, 3), ( ), (4)) pareil que 1, 2, 3, 4 5 to 8 pareil que 5, 6, 7, 8

Les fonctions Xquery ont comme corps une

expression Xquery, et peuvent tre rcursives Appel de fonction :


three-argument-function(1, 2, 3) two-argument-function(1, (2, 3)) one-argument-function(()) zero-argument-function()

Les fonctions ne sont pas surcharges.


Substitutiondunsoustypedanslepassage

de paramtres gr

Vous connaissez dj Xquery !


Une expression de chemin Xpath est une requte

Xquery
Un chemin retourne un ensemble ordonn de

nud dun document (cf XSL)

document("recipes.xml")//recipe[title= Lingui

ne Pasta"]//ingredient[@amount] Resultat:

<ingredient name="olive oil" amount="2" unit="tablespoon" /> <ingredient name="minced cloves of garlic" amount="2" /> <ingredient name="Italian seasoning" amount="0.5" unit="teaspoon" /> <ingredient name="dried thyme" amount="0.25" unit="teaspoon" /> <ingredient name="crushed red pepper flakes" amount="0.25" unit="teaspoon" /> <ingredient name="crushed tomatoes" amount="1" unit="can" /> <ingredient name="black olives, drained" amount="6" unit="ounce" /> <ingredient name="whole baby clams" amount="10" unit="ounce" /> <ingredient name="minced clams, with juice" amount="6.5" unit="ounce" /> <ingredient name="small salad shrimp" amount="0.25" unit="pound" /> <ingredient name="scallops" amount="0.25" unit="pound" /> <ingredient name="lemon zest" amount="2.5" unit="teaspoon" /> <ingredient name="salt" amount="*" /> <ingredient name="ground black pepper" amount="*" />

Tous les axes ne sont pas supports :

Axe par dfaut : child

Extension de Xpath : Axe IDREF Une expression Xquery quelconque peut tre utilise pour localiser cette expression

Une expression Xquery peut construire un

nouvel lment XML <employee empid="12345"> <name>John Doe</name> <job>XML specialist</job> <deptno>187>/deptno> <salary>125000>/salary> </employee> Le rsultat de cette requte est la requte elle mme.

Dune manire gnrale, si on doit calculer la valeur

dun lment ou dun attribut, on limbrique entre{}. Ils peuvent contenir nimporte quelle expression Xquery qui retourne une valeur Si on doit calculer et le nom de la balise et son contenu, on utilise la notation suivante

<employee empid="{$id}"> <name>{$name}</name> {$job} <deptno>{$deptno}>/deptno> <salary>{$SGMLspecialist+100000}</salary> </employee> Les variables $id, $name, $job, $deptno, $SGMLspecialist doivent tre lies des fragment de XML

Unconstructeurdlmenttenteautomatiquementde

valider cet lment avec les dfinitions du schma (voir cours XMLSchema) Cela gnre une annotation de type Peut tre gnrique xs:anyType Plusieurs modes de validation Strict:lelementdoittredfinidansleschma Lax:llementdoitcorrespondresiunschmaest dfini Skip : ignorer cet lment Le mode est dfini par une expression de validation

Pourquoi ne pas simplement utiliser le type de

lexpression construite ? Ex: <a>{1, "2"}</a>


Letypedelexpressiondecontenuest(:integer,

string) Aprs validation le type de <a> estdiffrent


Conclusion:
La validation automatique permet dtre sr

statiquement du type dune expression de contenu.

Une expression FLWOR lie des variables, applique des prdicats, et

construit un nouveau rsultat

For:
for $x in /company/employee gnre un lien de

chaque employ vers $x pour chaque lment dans lentreprise


Let:
let $x := /company/employee gnre un seul lien;

$x reprsentant ici lensemble des employs

"Find the description and average price of each red part that has at least 10 orders"
for $p in doc("parts.xml")//part[color = "Red"] let $o := doc("orders.xml")//order[partno = $p/partno] where count($o) >= 10 order by count($o) descending return <important_red_part> { $p/description } <avg_price> {avg($o/price)} </avg_price> </important_red_part>

for $p IN document("www.irs.gov/taxpayers.xml")//person for $n IN document("neighbors.xml")//neighbor[ssn = $p/ssn] return <person> <ssn> { $p/ssn } </ssn> { $n/name } <income> { $p/income } </income> </person>

for $d in document("depts.xml")//deptno let $e := document("emps.xml")//employee[deptno = $d] where count($e) >= 10 order by avg($e/salary) descending return <big-dept> { $d, <headcount>{count($e)}</headcount>, <avgsal>{avg($e/salary)}</avgsal> } </big-dept> Rsultat : Retourne la liste des dpartement avec plus de 10 employs, classs par salaire

Xpath gre des listes de valeurs : (7,9, <onze/>)


Xquery dispose doprateurs pour grer les listes Concatnation Oprations ensemblistes (union, intersection, difference) Fonctions (remove, index-of, count, avg, min, max, etc) On peut grer les listes avec une smantique

ensembliste, dans ce cas les duplicata sont retirs, les nuds sont fusionns bass sur leur identit, et lordre est prserv.

for $p in distinctvalues(document("bib.xml")//publisher) let $a := avg(document("bib.xml")//book[publisher = $p]/price) return <publisher> <name>{ $p/text() }</name> <avgprice>{ $a }</avgprice> </publisher>
Rsultat : Liste chaque diteur et le prix moyen de leur livres.

Unordered (expr)
If (expr1) then expr2 else expr3 Some var in expr1 satisfies expr2

Every var in expr1 satisfies expr2

for $h in document("library.xml")//holding return <holding> { $h/title, if ($h/@type = "Journal") then $h/editor else $h/author } </holding>

for $b in document("bib.xml")//book where some $p in $b//paragraph satisfies (contains($p,"sailing") AND contains($p,"windsurfing")) return $b/title

for $b in document("bib.xml")//book where every $p in $b//paragraph satisfies contains($p,"sailing") return $b/title

Le Prologue contient: Declarations de Namespace

Importations de schmas
Importation de Modules Dfinitions de fonctions Dclarations de variable globales et externes

Contrle pour la gestion des espaces


Le Corps contient: Une expression qui dfinit le rsultat de la requte

En Xquery tous les noms sont des Qname en

deux parties
Un Qname est un prfixe de namespace et un nom

local: exemple acme:product


Un prfixe de namespace est un raccourci

pour un namespace qui est une URI:http://www.acme.com/names Les dclarations sont faites dans le prologue
declare namespace acme = "http://www.acme.com/names"

Dclaration de namespaces par dfaut


Elements et Types
default element namespace = "http://whatever-1"

Fonctions default function namespace = "http://whatever-2

Un lment constructeur peut en dfinir


<foo xmlns:bar = "http://www.bar.com/names">

Les noms sont toujours compars en forme

expanse

Un namespace est dfini par un schma


On lie le namespace au prfix et on importe le

schma par linstruction suivante


import schema
namespace acme = "http://www.acme.com/names" at "http://www.acme.com/schemas/names.xsd"

Les fonctions ne peuvent pas tre surcharges


Une grande partie de XML nest pas typ Xquery tente de forcer le type celui attendu par un cast Exemple: abs($x) attend un argument numrique
If $x est un nombre, retourner sa valeur absolue If $x napasdetype,letransformerennombre If $x estunnud,extrairesavaleurpuislatraitercomme

ci-dessus

Incompatibilit avec la surcharge ! Possible en utilisant un expression typeswitch

Exemple:

define function depth($n as node()) as xs:integer { (: A node with no children has depth 1 :) (: Else, add 1 to max depth of children :) if (empty($n/*)) then 1 else max(for $c in $n/* return depth($c)) + 1 }

define function longitude($c as element(city)) as double external

Une requte peut avoir plusieurs modules


Module principal Contient la requte Est excutable Module bibliothques Dfinit les fonctions et variables Dclare son namespace Peut tre importe Exporte ses variables et ses fonctions dans son namespace Module imports

Exemple de bibliothque
module "http://www.ibm.com/xquery-functions" import schema namespace abc = "http://abc.com" import module namespace xyz = "http://xyz.com" define variable $pi as double {3.14159} define function triple($x as xs:xs:integer) as xs:integer { 3 * $x }

Simporte par:

import module namespace ibmfns = "http://www.ibm.com/xquery-functions"

A la compilation (optionnelle)
Dpend de la requte Infre le type de chaque expression bas sur les

types des oprandes Dclanche une erreur si les oprandes ne correspondent pas aux oprateurs But : dtecter les erreurs au plus tt, garantir un type rsultat Pratiquepourloptimisationderequtes?

Dpend des donnes en entre


Calcule les rsultats bas sur les donnes

Lanalyse statique ne garantit pas que les types

soient corrects :
cast as integer($x) where value of $x is

"garbage
Une requte peut chouer de manire statique

et nanmoins renvoyer le bon rsultat


$emp/salary + 1000 va marcher si $emp a une seule valeur salary de type entier