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