Schémas de données semi- structurées (XML)

publicité
La vision “base de données” de XML
XML et les bases de données
Bernd Amann et Philippe Rigaux
XML permet de représenter des données et
des documents (modèle de données
“semi-structurées”).
On veut stocker, gérer et interroger des
grands volumes de données XML :
Langages d’interrogation
Schémas de données XML
Stockage, optimisation et indexation
[email protected] et [email protected]
CNAM/Paris XI
Données et Web / B. Amann et P. Rigaux – p.1/173
Gestion de Données XML
Données et Web / B. Amann et P. Rigaux – p.5/173
Bibliographie : Bases de données et XML
Nous avons deux technologies complémentaires :
Bases de Données:
interrogation
mises-à-jour et transactions
Documents XML:
publication et échange
V. Vianu, A Web Odyssey: from Codd to XML,
PODS’2001
S. Abiteboul, P. Buneman, D. Suciu: Data on
the Web - from relations to semi-structured
data and XML
A. Doucet et G. Jomier (eds.), Bases de
données et Internet, Hermes.
R. Bourret,
http://www.rpbourret.com/xml/XMLDBLinks.htm
Ecole d’été EDBT’02, http://wwwlsr.imag.fr/EDBT2002/Other/programme.html
Données et Web / B. Amann et P. Rigaux – p.6/173
Données et Web / B. Amann et P. Rigaux – p.2/173
Plan
Données et documents
Les données sont
structurées,
typées,
volumineuses,
avec une granularité fine.
Schémas de données XML
Grammaires d’arbres
DTD et XML Schema
Langages d’interrogation: XQuery
Stockage de données XML
et dans un document,
les structures sont plus souples,
la notion de type est moins forte,
il y beaucoup de texte.
Données et Web / B. Amann et P. Rigaux – p.3/173
Données et Web / B. Amann et P. Rigaux – p.7/173
Situations mixtes
Dans un serveur Web la séparation
données/document n’est pas toujours très nette.
Un part de description textuelle est de nature
« document »
Exemple : tout le texte présentant un
cinéma, ses activités, etc
Une part est contenue dans une base de
données
Exemple : les films
Schémas de données semistructurées (XML)
Données et Web / B. Amann et P. Rigaux – p.4/173
Données et Web / B. Amann et P. Rigaux – p.8/173
Les besoins de schémas
Grammaires d’arbres
Dans la gestion de données XML, un schéma est
utile pour
Une grammaire d’arbres (régulière) est un
quadruple
, où
naviguer et interroger,
est un ensemble fini de non-terminaux,
est un ensemble fini de terminaux,
est un sous-ensemble de ,
est un ensemble fini de règles de
production
ou
, où
,
et est une expression régulière sur
( est appelé le modèle de contenu de ).
créer et modifier,
l’optimisation de requêtes, et
le stockage des données.
Dans la gestion de documents XML, un schéma
est utile pour
créer et modifier (éditeurs structurés),
l’échange (vérification)
Grammaires d’arbre/ B. Amann – p.9/173
Grammaires d’arbre/ B. Amann – p.13/173
Exemple: Interrogation et Optimisation
Grammaire d’arbre: Exemple 1
DTD :
1
2
3
Grammaire d’arbres
<!ELEMENT Personnes (Etudiant|Prof)*>
<!ELEMENT Etudiant Nom>
<!ELEMENT Prof (Nom, Salaire)>
Requête XQuery :
for $a in Personnes/* return $a/Salaire
Version optimisée :
1
2
3
4
5
6
7
8
:
N = {Doc, Section, Titre, Para, Pcdata}
T = {doc, section, titre, para, pcdata}
S = {Doc}
Doc -> doc (Titre, Section+)
Titre -> titre (Pcdata)
Section -> section (Titre, Para*)
Para -> para (Pcdata)
Pcdata -> pcdata
Normalisation : Il n’existe pas deux règles
et
.
for $a in Personnes/Prof return $a/Salaire
Grammaires d’arbre/ B. Amann – p.14/173
Grammaires d’arbre/ B. Amann – p.10/173
Grammaire
Exemple: Stockage d’un document XML dans une Base de
Données d’arbre: Exemple 2
DTD :
1
2
3
Grammaire d’arbres
<!ELEMENT Cours (Titre, NomProf, (Etudiant)* >
<!ELEMENT Etudiant NomEt >
<!ELEMENT Prof (NomProf, Salaire) >
Schéma relationnel :
Cours(titre, nomProf)
Etudiant(nomEt, titre)
Prof(nomProf, salaire)
1
2
3
4
5
6
7
:
N = {Doc, Para1, Para2, Pcdata}
T = {doc, para, pcdata}
S = {Doc}
Doc
-> doc (Para1, Para2*)
Para1 -> para (Pcdata)
Para2 -> para (Pcdata)
Pcdata -> pcdata
Grammaires d’arbre/ B. Amann – p.15/173
Grammaires d’arbre/ B. Amann – p.11/173
Interpretation
Une interpretation d’un arbre
vers une grammaire d’arbres est une “mapping”
de chaque noeud , noté
, dans vers un
non-terminal tel que :
Grammaires d’arbre
est un symbole dans , et
pour chaque noeud et ses enfants
,
il existe une règle de production
telle
, (2) le terminal (étiquette) de
que (1)
est , et (3)
est dans
.
Grammaires d’arbre/ B. Amann – p.12/173
Grammaires d’arbre/ B. Amann – p.16/173
Grammaires avec concurrence restreinte
Géneration d’arbres et langages
Une grammaire avec concurrence restreinte
est une grammaire régulière telle que
Un arbre est généré par une grammaire
d’arbres s’il existe une interprétation de
dans .
Un langage d’arbres régulier est l’ensemble
des arbres générés par une grammaire
d’arbres régulièrs.
pour chaque règle de production, le modèle
de contenu restreint la concurrence entre ses
non-terminaux et
les non-terminaux dans ne sont pas
concurrents.
La grammaire
précédente est une grammaire
avec concurrence restreinte.
Grammaires d’arbre/ B. Amann – p.21/173
Grammaires d’arbre/ B. Amann – p.17/173
Grammaires locales
Expressivité
Dans une grammaire
Deux non-terminaux et différents sont
concurrents entre eux s’il existe deux règles
de production
et
.
locale, tous les éléments d’un type sont
associés à la même règle de production
Une grammaire locale est une grammaire
régulière sans non-terminaux concurrents.
à types uniques, tous les fils de type d’un
élément sont associés à la même règle de
production
La grammaire
précédente n’est pas une
grammaire locale.
avec concurrence restreinte, il est possible
d’identifier pour chaque élément une seule
règle de production à partir de son parent et
de ses frères de gauche.
locale
type unique
Grammaires d’arbre/ B. Amann – p.18/173
Grammaires à types uniques
concurrence restreinte
Grammaires d’arbre/ B. Amann – p.22/173
Clôture
les grammaires d’arbres régulières sont
fermés sous l’union, l’intersection et la
différence.
les grammaires locales, à types uniques et
avec concurrence restreinte sont uniquement
fermées sous l’intersection.
Une grammaire à types uniques est une
grammaire régulière telle que
pour chaque règle de production, les
non-terminaux dans son modèle de
contenu ne sont pas concurrents et
les symboles dans ne sont pas
concurrents.
La grammaire
précédente n’est pas une
grammaire à types uniques.
Grammaires d’arbre/ B. Amann – p.23/173
Grammaires d’arbre/ B. Amann – p.19/173
Non-terminaux concurrents
Parsing et Validation
Un modèle de contenu restreint la
concurrence entre deux non-terminaux et
concurrents s’il n’existe pas de séquences de
telles que génère
non-terminaux , , et
et
.
Exemple : Le modèle de contenu de
Doc -> doc (Para1* Para2*) ne restreint
pas la concurrence entre Para1 et Para2.
On distingue entre deux modèles de parsing
(validation) :
modèle d’arbre : le parseur crée un arbre
dans la mémoire (DOM).
Grammaires d’arbre/ B. Amann – p.20/173
modèle par évènements : le parseur crée
des évènements qui correspondent à des
entrées et sorties des noeuds dans un
parcours de l’arbre de gauche à droite en
profondeur (SAX). Ce parcours correspond à
une lecture sequentielle d’un fichier XML sans
mémoire.
Grammaires d’arbre/ B. Amann – p.24/173
Validation
XML: Syntaxe pour Transfert de Données
Les grammaires d’arbres régulières permettent la
validation par évènement.
Exemple : Grammaires à types uniques
1. entrée d’un noeud de type
on cherche
:
une règle
(a) noeud = racine : il existe au maximum une
règle de production
(b) noeud <> racine : soit
la règle de
production du parent de ; on cherche la
règle
tel que apparaît dans
Problème: DTD sont trop “pauvres” pour
représenter des modèles de données plus
riches :
la relation élément/sous-élément n’a pas
de sémantique précise (part-of,
instance-of, subclass-of, ...)
un ensemble limité de types atomiques
une DTD n’est pas un document XML
2. sortie d’un noeud : on compare la séquence
des étiquettes des enfants de avec .
Grammaires d’arbre/ B. Amann – p.29/173
Grammaires d’arbre/ B. Amann – p.25/173
Langage de typage XML
XML Schéma versus DTD
DTD: grammaire locale
XML Schéma: grammaire à types uniques
DSD, XDuce, Relax Core, Trex: grammaire
régulière sans restriction
Un schéma XML est lui même un document
XML.
Les types des éléménts (OfficielType) peuvent
être déclarés indépendamment des éléments
(officiel) : plusieurs éléments peuvent
partager le même type.
types complexes, abstraits et anonymes
sous-typage par extension et restriction
contraintes d’intégrité (clés, clés étrangères)
Grammaires d’arbre/ B. Amann – p.26/173
Grammaires d’arbre/ B. Amann – p.30/173
DTD comme grammaire d’arbre : Exemple
Constructeurs de type
DTD: officiel.dtd
Le type (complexe) CinemaType est une séquence
d’éléments (constructeur de type séquence):
<!ELEMENT officiel (#PCDATA | cinéma | film)*>
<!ELEMENT cinéma (nom, adresse, (séance)*)>
Grammaire d’arbres :
Officiel -> officiel OfficielType
OfficielType -> (Cinema|Film|Pcdata)*
Cinema -> cinema CinemaType
Film -> film CinemaType
nom de type string
adresse de type AdresseType
séances de type SéanceType
Grammaires d’arbre/ B. Amann – p.27/173
Grammaires d’arbre/ B. Amann – p.31/173
Exemple de type
Type XML Schema :
<xsd:complexType name=’CinemaType’>
<xsd:sequence>
<xsd:element name=’nom’ type=’xsd:string’/>
<xsd:element name=’adresse’ type=’AdresseType’/>
<xsd:element name=’séance’ type=’SéanceType’
minOccurs=’0’
maxOccurs=’unbounded’/>
</xsd:sequence>
</xsd:complexType>
XML Schema
Expression d’arbre :
CinemaType -> Nom Adresse (Séance)*
Nom -> nom String
Adresse -> adresse AdresseType
Séance -> séance SéanceType
Grammaires d’arbre/ B. Amann – p.28/173
Grammaires d’arbre/ B. Amann – p.32/173
Types Simples
Listes de Valeurs de Type Simple
DTD: un seul type simple (#PCDATA) et 10
types d’attributs
Schéma XML: 43 types simples
xsd:string, xsd:byte, ...
xsd:integer, xsd:long, xsd:float,
xsd:double, ...
xsd:boolean
xsd:time, xsd:timeDuration,
xsd:Date, xsd:year, xsd:month, ...
xsd:language, xsd:uriReference
xsd:ID, xsd:IDREF, xsd:NMTOKEN, ...
Grammaire :
listeNumTél -> (numTél)*
Schéma :
<xsd:simpleType name=’listeNumTél’>
<xsd:list itemType=’numTél’/>
</xsd:simpleType>
Grammaires d’arbre/ B. Amann – p.33/173
Grammaires d’arbre/ B. Amann – p.37/173
Restriction de Types Simples
Liste avec 5 numéros de téléphone
L’année d’un film est un entier entre 1900 et 2002.
Grammaire :
cinqNumTél -> (numTél, numTél, numTél,
numTél, numTél)
DTD: #PCDATA
XML schéma : Restriction de type
<xsd:simpleType name=’annéeFilm’>
<xsd:restriction base=’xsd:integer’>
<xsd:minInclusive value=’1900’/>
<xsd:maxInclusive value=’2002’/>
</xsd:restriction>
</xsd:simpleType>
Schéma :
<xsd:simpleType name=’cinqNumTél’>
<xsd:restriction base=’listNumTél’>
<xsd:length value=’5’/>
</xsd:restriction>
</xsd:simpleType>
Grammaires d’arbre/ B. Amann – p.34/173
Grammaires d’arbre/ B. Amann – p.38/173
Restrictions de Types Simples
Union de Types Simples
On peut restreindre les types simples
Grammaire :
par leur longueur (length, minLength,
maxLength) (chaînes de caractères ou listes)
par des motifs (chaînes de caractères),
par énumération,
par des intervalles (maxInclusive,
maxExclusive, minInclusive,
minExclusive) et
euroNumTél -> francTél | gerTél | belTél | ...
Schéma :
<xsd:simpleType name=’euroNumTél’>
<xsd:union memberTypes=’francTél
gerTél
belTél
...’/>
</xsd:simpleType>
autres (precision, scale, encoding,
period, duration).
Grammaires d’arbre/ B. Amann – p.35/173
Restriction de Types Simples par Motifs
Grammaires d’arbre/ B. Amann – p.39/173
Eléments
Numéro de téléphone: +33-(0)-1-34-45-67-89
Déclaration d’éléments:
DTD: #PCDATA
Schéma XML: Similaire aux expressions
régulières de Perl
<xsd:element name type contraintes [value]/>
<xsd:simpleType name=’numTél’>
<xsd:restriction base=’xsd:string’>
<xsd:pattern value=’+33-(0)-\d(-\d{2}){3}’/>
</xsd:restriction>
</xsd:simpleType>
Grammaires d’arbre/ B. Amann – p.36/173
ou
<xsd:element ref contraintes/>
Contraintes: minOccurs, maxOccurs, fixed
Exemple:
<xsd:element name=’nom’
type=’xsd:string’
minOccurs=’0’
maxOccurs=’2’/>
Grammaires d’arbre/ B. Amann – p.40/173
Attributs
Groupes: Exemple
Déclaration d’attributs:
DTD: ((B|C)*,D)+
<xsd:attribute name use [value]/>
XML schéma:
Use : required, optional, fixed, prohibited
Exemple:
<xsd:attribute name=’langue’
type=’xsd:language’
optional=’true’/>
<xsd:complexType>
<xsd:group minOccurs=’1’ maxOccurs=’unbounded’>
<xsd:sequence>
<xsd:group minOccurs=’0’ maxOccurs=’unbounded’>
<xsd:choice>
<xsd:element name=’B’ xsd:type=’xsd:string’/>
<xsd:element name=’C’ xsd:type=’xsd:string’/>
</xsd:choice>
</xsd:sequence>
</xsd:group>
<xsd:complexType>
Grammaires d’arbre/ B. Amann – p.41/173
Types Complexes
Grammaires d’arbre/ B. Amann – p.45/173
Groupes d’Attributs
Trois constructeurs de type:
xsd:sequence: séquence ordonnée
d’éléménts
xsd:all: séquence non-ordonnée
d’éléménts
xsd:choice: choix d’éléménts (DTD: ’ ’)
xsd:group: regroupement (DTD: ’(...)’).
L’adresse d’un cinéma ou d’une personne est
composée des mêmes attributs (partage) :
<xsd:element name=’cinema’>
<xsd:attributeGroup ref=’Adresse’/>
</xsd:element>
<xsd:element name=’personne’>
<xsd:attributeGroup ref=’Adresse’/>
</xsd:element>
<xsd:attributeGroup name=’Adresse’>
<xsd:attribute name=’ville’ type=’xsd:string’/>
<xsd:attribute name=’rue’ type=’xsd:string’/>
<xsd:attribute name=’numéro’ type=’xsd:decimal’/>
</xsd:attribute>
Grammaires d’arbre/ B. Amann – p.46/173
Grammaires d’arbre/ B. Amann – p.42/173
Valeurs Nulles
Type Complexe: Exemple
Modèle de contenu DTD: (titre, année)
XML Schéma:
<xsd:complexType name=’FilmType’>
<xsd:sequence>
<xsd:element name=’titre’ type=’xsd:string’/>
<xsd:element name=’année’ type=’xsd:year’/>
</xsd:sequence>
</xsd:complexType>
On distingue entre les éléments vides et les
éléments avec un contenu inconnu :
Schéma XML:
<xsd:element name=’heureFilm’
type=’xsd:time’
nullable=’true’/>
Élément XML:
<heureFilm xsi:null=’true’/>
Grammaire :
FilmType -> Titre Année
Titre -> titre String
Année -> année xsd:year
xsi:null est défini dans l’espace de noms pour
des instances (http://www.w3.org/2000/10/XMLSchema-instance).
Grammaires d’arbre/ B. Amann – p.47/173
Grammaires d’arbre/ B. Amann – p.43/173
Extension de Types Complexes
Contenu Mélangé (mixed)
DTD: (#PCDATA | cinéma | film)*
Schéma XML :
<xsd:complexType name=’OfficielType’ mixed=’true’>
<xsd:choice minOccurs=’0’ maxOccurs=’unbounded’>
<xsd:element name=’cinema’ type=’CinemaType’ />
<xsd:element name=’film’ type=’FilmType’ />
</xsd:choice>
</xsd:complexType>
Cinémas avec un site Web et un pays (fichier
webcountry.xsd):
<complexType name=’cybercinemaType’>
<complexContent>
<extension base=’officiel:cinemaType’>
<sequence>
<element name=’url’ type=’xsd:string’/>
</sequence>
</extension>
</complexContent>
</complexType>
Grammaire d’abres :
CybercinemaType -> Nom Adresse (Seance)* Url,
Nom -> nom String, Url -> url String, ...
Grammaires d’arbre/ B. Amann – p.44/173
Grammaires d’arbre/ B. Amann – p.48/173
Extension de Types Complexes
Groupes de substitution
Chaque occurrence de CinemaType dans le
modèle de contenu d’une règle est remplacée
par (CinemaType|CybercinemaType)
Le remplacement automatique peut être
empeché par les attributs block et final. Ces
deux attributs peuvent prendre comme valeurs
#all ou une liste contenant les valeurs
restriction, extension et/ou substitution :
Substitution d’éléments par d’autres éléments:
XML schéma:
<element name=’movieTheatre’
type=’cinemaType’
substitutionGroup=’cinéma’/>
L’élément movieTheatre peut être utilisé à la
place de cinéma.
<xsd:complexType name=’CinemaType’
block=’restriction’>
...
</xsd:complexType>
Grammaires d’arbre/ B. Amann – p.53/173
Grammaires d’arbre/ B. Amann – p.49/173
Valeur unique
Utilisation de Types Étendus
On indique explicitement la règle de production
pour le type :
L’attribut film_id d’un film doit être unique:
<cinema xsi:type=’CybercinemaType’>
<nom>St André des Arts</nom>
<officiel:adresse>
<ville> Paris </ville>
<rue> rue St. André des Arts </rue>
<numéro> 13 </numéro>
</officiel:adresse>
<url>http://www.st-andré.com</url>
</cinema>
<unique name=’toto’>
<selector>film</selector>
<field>@film_id</field>
</unique>
Les valeurs des element <selector> et
<field> sont des expressions XPath.
La valeur de <field> doit être unique à
l’intérieur de chaque élément sélectionné par
le sélecteur.
Grammaires d’arbre/ B. Amann – p.50/173
Grammaires d’arbre/ B. Amann – p.54/173
Clés et Références
Utilisation de Types Étendus
Par défaut, les éléments cinema sont de type
cinemaType.
Le type d’un élément est indiqué explicitement
avec l’attribut xsi:type.
XML Schéma permet de définir des
grammaires sans concurrence restreinte
l’attribut xsi:type indique la règle de
production à choisir
Une clé est unique (filmcli = clé):
<key name=’filmclé’>
<selector>film</selector>
<field>@film_id</field>
</key>
Référence (filmref = clé etrangère):
<keyref name=’filmref’ refer=’filmclé’>
<selector>séance</selector>
<field>@ref_film</field>
</keyref>
Grammaires d’arbre/ B. Amann – p.55/173
Grammaires d’arbre/ B. Amann – p.51/173
Restriction de Types Complexes
Bibliographie: Typage XML
On définit un type spécifique pour les cinémas
avec une à trois séances (fichier seance.xsd):
M. Makoto, Taxonomy of XML Schema
Languages using Formal Language Theory
<complexType name=’séanceobligType’>
<complexContent>
<restriction base=’cinemaType’>
<complexType content=’elementOnly’>
<sequence minOccurs=’1’ maxOccurs=’3’>
<element ref=’seance’/>
</sequence>
<element name=’nom’ type=’string’/>
<element ref=’adresse’/>
</complexType>
</complexContent>
</complexType>
J. Siméon et P. Wadler, The Essence of XML
Site W3C: http://www.w3.org/XML/Schema
Grammaires d’arbre/ B. Amann – p.52/173
Grammaires d’arbre/ B. Amann – p.56/173
Exemple : Deux Bases de données
Base 1:
Base 2:
&a
&1
Inférence de type
&3
&2
&4
"Toto"
&b
&6
&5
"Lulu"
&d
"Lulu"
&c
"Toto"
123
Grammaires d’arbre/ B. Amann – p.57/173
Grammaires d’arbre/ B. Amann – p.61/173
Exemple: Inférence de type avec Datalog
Point-fixe maximal
Etant donné un graphe de données et un
graphe de schéma (type) on peut se poser deux
questions :
Le résultat des règles précédentes est vide dans
les deux cas si on applique la sémantique du point
fixe minimal (Nom, Sal, Personne, Employe et
Root sont vides au départ)
Est-ce que
est conforme à
? (validation)
Quel noeud dans appartient à quelle classe
dans ? (classification)
Point fixe maximal:
: chaque prédicat intensionel (type) contient
tous les faits (objets) de la base ;
contient tous les faits qui peuvent être
dérivé de
Grammaires d’arbre/ B. Amann – p.58/173
Grammaires d’arbre/ B. Amann – p.62/173
Exemple: Classification avec Datalog
Exemple Base 1
Règles :
Base 1 :
:
:
Si est le fils d’un élément de type Personne
et de type string, alors est de type Nom;
,
,
,
,
, ...
Si est le fils d’un élément de type Employé et
de type integer, alors est de type Sal;
,
Si a des fils de type Nom, alors
élément de type Personne;
est un
:
,
Si a des fils de type Nom et de type Salaire
alors est un élément de type Employé.
,
,
,
=
(point fixe)
Grammaires d’arbre/ B. Amann – p.59/173
Grammaires d’arbre/ B. Amann – p.63/173
Exemple: Règles Datalog
Exemple Base 2
Schéma ;
Base 2 :
:
:
Nom(x) :- Personne(y), parent(x,y), string(x);
Sal(x) :- Personne(y), parent(x,y), integer(x);
Personne(x) :- Nom(y), parent(y,x);
Employe(x) :- Nom(y), parent(y,x),
Sal(z), parent(y,z);
Root(x):- Personne(y), parent(y,x);
Root(x):- Employe(y), parent(y,x);
,
,
,
,
,
:
,
,
,
: = (point fixe)
le noeud
n’a pas pu être typé
,
Grammaires d’arbre/ B. Amann – p.60/173
,
, ...
,
,
,
,
:
Grammaires d’arbre/ B. Amann – p.64/173
Simulation
Comparaison de schémas
Schémas et données sont des graphes avec des
arcs étiquettés :
On veut vérifier si toutes les bases de données qui
sont conforme à un schéma , sont aussi
conforme à un schéma ? ( subsume/inclue ) :
Si
et
, alors
Une relation
est une simulation de
dans (
) si pour chaque arc
dans
et chaque pair
, il existe un arc
dans
, tel que
et
.
où
.
S’il existe une simulation de vers , et
est conforme à , alors est conforme à .
Grammaires d’arbre/ B. Amann – p.65/173
Bibliographie
Simulation: Données
S. Abiteboul, P. Buneman, D. Suciu, Data on
the Web
S. Nestorov, S. Abiteboul, R. Motwani,
Inferring Structure in Semistructured Data
&r1
data
person
Grammaires d’arbre/ B. Amann – p.69/173
person
company
employee
employee
&p1
&c1
name position
works_for
name
&s0
&p2
&s1
name position
&s2
address
&s3
&s4
&s5
Grammaires d’arbre/ B. Amann – p.66/173
Grammaires d’arbre/ B. Amann – p.70/173
Simulation: Schéma et Simulation
schema
Root
&r1
&p1
&c1
&p2
&s0
&s1
&s2
&s3
&s4
&s5
company
person
employee
Person
Company
works_for
addr
name
name
position
String
String
String
Interroger XML: XQuery 1.0
Root Simulation
Person
Company
Person
String
String
String
String
String
String
Grammaires d’arbre/ B. Amann – p.67/173
Simulation: Exemple
Interrogation de documents XML
Il peut y avoir plusieurs simulation de
Si
dans
:
et
, alors
: il existe toujours une
simulation maximale de vers
Un objet appartient à un concept , si
où est la simulation maximale de dans .
Remarque : le calcul de la simulation maximale
est similaire au calcul du point fixe maximal du
programme Datalog.
XQuery/ B. Amann – p.71/173
Comment interroger des documents XML ?
Solutions :
SQL : il faut stocker XML dans une BD
relationnel
expressions XPath : extraction de fragments
Grammaires d’arbre/ B. Amann – p.68/173
règles XSLT : extraction + transformation
(règles)
XQuery : vrai langage de requêtes pour XML
XQuery/ B. Amann – p.72/173
La place de XQuery dans le monde XML
Modèles et Langages:
Groupes de travail:
Exemples de valeurs
47
’’toto’’
XQuery
XQuery
XSLT
XML
XML
Schema
<a/>
(1, 2, 3)
Schema
XPath 2.0
XPath
(47, <a/>, ‘‘toto’’)
un document XML
() : liste vide
ERROR : valeur d’erreur
(Don Chamberlin)
XQuery/ B. Amann – p.73/173
Valeurs
Modèle abstrait d’un traitement XML
Schéma XML
Document XML
XQuery/ B. Amann – p.77/173
XQuery
XQuery ne fait pas la distinction entre un item
et une séquence de longueur 1
Il n’existe pas de séquence imbriqués
PSV
XML
Parseur XML
Validateur
Infoset
Remplacement entités
Document bien formé
Infoset
Modèle
de données
Il n’existe pas de valeur nulle
Une séquence peut être vide
Insertion de valeurs par défaut
Document valide
Résultat
PSV: Post−schema validated Infoset (avec annotations de types)
Une séquence peut contenir des valeurs
hétérogènes
Toutes les séquences sont triées
XQuery/ B. Amann – p.74/173
XQuery/ B. Amann – p.78/173
Noeuds
Modèle de données de XQuery
On a besoin d’un modèle de données pour définir
le sens (la sémantique) des expressions XQuery:
Requête qex:
document("bib.xml")/bib//book[1]/(editor union author)
Chaque noeud a une identité
Les éléments et les attributs sont annotés par
un type (XMLSchema)
Chaque noeud a une valeur typée:
une séquence de valeurs atomiques (ou
ERROR)
de type inconnu (“anySimpleType”)
Modèle de données :
Une valeur est une séquence ordonnée de
zéro ou plus d’items.
Un item est un noeud ou une valeur
atomique.
Les noeuds sont triés dans l’ordre du
document
XQuery/ B. Amann – p.79/173
XQuery/ B. Amann – p.75/173
Noeuds et Valeurs Atomiques
Exemples de valeurs
XQuery est un langage fortement typé :
Chaque valeur a un type :
types de noeuds XML:
document
élément, attribut
text
commentaire, instruction de traitement,
espace de nom
47
types atomiques XML Schéma:
xsd:string, xsd:int, ...
()
xsd:int
(1, 2, 3)
xsd:int, xsd:int, xsd:int
(47, ‘‘toto’’)
<a/>
xsd:int, xsd:string
element a {()}
<a>toto</a>
element a {text}
()
ERROR
XQuery/ B. Amann – p.76/173
XQuery/ B. Amann – p.80/173
XQuery: Langage Fonctionnel
Document Exemple: bib.xml
XQuery est un langage fonctionnel :
<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>
XQuery/ B. Amann – p.85/173
une requête XQuery est une composition
d’expressions
il existe 21 sortes d’expressions
chaque expression a une valeur
les expressions n’ont pas d’effets de bord
les expressions peuvent être composées
librement
la valeur ERROR est propagée (exception)
XQuery/ B. Amann – p.81/173
Expressions XQuery
Expressions simples
litéraux (valeurs atomiques): 46, “Salut”
Requête qar:
valeurs construites: true(),
1+2
date(‘‘2002-10-23’’)
Résultat:
variables: $x, $y, ...
opérateurs arithmétiques: +
3
-
*
div
mod
séquences: (1,2), (1, ‘‘toto’’, <toto/>)
union, intersection, différence de séquences
de noeuds
Requête qel:
(1, (2, 6), "toto", <toto/>)
Résultat:
1, 2, 6, toto, <toto/>
XQuery/ B. Amann – p.82/173
Expressions XQuery (suite)
XQuery/ B. Amann – p.86/173
Expressions de chemins
expressions de chemins: XPath 2.0
Requête q1:
opérateurs de comparaison pour valeurs
atomiques, noeuds et séquences
document("bib.xml")//author
Résultat:
constructeurs de noeuds
boucles (for-let-where-return)
<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>
tests (if-then-return-else-return)
Nous supposons la connaissance de XPath 1.0...
expressions logiques: and
or
not()
appels de fonctions
XQuery/ B. Amann – p.87/173
XQuery/ B. Amann – p.83/173
DTD Exemple: bib.dtd
Expressions de chemins: XPath 2.0
<!ELEMENT bib (book* )>
<!ELEMENT book (author+ | editor+ ),
publisher, price )>
<!ATTLIST book year CDATA #IMPLIED
title CDATA #REQUIRED>
<!ELEMENT author (la, fi )>
<!ELEMENT title (#PCDATA )>
<!ELEMENT la (#PCDATA )>
<!ELEMENT fi (#PCDATA )>
<!ELEMENT affiliation (#PCDATA )>
<!ELEMENT publisher (#PCDATA )>
<!ELEMENT price (#PCDATA )>
Dans XPath 2.0, chaque étape est une expression
XQuery ( XPath 1.0) :
//book[1]/author
//book[1]/publisher
//book[1]/(author,publisher) (!)
//book[author/la=’’Scholl’’]
//book[author/la=’’Suciu’’]/publisher
//book[position() lt last()]
XQuery/ B. Amann – p.84/173
XQuery/ B. Amann – p.88/173
Construction de noeuds XML (1)
Union de séquences de noeuds
Nom et contenu connu:
Requête q3:
Requête q2a:
<Livre>
Les auteurs et le prix du premier livre:
{ document("bib.xml")//book[1]/(author union price) }
</Livre>
<livre auteur="L. Carroll">
<titre>Alice au Pays de Merveilles</titre>
</livre>
Résultat:
Résultat:
<Livre>
Les auteurs et le prix du premier livre:
<livre auteur="L. Carroll"><titre>Alice au Pays de Merveilles</titre></livre>
<author><la>Amann</la><fi>B.</fi></author>
<author><la>Rigaux</la><fi>P.</fi></author>
<price>28.95</price>
</Livre>
Les trois opérateurs union, intersect et except
éliminent les duplicats.
XQuery/ B. Amann – p.93/173
XQuery/ B. Amann – p.89/173
Construction de noeuds XML (2)
Différence de séquences de noeuds
Nom connu, contenu calculé: { expr }
Requête q4:
Requête q2:
<livre>
Tous les sous-elements sauf les auteurs:
{ document("bib.xml")//book[1]/(* except author) }
</livre>
<auteurs>
{ document("bib.xml")//author/la }
</auteurs>
Résultat:
Résultat:
<livre>
Tous les sous-elements sauf les auteurs:
<publisher>O’Reilly</publisher>
<price>28.95</price>
</livre>
<?xml version="1.0"?>
<auteurs>
<la>Amann</la>
<la>Rigaux</la>
<la>Rigaux</la>
<la>Scholl</la>
<la>Voisard</la>
<la>Abiteboul</la>
<la>Buneman</la>
<la>Suciu</la>
</auteurs>
XQuery/ B. Amann – p.94/173
XQuery/ B. Amann – p.90/173
Construction de noeuds XML (3)
Construction de séquences
Nom et contenu calculé:
Requête q5a:
element { expr-nom } { expr-contenu }
attribute { expr-nom } { expr-contenu }
<livre>
Le prix suivi des auteurs:
{ document("bib.xml")//book[1]/(price,author) }
</livre>
Résultat:
Requête q2b:
<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>
element {concat("a_",string(1+4))} {9+3}
Résultat:
<a_5>12</a_5>
On a changé l’ordre des noeuds (
union)...
XQuery/ B. Amann – p.91/173
Construction de noeuds XML (4)
XQuery/ B. Amann – p.95/173
Opérateurs arithmétiques
Requête q2c:
opérateurs unaires : +
-
element livre {
attribute {concat("auteur_",
string(1+2))} {
"toto"
}
}
opérateurs binaires : +
-
*
div
mod
Requête qari:
document("bib.xml")//book[1]/price * 1.2
Résultat:
Résultat:
<livre auteur_3="toto"/>
3.474E1
XQuery/ B. Amann – p.92/173
XQuery/ B. Amann – p.96/173
Transformation noeud
valeur
Comparaisons de noeuds
Requête q6:
<auteurs>
{ document("bib.xml")//book[2]/author/la }
<noms>
{ document("bib.xml")//book[2]/author/xf:string(la) }
</noms>
</auteurs>
Comparaison de l’identité de deux noeuds :
si
est identique à .
document("bib.xml")//book[author[2] is author[last()]]
Résultat:
<auteurs>
<la>Rigaux</la>
<la>Scholl</la>
<la>Voisard</la>
<noms>Rigaux Scholl Voisard</noms>
</auteurs>
<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>
XQuery/ B. Amann – p.101/173
XQuery/ B. Amann – p.97/173
Comparaisons par la position
Comparaison de valeurs atomiques:
eq
ne
gt
ge
lt
is
Requête qis:
Résultat:
Expressions de Comparaisons
le
Comparaison de la positition de deux noeuds :
<<
( << ) si
apparaît avant (après)
dans le document.
Comparaison de séquences de valeurs avec
quantificateur éxistentiel:
= != > >= < <=
Requête qord:
Comparaison de noeuds:
document("bib.xml")//book[author[la="Abiteboul"] <<
author[la="Suciu"]]
is
isnot
Résultat:
Comparaison de noeuds par rapport à leur
position dans le document:
<<
>>
<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>
XQuery/ B. Amann – p.102/173
XQuery/ B. Amann – p.98/173
Comparaison de valeurs atomiques
Boucles: for-return
Requête qeq:
La clause for $var in exp affecte la variable $var
succéssivement avec chaque item dans la
séquence retournée par exp.
distinct-values(document("bib.xml")//
book/author[la eq "Rigaux"])
Résultat:
<author><la>Rigaux</la><fi>P.</fi></author>
Requête qfor:
Requête qeqerror:
for $a in document("bib.xml")//author[la eq "Voisard"]
return $a
document("bib.xml")//book[author/la eq "Rigaux"]
Résultat:
Résultat:
<author><la>Voisard</la><fi>A.</fi></author>
ERROR
L’expression author/la dans le prédicat ne
retourne pas une valeur atomique.
XQuery/ B. Amann – p.103/173
XQuery/ B. Amann – p.99/173
Boucles: for-where-return
Comparaison de séquences
Comparaison de séquences :
=
s’il existe au
qui est égal à un
moins un élément dans
élément dans .
La clause where exp permet de filtrer le résultat
par rapport au résultat booléen de l’expression
exp (= prédicat dans l’expression de chemin).
Requête qeqex:
Requête qforwhere:
document("bib.xml")//book[author/la = "Scholl"]
for $a in document("bib.xml")//author
where $a/la eq "Abiteboul"
return $a
Résultat:
<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>
XQuery/ B. Amann – p.100/173
Résultat:
<?xml version="1.0"?>
<author>
<la>Abiteboul</la>
<fi>S.</fi>
</author>
XQuery/ B. Amann – p.104/173
Boucles: for-let-where-return
Construction d’éléments
La clause let $var := exp affecte la variable $var
avec la séquence “entière” retournée par exp.
Requête quel:
Requête qlet:
for $b in document("bib.xml")//book[1]
let $al := $b/author
return <livre nb_auteurs="{count($al)}">
{ $al }
</livre>
for $b in document("bib.xml")//book[2]
return
element livre
{ element annee { string($b/@year) },
for $e in $b/@*
where name($e) != "year"
return element {name($e)} {string($e)} }
Résultat:
<?xml version="1.0"?>
<livre>
<annee>2001</annee>
<title>Spatial Databases</title>
</livre>
Résultat:
<livre nb_auteurs="2">
<author><la>Amann</la><fi>B.</fi></author>
<author><la>Rigaux</la><fi>P.</fi></author>
</livre>
XQuery/ B. Amann – p.109/173
XQuery/ B. Amann – p.105/173
Tests: if-then-else
Construction d’attributs
Requête qif:
Requête quatr:
<livres>
{ for $b in document("bib.xml")//book
where $b/author/la = "Rigaux"
return
if ($b/author[1]/la eq "Rigaux")
then <livre prem="true"> {$b/@title} </livre>
else <livre> {$b/@title} </livre>
}
</livres>
<livres>
{ for $t in document("bib.xml")//book/@title
return element livre {attribute titre {string($t)}}
}
</livres>
Résultat:
<?xml version="1.0"?>
<livres>
<livre title="Comprendre XSLT"/>
<livre prem="true" title="Spatial Databases"/>
</livres>
Résultat:
<livres>
<livre titre="Comprendre XSLT"/>
<livre titre="Spatial Databases"/>
<livre titre="Data on the Web"/>
</livres>
XQuery/ B. Amann – p.110/173
XQuery/ B. Amann – p.106/173
Quantification existentielle
Trier avec sortby
some $var in expr1 satisfies expr2
Retourne true s’il existe au moins un nœud
retourné par l’expression expr1 qui satisfait
l’expression expr2.
Requête quantex:
for $b in document("bib.xml")//book
where some $a in $b/author satisfies $a/la = "Amann"
return <livre>{$b/@title}</livre>
Résultat:
Expr1 sortby Expr2 (ascending | descending)?: trier
les éléments de la séquence retournée par l’expression
Expr1 par les valeurs retournées par Expr2.
Requête qtri:
<livres>{ for $b in document("bib.xml")//book
return <livre>{ $b/@title }</livre>
sort by(@year) }
</livres>
Résultat:
<livres>
<livre title="Comprendre XSLT"/>
<livre title="Spatial Databases"/>
<livre title="Data on the Web"/>
</livres>
<livre title="Comprendre XSLT"/>
XQuery/ B. Amann – p.107/173
Quantification universelle
XQuery/ B. Amann – p.111/173
Jointure
every $var in expr satisfies expr
Fichier d’adresses:
Retourne true ssi tous les nœuds retournés
par l’expression expr1 satisfont l’expression
expr2
<addresses>
<person>
<name>Amann</name>
<country>France</country>
<institution>CNAM</institution>
</person>
<person>
<name>Scholl</name>
<country>France</country>
<institution>CNAM</institution>
</person>
<person>
<name>Voisard</name>
<country>Germany</country>
<institution>FU Berlin</institution>
</person>
</addresses>
Requête quantun:
for $a in document("bib.xml")//author
where every $b
in document("bib.xml")//book[author/la = $a/la]
satisfies $b/publisher="O’Reilly"
return $a
Résultat:
<author><la>Amann</la><fi>B.</fi></author>
XQuery/ B. Amann – p.108/173
XQuery/ B. Amann – p.112/173
Jointure: Requête
Exemple : Fonction avg
Requête qjoin:
Requête qavg:
for $b in document("bib.xml")//book
return element livre {
attribute titre {$b/@title},
for $a in $b/author
return element auteur {
attribute nom {$a/la},
for $p in document("addr.xml")//person
where $a/la = $p/name
return attribute institut {$p/institution} } }
for $p in distinct-values(document("bib.xml")//publisher)
let $l := document("bib.xml")//book[publisher = $p]
return element publisher {
attribute name {string($p)},
attribute avg_price { $l/data(price) }}
Résultat :
<publisher name="O’Reilly"
avg_price="28.95"/>,
<publisher name="Morgan Kaufmann Publishers"
avg_price="37.48"/>
XQuery/ B. Amann – p.113/173
Jointure: Résultat
XQuery/ B. Amann – p.117/173
Quelques fonctions pour les séquences
Résultat:
<livre titre="Comprendre XSLT">
<auteur nom="Amann" institut="CNAM"/>
<auteur nom="Rigaux"/>
</livre>,
<livre titre="Spatial Databases">
<auteur nom="Rigaux"/>
<auteur nom="Scholl" institut="CNAM"/>
<auteur nom="Voisard" institut="FU Berlin"/>
</livre>,
<livre titre="Data on the Web">
<auteur nom="Abiteboul"/>
<auteur nom="Buneman"/>
<auteur nom="Suciu"/>
</livre>
distinct-nodes(item* Seq1) => item* :
élimination de duplicats en comparant l’identité des
noeuds
distinct-values(item* Seq1) => item* :
élimination de duplicats en comparant la valeur
index-of(item* Seq, Item Search) =>
unsignedInt* : retourne les positions des nœuds
ou des valeurs dont la valeur est identique au
paramètre Search
XQuery/ B. Amann – p.114/173
XQuery/ B. Amann – p.118/173
Fonctions et opérateurs
Exemple: index-of
Les nombreux fonctions et opérateurs permettent :
Requête qindexof:
la construction, comparaison et la
transformation de valeurs
l’aggrégation des valeurs d’une séquence
<books> {
let $bl := document("bib.xml")//book
for $b in $bl
return <book> {
$b/@title,
attribute no {index-of($bl, $b)}}
</book> }
</books>
la transformation du type d’une valeur (cast)
Résultat:
l’accès au type et le nom d’un noeud
<?xml version="1.0"?>
<books>
<book title="Comprendre XSLT" no="1"/>
<book title="Spatial Databases" no="2"/>
<book title="Data on the Web" no="3"/>
</books>
XQuery/ B. Amann – p.115/173
XQuery/ B. Amann – p.119/173
Fonctions et opérateurs
Définition de Fonctions
Les fonctions et opérateurs sont
XQuery permet à l’utilisateur de définir ses
propres fonctions.
typées (XML schema) et
manipulent des séquences et des valeurs
typées (XML schema) : entier, chaîne de
caractères, dates, . . .
define function NombreAuteurs(book $b)
returns xsd:integer {
return count($b/author)
}
Le résultat est de type xsd:float.
XQuery/ B. Amann – p.116/173
XQuery/ B. Amann – p.120/173
Bibliographie: Interrogation de documents XML
Données XML structurées
Site du W3C sur XQuery:
http://www.w3.org/XML/Query
Dépendances père/fils sont importantes
P. Wadler, XQuery: a typed functional
language for querying XML
Requêtes “select-projet-join”
Ordre moins important
Tri, régroupement, transformation
Requêtes OLAP et data-mining
Stockage de données XML/ B. Amann – p.125/173
XQuery/ B. Amann – p.121/173
Données XML mixtes (documents XML)
Stockage de données XML
Fragments texte de taille importante
Requêtes plein-texte
Ordre est important
Semi-structurées (exceptions)
Requêtes “select-project” (table de contenu)
Stockage de données XML/ B. Amann – p.122/173
Stockage de données XML
Stockage de données XML/ B. Amann – p.126/173
Flux de données
Problèmes liés au stockage :
Données temporelles indépendantes
Temps d’exécution de requêtes
Requêtes de filtrage
Compléxité des mises-à-jour
Déclenchement d’évènements (requêtes
continues)
Taille des données stockées
Maintenance des relations/dépendances entre
les entités (éléments) du document
Beaucoup de petits fragments
Enrichissement des données?
Stockage de données XML/ B. Amann – p.123/173
Types de données XML
Stockage de données XML/ B. Amann – p.127/173
Modèle abstrait d’un traitement XML
Données XML : typiquement export d’une
base de données
Documents XML (données mixtes) : texte +
données
Flux de données : par exemple service SOAP
Schéma XML
Document XML
PSV
XML
Parseur XML
Validateur
Infoset
Remplacement entités
Document bien formé
XQuery
Infoset
Modèle
de données
Insertion de valeurs par défaut
Document valide
Résultat
PSV: Post−schema validated Infoset (avec annotations de types)
Stockage de données XML/ B. Amann – p.124/173
Stockage de données XML/ B. Amann – p.128/173
Stockage de XML
Techniques de stockage “natives” (suite)
Importation :
générique : indépendante de la DTD/du
schéma XML
guidé par la DTD/le schéma XML
langages : API, XPath, XQuery
+ mises-à-jours
+ chargement
Interrogation et mise-à-jour
Accès uniform : schéma de stockage
transparent pour l’utilisateur
Exportation : il doit être possible de trouver le
document d’origine
Stockage de données XML/ B. Amann – p.129/173
Critères de Comparaison
Stockage de données XML/ B. Amann – p.133/173
Techniques de stockage natives: Systèmes
espace utilisé
temps de chargement
Tamino de Software AG
Xyleme/Natix de l’Université de Manheim
temps de reconstruction d’un document XML
Xindice: Apache Software Foundation
temps de mis-à-jour
4Suite de FourThought
temps d’exécution d’une requête
problème d’optimisation
Stockage de données XML/ B. Amann – p.130/173
Stockage de données XML/ B. Amann – p.134/173
Techniques de stockage: Fichiers
Techniques de stockage “base de données étendu”
Fichiers ’plats’ ou structurés :
SGBD (objet-) relationnel étendu avec des outils
pour le traitement de documents XML :
petits documents
modèle de document structuré
langage de requêtes : grep, index plein texte
gros documents (structurés)
+ temps de chargement/reconstruction
importation générique/guidé par le schéma
modèle logique relationnel (pas hiérarchique)
langages: SQL
+ interrogation
Stockage de données XML/ B. Amann – p.131/173
Techniques de stockage “natives”
Native XML database (NXD) : conçu
spécifiquement pour XML;
Stockage de données XML/ B. Amann – p.135/173
Techniques de stockage BD : Systèmes
Oracle XML/SQL utility
définit un modèle logique pour le stockage et
l’accès à un document XML
le document XML est l’unité centrale de la
base (comme une relation dans une BD
relationnelle)
IBM DB2 XML Extender
Microsoft OpenXML
gros documents
modèle de données hiéarchique avec ordre
Stockage de données XML/ B. Amann – p.132/173
Stockage de données XML/ B. Amann – p.136/173
Stockage dans une BD relationnelle
Arbre XML
Avantages :
biblio,
on peut traiter en même temps des données
XML et des tables classiques
livre,
livre,
titre,
passage “doux” vers XML
Contraintes :
définir un mapping
XML relationnel (import) et
relationnel
XML (export)
auteur,
titre,
auteur,
auteur,
editeur,
"Germinal" "E. Zola" "Comprendre XSLT" "B. Amann" "P. Rigaux" "O’Reilly"
satisfaire les contraintes de la BD :
exemple : le nombre d’attributs par table
Stockage de données XML/ B. Amann – p.137/173
XML vs. relationnelle
Stockage de données XML/ B. Amann – p.141/173
Relation d’arcs parent/enfant
XML :
données hiérarchiques, éléments imbriqués
Parent
Pos
1
1
2
1
2
1
2
3
4
arbre ordonné
schéma optionnel
R:
Relationnel :
données ensemblistes stockées dans des
tables
absence d’ordre
schéma obligatoire
Noeud
Type
ref
ref
ref
cdata
cdata
cdate
cdata
cdata
cdata
Enfant
Valeur
Germinal
E. Zola
Comprendre XSLT
B. Amann
P. Rigaux
O’Reilly
S:
Label
biblio
livre
livre
titre
auteur
titre
auteur
auteur
editeur
Stockage de données XML/ B. Amann – p.138/173
Stockage de données XML/ B. Amann – p.142/173
Stocker un arbre dans une BD relationnelle
Requête
Solutions :
une table binaire pour stocker l’ordre et la
relation parent/enfant, une table unaire pour
les valeurs.
une table binaire pour chaque type de chemin
(Monet)
select t
from biblio.livre l,
l.titre t,
l.auteur a
where a = "E. Zola"
_
_
stockage guidé par la DTD
Oracle :
attributs de type BLOB/CLOB
(binary/character large objects)
table objet/relationnel
_
_
_
_
_
_
Stockage de données XML/ B. Amann – p.139/173
Stockage de données XML/ B. Amann – p.143/173
Document XML
Relation d’arcs parent/enfant
<?xml version=’1.0’?>
<biblio>
<livre>
<titre>Germinal</titre>
<auteur>E. Zola</auteur>
</livre>
<livre>
<titre>Comprendre XSLT</titre>
<auteur>B. Amann</auteur>
<auteur>P. Rigaux</auteur>
<editeur>O’Reilly</editeur>
</livre>
</biblio>
Avantages :
Stockage de données XML/ B. Amann – p.140/173
Format de stockage générique
Espace utilisée est faible
Inconvénients :
Scan sur une seule grande table
Beaucoup de jointures
Stockage de données XML/ B. Amann – p.144/173
Le modèle Monet
Basic inlining
Fragmentation avec classification des noeuds
(classe = type de chemin) :
Créer une ou plusieurs relations pour chaque type
d’élément :
Extraire le sous-graphe qui contient tous les
noeuds qu’on peut atteindre à partir du type
d’élément.
Créer récursivement les tables à partir de ce
sous-graphe :
une table pour la racine.
une table pour chaque noeuds cible d’un
arc
Les autres noeuds sont transformés en
attributs.
Chaque type de chemin correspond à une
table binaire
Types d’associations (fragmentation binaire
complète) :
noeud/noeud
noeud/attribut
noeud/rang
Stockage de données XML/ B. Amann – p.149/173
Stockage de données XML/ B. Amann – p.145/173
Monet: Exemple
DTD Exemple
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ATTLIST
select t
from biblio.livre l,
l.titre t,
l.auteur a
where a = "E. Zola"
livre (titre, auteur*, editeur?) >
article (titre, auteur*) >
titre #PCDATA >
auteur #PCDATA >
editeur #PCDATA >
editeur livres IDREFS >
titre
*
livre
editeur
article
?
*
*
auteur
Stockage de données XML/ B. Amann – p.146/173
Monet: Analyse
Stockage de données XML/ B. Amann – p.150/173
Simplification de DTD
Avantages :
“Unnest” définitions imbriquées :
Requêtes avec expressions de chemins
Simplification :
Exceptions sont traitées naturellement (petites
relations)
Regroupement :
, ...
Classification des noeuds
Inconvénients :
Le nombre des relations est linéaire dans la
taille du document
Stockage de données XML/ B. Amann – p.147/173
Stockage de données XML/ B. Amann – p.151/173
Basic Inlining : Exemple
Stockage guidé par la DTD: Inlining
Principe :
titre
Utiliser la DTD pour créer le schéma.
Types d’éléments peuvent être partagés
Redondance
Trois approches: basic, shared and hybrid
*
livre
Décider quand un élément est “mis” dans la
table de son parent (“inlining”) et quand il faut
créer une table séparée.
*
Stockage de données XML/ B. Amann – p.148/173
auteur
*
article
?
editeur
=livre(id, parId, titre, editeur),
=livre.auteur(id, parId, auteur),
=article(id, parId, titre),
=article.auteur(id, parId, auteur),
=editeur(id, parId, editeur),
=editeur.livre(id, parId, titre, editeur),
=titre(id,titre),
=auteur(id, parId, auteur)
Stockage de données XML/ B. Amann – p.152/173
Basic Inlining : Exemple
Shared Inlining : Exemple
Livres de Zola :
On a moins de tables :
select t
from livre l,
l.titre t,
l.auteur a
where a = "E. Zola"
_
_
_
Livres de Zola :
_
_
Noms des auteurs :
_ _
Stockage de données XML/ B. Amann – p.153/173
Stockage de données XML/ B. Amann – p.157/173
Basic Inlining : Exemple
Hybrid Inlining
Noms des auteurs :
Similaire à Shared Inlining sauf que les types
d’éléments partagés qui ne sont pas récursifs ou
sur un chemin avec ’*’ sont transformés en
attributs.
select a
from auteur a
_ _
_ _
titre ,
titre
_ _
Stockage de données XML/ B. Amann – p.154/173
Shared inlining
Stockage de données XML/ B. Amann – p.158/173
Stockage natif: Natix
Basic inlining: trop de tables...
Niveau logique : arbre XML
Créer une rélation pour chaque type d’élément
avec
degré d’entrée = 0 ou > 1: livre, article, titre
Niveau physique : arbre construit à partir de
l’abre XML + noeuds supplémentaires
cibles d’un arc “*”: auteur
degré d’entrée = 1 et mutuellement récursive
avec un autre type élément avec degré
d’entrée = 1 (e.g. A::=B, B::=A créer une
table ou une table )
Stockage de données XML/ B. Amann – p.155/173
Shared Inlining : Exemple
Stockage physique
Une page est de taille fixe et contient
plusieurs enregistrements de taille variable
titre
*
livre
auteur
*
article
?
*
Stockage de données XML/ B. Amann – p.159/173
editeur
Chaque relation contient comme attributs les
types d’éléments qui peuvent être atteints sans
traversant un type d’élément qui a été transformé
en relation.
Un enregistrement est un espace de mémoire
continu qui peut se déplacer à l’intérieur d’une
page et entre les pages.
Stockage de données XML/ B. Amann – p.156/173
Un enregistrement ne peut pas dépasser la
taille d’une page.
Stockage de données XML/ B. Amann – p.160/173
Natix: Enregistrement = sous-arbre
Natix : Split Matrix
Natix : un enregistrement stocke un
sous-arbre d’un document XML
Enregistrement = le seuil de passage entre la
représentation plate et la représentation
structurée d’un fragment XML
Une matrice à deux dimensions qui exprime le
comportement de regroupement entre les parents
et leurs enfants :
dimensions = types d’éléments
: séparer
et
si possible
Les enregistrements/sous-arbres sont reliés
par des noeuds proxy
: garder et dans le me
enregistrement si possible
: le système décide
Stockage de données XML/ B. Amann – p.161/173
Exemple d’un arbre Natix
Stockage de données XML/ B. Amann – p.165/173
La solution d’Oracle9i
Solution hybride :
r1
attributs de type CLOB (requêtes plein texte)
r2
r4
r3
r5
proxy:r7
proxy:r8
r7
r8
mapping canonique dans une table
objet-relationnel
r6
Les opérations de modification sont similaire aux
opérations sur un arbre B
comment trouver le
séparateur dans un arbre
Stockage de données XML/ B. Amann – p.162/173
Eclatement d’un enregistrement Natix
L
SQL> create table PURCHASEORDER (PODOCUMENT sys.XMLTYPE);
Table created.
SQL> insert into PURCHASEORDER (PODOCUMENT) values (
2 sys.XMLTYPE.createXML(
3 ’
4 <PurchaseOrder>
5
<Refernce>2365</Reference>
6
<Actions>
7
<Action>
8
<User>KING</User>
9
<Date>12/11/02</DATE>
10
</Action>
11
</Actions>
12 </PurchaseOrder>
13 ’));
R
f2
f3
Attibuts de types CLOB: XMLType d’Oracle 9i
S
f1
f6
f4
f5
f7
f8
le noeud
f11
f12
f10
f9
f13
Stockage de données XML/ B. Amann – p.166/173
f14
d
définit une coupure
séparateur = les noeuds de la racine jusqu’à
comment trouver : descendre dans le milieu
de le l’arbre
Stockage de données XML/ B. Amann – p.163/173
Assemblage
Requêtes SQL et XMLType
p1
p2
f1
Requête :
f6
SQL> select p.podocument.getClobVal()
1 from purchaseorder p
5 /
p4
p3
h1
f7
f2
f3
f10
h2
f11
f12
f5
f4
Stockage de données XML/ B. Amann – p.167/173
f8
f9
f13
f14
Stockage de données XML/ B. Amann – p.164/173
P.PODOCUMENT.GETCLOBVAL()
---------------------------------<PurchaseOrder>
<Reference>2365</Reference>
<Actions>
<Action>
<User>KING</User>
<Date>12/11/02</DATE>
</Action>
</Actions>
</PurchaseOrder>
Stockage de données XML/ B. Amann – p.168/173
Requêtes SQL avec extraction XPath
Requête :
SQL> select P.PODOCUMENT.extract(
2
’/PurchaseOrder//User).getClobVal()
3 from PURCHASEORDER P
4 where P.PODOCUMENT.extract(
5
’/PurchaseOrder//Date/text()’
6
).getStringVal() = 7 ’12/11/02’
P.PODOCUMENT.EXTRACT(’/PurchaseOrder//User’).GETCLOBVAL()
---------------------------------------<User>KING</User>
Stockage de données XML/ B. Amann – p.169/173
Mapping canonique
XML:
SQL:
<row>
<Person>
<Name>Toto</Name>
<Addr>
<City>...</City>
<Street>...</Street>
</Addr>
</Person>
</row>
create type AddrType
as OBJECT (
City VARCHAR2(32)
Street VARCHAR2(32)
);
create table Person (
Name VARCHAR2(32)
Addr AddrType
);
Stockage de données XML/ B. Amann – p.170/173
Mapping canonique
Avantages :
Interrogation “directe” avec SQL
Vue objet-relationnel de données XML
Transformation dans la forme canonique avec
XSLT
Inconvénients :
Difficile à mettre en oeuvre sur des
documents irrégulière
SQL n’a pas la puissance de XPath pour les
expressions de chemin
Stockage de données XML/ B. Amann – p.171/173
Bibliographie Stockage XML
Sihem Amer-Yahia et Mary Fernandez,
Overview of Existing XML Storage
Techniques, Sigmod Record 2002
Sihem Amer-Yahia, Techniques for Storing
XML, tutorial ICDE’2002
Florescu, Kossman, A Performance
Evaluation of Alternative Mapping Schemes
for Storing XML Data in a RDBMS
Albrecht Schmid, et.al., Efficient Relational
Storage and Retrieval of XML Documents
Stockage de données XML/ B. Amann – p.172/173
Bibliographie Stockage XML (suite)
Suciu, et.al, Storing semistructured data with
STORED
Kanne, Stockage XML natif dans Natix
ToX: The Toronto XML Engine.
S. Munch, Building Oracle XML Applications
Stockage de données XML/ B. Amann – p.173/173
Téléchargement