BD et XML : Exercices 1 Stockage XML Voici un arbre XML : A B E C F C F C F D C C D D D 1.1 Stockage générique Exercice 1.1.1 : Définissez un schéma de stockage relationnel générique (sans prendre en compte la DTD du document) et qui permet de stocker ce document (en préservant l ordre des noeuds du document) dans une seule table. Nodes(id,pos,eltype,parid) Exercice 1.1.2 : Donnez les requêtes relationnelles (SQL, algèbre ou calcul) qui retournent les identifiants de tous les noeuds qu on obtient par les expressions XPath suivantes : 1. //C : tous les noeuds C select distinct C.id from Nodes C where C.eltype= C 2. //D : tous les noeuds D select distinct D.id from Nodes D where D.eltype= D Exercice page: 1
3. /A/* : enfants de A select distinct X.id from Nodes A, Nodes X where A.eltype= A and X.parid=A.id 4. /A/*/D : petits-enfants D de A select distinct D.id from Nodes A, Nodes X, Nodes D where A.eltype= A and D.eltype= D and X.parid=A.id and D.parid=X.id 5. /A/*/C[not(D)] : petits-enfants C de A qui n ont pas d enfant D select distinct C.id from Nodes A, Nodes X, Nodes C where A.eltype= A and C.eltype= C and X.parid=A.id and C.parid=X.id and C.id not in (select D.parid from Nodes D where D.eltype= D ) 6. //C/preceding-sibling::* : tous les frères de gauche de noeuds C select distinct C.id from Nodes C, Nodes X where C.eltype= C and X.parid = C.parid and X.pos < C.pos Exercice page: 2
7. //C/preceding-sibling::*[1] : le premier frère de gauche de noeuds C select distinct C.id from Nodes C, Nodes X where C.eltype= C and X.parid = C.parid and X.pos = C.pos - 1 8. A//* : tous les descendants de A (on connaît la profondeur de l arbre) select distinct X.id from Nodes A, Nodes X where A.eltype= A and (X.parid = A.id or X parid in (select Y.id from Nodes Y where Y.parid = A.id or Y.parid in (select Z.id from Nodes Z where Z.parid = A.id))) Exercice 1.1.3 : Donnez le schéma relationnel qu on obtient en appliquant le schéma de stockage Monet (on veut à nouveau maintenir l ordre des noeuds). 1. A.B(par,pos,id) 2. A.E(par,pos,id) 3. A.B.C(par,pos,id) 4. A.B.C.D(par,pos,id) 5. A.B.F(par,pos,id) 6. A.E.D(par,pos,id) 7. A.E.C(par,pos,id) 8. A.E.C.D(par,pos,id) Exercice 1.1.4 : Donnez des requêtes relationnelles (SQL, algèbre ou calcul) qui retournent les identifiants de tous les noeuds qu on obtient par les expressions XPath suivantes : 1. //C Exercice page: 3
(select distinct id from A.B.C) union (select distinct id from A.E.C) 2. /A/*[position()=1] (select distinct id from A.B where pos=1) union (select distinct id from A.E where pos=1) 3. /A/*/C[not(D)] (select distinct id from A.B.C where id not in (select par from A.B.C.D)) union (select distinct id from A.E.C where id not in (select par from A.E.C.D)) 4. /A/*/F[not(D)] select distinct id from A.B.F Exercice 1.1.5 : Comment est-ce qu on pourrait modifier ce schéma pour éviter les unions? Créer une table séparée pour les éléments partagés : C et D 1.2 Stockage spécifique à une DTD Exercice 1.2.1 : Définissez une DTD pour l arbre précédent. <!ELEMENT A (B,E)> <!ELEMENT B (C,F)*> <!ELEMENT C D?> <!ELEMENT D EMPTY> <!ELEMENT E (D,C*)> <!ELEMENT F EMPTY> Exercice page: 4
Exercice 1.2.2 : Donnez un schéma relationnel qui prend en compte la DTD du document et on supposant que tous les éléments racine sont de type A. Le schéma doit (1) minimiser le nombre de tables et d attributs et (2) éviter des redondances dans les données. Les valeurs NULL sont acceptées. Basic inlining (sans valeurs NULL) : 1. A(idA, idb, ide, ided) 2. C(idC, par, pos, idd) 3. F(idF, par, pos) Exercice 1.2.3 : Donnez les requête relationnelles (SQL, algèbre ou calcul) qui retournent les identifiants de tous les noeuds qu on obtient par les expressions XPath suivantes. Essayez de donner pour chaque requête une version optimisée qui prend en compte la DTD et suppose que tous les documents interrogés sont valides : 1. //C select distinct idc from C 2. //E select distinct ide from A 3. //D (select distinct ided from A) union (select distinct idd from C ) 4. /A/*[position()=1] (select distinct idb from AB where pos=1) union (select distinct ide from AE where pos=1) 5. /A/*/C[not(D)] Exercice page: 5
select distinct idc from C where idd IS NULL 6. /A/*/F[not(D)] select distinct idf from F Exercice 1.2.4 : Comment est-ce qu on pourrait modifier ce schéma pour améliorer les performances? En introduisant de la redondance par l a création de tables supplémentaires qui évitent les unions. 2 Grammaires XML 2.1 DTD et grammaires d arbres Voici une DTD dtd et un grammaire d arbre G : dtd : <!ELEMENT dossiers (dossier*, personne*) > <!ELEMENT dossier (consultation)* > <!ELEMENT consultation (symptome+, prescription?) > <!ELEMENT symptome (#PCDATA) > <!ELEMENT prescription (medicament)* > <!ELEMENT medicament (#PCDATA) > <!ELEMENT personne (nom, prenom, tel?) > <!ELEMENT nom (#PCDATA) > <!ELEMENT prenom (#PCDATA) > <!ELEMENT tel (#PCDATA) > G : Dossiers -> dossiers (Dossier*, Patient*, Medecin*) Dossier -> dossier (Consultation*) Patient -> personne (Nom, Prenom) Medecin -> personne (Nom, Prenom, Tel) Consultation -> consultation (Symptome+, Prescription?) Nom -> nom Pcdata Prenom -> prenom Pcdata Tel -> tel Pcdata Symptome -> symptome Pcdata Exercice page: 6
Prescription -> prescription (Medicament+) Medicament -> medicament Pcdata Exercice 2.1.1 : Est-ce que la DTD dtd valide tous les documents validés par la grammaire G : sat(g) sat(dtd)? oui Exercice 2.1.2 : Est-ce que la grammaire G valide tous les documents validés par la DTD dtd : sat(dtd) sat(g)? non Exercice 2.1.3 : Donnez un exemple de document qui est validé par la DTD dtd mais pas la grammaire G. <dossiers> <personne> <nom>...</nom> <prenom>...</prenom> <tel>...</tel> </personne> <personne> <nom>...</nom> <prenom>...</prenom> </personne> </dossier> Exercice 2.1.4 : Pourquoi la grammaire G 2 ne peut pas être traduite en DTD? Il n est pas possible de spécifier dans une DTD que le document contient d abord tous les éléments personne sans numéro de téléphone. 2.2 Schémas XML et Grammaires d arbres <?xml version="1.0" encoding="iso-8859-1"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:element name="shiporder"> <xs:complextype> <xs:sequence> <xs:element name="orderperson" type="xs:string"/> <xs:element name="shipto"> <xs:complextype> <xs:sequence> Exercice page: 7
<xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="item" maxoccurs="unbounded"> <xs:complextype> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="note" type="xs:string" minoccurs="0"/> <xs:element name="quantity" type="xs:positiveinteger"/> <xs:element name="price" type="xs:decimal"/> </xs:sequence> </xs:complextype> </xs:element> </xs:sequence> <xs:attribute name="orderid" type="xs:string" use="required"/> </xs:complextype> </xs:element> </xs:schema> Exercice 2.2.1 : Traduisez ce schéma en grammaire d arbres. Root -> shiporder OrderPers ShipTo Item* ShipTo -> shipto Name Addr City Countr Item -> item Title Note? Quant Price OrderPers -> orderperson xs:string Name -> name xs:string Addr -> address xs:string City -> city xs:string Countr -> country xs:string Title -> title xs:string Note -> note xs:string Quant -> quantity xs:positiveinteger Price -> price xs:decimal L attribut orderid n est pas défini dans la grammaire. 2.3 Opérations sur les grammaires Voici deux grammaires d arbres G1 et G2 avec le même type racine Annu : Exercice page: 8
Grammaire G 1 : Grammaire G 2 : Annu annuaire Pers + Pers etudiant CoorEtud Pers enseignant CoorEns CoorEtu coord Nom Num Adr? CoorEns coord Nom Adr Tel? Nom nom String Num num String Adr adresse String Tel telephone String Annu annuaire Pers + Pers etudiant CoorPer Pers enseignant CoorPer CoorPer coord Nom Adr? Nom nom String Adr adresse String Exercice 2.3.1 : Est-ce que tous les documents XML validés par la grammaire G2 sont aussi validés par G1 : sat(g2) sat(g1)? Non : les étudiants dans les documents validés par G 1 doivent avoir un numéro (élément Num), ce qui est interdit pour les documents validés par G 2. Exercice 2.3.2 : Est-ce qu il est possible de traduire la grammaire G1 en DTD? Non, car les éléments coord ont des types différents pour les étudiants et les enseignants. Exercice 2.3.3 : Traduisez la grammaire G2 en DTD XML. <!ELEMENT annuaire (etudiant enseignant)+ > <!ELEMENT etudiant (coord) > <!ELEMENT enseignant (coord) > <!ELEMENT coord (nom, adresse?) > <!ELEMENT nom #PCDATA > <!ELEMENT adresse #PCDATA > Exercice 2.3.4 : Donnez un exemple de document XML qui est validé par les deux grammaires G1 et G2. <annuaire> <enseignant> <coord> <nom>amann</nom> <adresse>lip6</adresse> </coord> </enseignant> </annuaire> Exercice page: 9
Exercice 2.3.5 : Donnez l intersection G1 G2 des grammaire G1 et G2 telle que sat(g1 G2) = sat(g1) sat(g2). Grammaire G1 G2 : Annu annuaire Pers + Pers enseignant CoorPer CoorPer coord Nom Adr Nom nom String Adr adresse String Exercice 2.3.6 : Donnez l union G1 G2 des grammaire G1 et G2 telle que sat(g1 G2) = sat(g1) sat(g2). Grammaire G1 G2 : Annu annuaire (Pers1 + Pers2 + ) Pers1 etudiant CoorEtud Pers1 enseignant CoorEns Pers2 etudiant CoorPer Pers2 enseignant CoorPer CoorEtu coord Nom Num Adr? CoorEns coord Nom Adr Tel? CoorPer coord Nom Adr? Nom nom String Num num String Adr adresse String Tel telephone String Exercice 2.3.7 : (plus difficile) Donnez la différence G1 G2 des grammaire G1 et G2 telle que sat(g1 G2) = sat(g1) sat(g2). Grammaire G1 G2 : Annu annuaire (Etu (Etu Ens) + ) (Ens* EnsTel Ens*) Etu etudiant CoorEtud Ens enseignant CoorEns EnsTel enseignant CoorEnsTel CoorEtu coord Nom Num Adr? CoorEns coord Nom Adr Tel? CoorEnsTel coord Nom Adr Tel Nom nom String Num num String Adr adresse String Tel telephone String Exercice page: 10