Fonctions Pre-définies En XQUERY on a des fonctions min

Transcription

Fonctions Pre-définies En XQUERY on a des fonctions min
Fonctions Pre-définies
En XQUERY on a des fonctions min, max, count, sum et avg analogues à celles de
SQL. On a déjà vu des exemples avec count.
Quels livres sont plus chers que la moyenne ?
let $b := doc("books.xml")//book
let $avg := average( $b//price )
return $b[price > $avg]
On obtient :
⇒
180
<book year = "1999">
<title>The Economics of Technology and Content for
Digital TV</title>
<editor>
<last>Gerbarg</last>
<first>Darcy</first>
<affiliation>CITI</affiliation>
</editor>
<publisher>Kluwer Academic Publishers</publisher>
<price>129.95</price>
</book>
N.B : price est le nom d’un élément, pas un type tel que on puisse calculer le
maximum de < valeur1 (price), ..., valeurn (price) >, mais max extrait la séquence des
valeurs de price, et fait la conversion réquise.
181
On a aussi des fonctions numériques comme round, floor et ceiling.
On a des fonctions des chaı̂nes de caractères comme :
concat,
string-length,
starts-with,
end-with,
substring,
upper-case,
lower-case.
Puis : distinct-values et doc (déjà vues).
182
Et encore : not.
Quels sont les livres dont aucun auteur s’appelle Stevens ?
for $b in doc("books.xml")//book
where not(some $a in $b/author satisfies $a/last="Stevens")
return $b
La fonction empty teste si une séquence est vide.
Quels sont les livres qui ont au moins un auteur ?
for $b in doc("books.xml")//book
where not(empty($b/author))
return $b
On aurait pu aussi écrire :
for $b in doc("books.xml")//book
where exists($b/author)
return $b
183
La fonction string, appliqué à un noeud, renvoie la réprésentation sous forme de
chaı̂ne de caractères du texte trouvé dans le noeud et ses déscendants. Par exemple, la
requête :
string((doc("books.xml")//author)[1])
calcule la chaı̂ne ‘‘Stevens W.’’ (le nom du premier auteur dans le document).
La fonction data, appliqué à un noeud, renvoie la valeur typée d’un noeud ; exemples
d’utilisation de cette fonction dans le TD.
184
Fonctions définies par l’utilisateur
On peut définir une fonction qui calcule une requête donnée, et la réutiliser. Par exemple :
define function books-by-author($last, $first)
as element()*
{
for $b in doc("books.xml")/bib/book
where some $ba in $b/author satisfies
($ba/last=$last and $ba/first=$first)
order by $b/title
return $b/title
}
définie une fonction qui crée une fonction qui liste les livres auteur par auteur, et la
nomme books-by-author.
185
XQUERY supporte la définition de fonctions récursives.
Suppose qu’un chapitre de livre est constitué de sections, qui peuvent être imbriquées. La
requête suivante crée une table des matières, containant les sections et leur titres, selon la
structure des sections du livre.
define function toc($book-or-section as element())
as element()*
{for $section in $book-or-section/section
return
<section>
{ $section/@* , $section/title , toc($section) }
</section>}
<toc>
{
for $s in doc("xquery-book.xml")/book
return toc($s)
}
</toc>
186
Quelque éléments de réponse à la question sur : “XQUERY et Mises à Jour”
– Lien :
http://www.w3.org/TR/xquery-update-10
This document defines an update facility that extends the XML Query language,
XQuery. The XQuery Update Facility provides expressions that can be used to make
persistent changes to instances of the XQuery 1.0 and XPath 2.0 Data Model.
– Lien :
http://exist.sourceforge.net/update_ext.html}
Previous versions of eXist already offered some functions to execute XUpdate queries
from within XQuery. However, this approach had its limitations, mainly due to the lack
of integration between the XUpdate language and XQuery....
We thus provide an extension to XQuery, which maps each of the XUpdate instructions
to a corresponding XQuery expression.
Un exemple sur ce site :
update insert <email type="office">[email protected]</email>
into //address[fname="Andrew"]
187
9
Une Etude de Cas
187-1
On va modéliser un même ensemble d’informations à l’aide des 3 modèles : relationnel,
à objet, et semi-structuré.
But : illustrer analogies et différences entre les trois approches, limites respectives, etc.
188
La BD des BD
Une bande dessinée a un ou plusieurs auteurs, qui sont scénaristes ou/et dessinateurs
et/ou coloristes de l’ouvrage en question. Elle a un unique éditeur, un unique titre, un
unique ISBN, un unique format et un unique prix.
Les mangas sont des bandes dessinées particulières, qui n’ont pas de coloriste mais ont
un attribut supplémentaire, sens de lecture, qui vaut gauche droite ou droite gauche.
Un auteur a un nom, parfois un prénom, une ou plusieurs adresses, parfois une
thématique, et parfois il est sous contrat d’exclusivité avec un éditeur.
Un éditeur a un nom, une adresse et parfois a des auteurs sous contrats.
Les adresses sont constituées d’un numéro, d’un nom de rue, d’une ville et d’un pays.
189
Une Modèlisation Relationnelle
Une parmi les modèlisations possibles crée un schéma avec 7 tables : BD pas Mangas,
Mangas, Infos Auteur, Auteur Adresses, Auteur Oeuvres Pas Mangas
Auteur Oeuvres Mangas,
Contrats.
Chaque schéma de table est en BCNF (Forme Normale de Boyce Codd).
⇒
190
BD pas M angas :
titre
ISBN
long
larg
prix
Ident edit
num rue ed
rue ed
ville ed
pays ed
Dépendances Fonctionnelles F :
{ISBN → titre, long, larg, prix, Ident edit, num rue ed, rue ed, ville ed, pays ed}
Clé : ISBN
Ce schéma de table est en BCNF : les seules dépendances fonctionnelles significatives
sont celles à partir de la clé.
191
M angas : même table que pour BD pas Mangas, avec, en plus, l’attribut
sens de lecture, dont le domaine est {“GD ′′ , “DG′′ } (de gauche à droite, de droite à
gauche).
Dépendances Fonctionnelles F : les mêmes que pour BD pas Mangas, plus
ISBN → sens de lecture.
Clé : ISBN
Ce schéma de table est en BCNF.
192
Inf os Auteur :
NSS
nom
prenom
thematique
Dépendances Fonctionnelles F : {N SS → nom, prenom, thematique}
Clé : NSS
Ce schéma de table est en BCNF.
193
Auteur Adresses :
NSS
num rue aut
rue aut
ville aut
pays aut
Dépendances Fonctionnelles F : seulement la dépéndance banale :
N SS, num rue aut, rue aut, ville aut, pays aut → N SS, num rue aut, rue aut, ville aut,
Clé : {N SS, num rue aut, rue aut, ville au, pays aut}.
Ce schéma de table est en BCNF.
NB : Le fait qu’il faut tous les attributs dans la clé est du à l’hypothèse qu’un auteur peut
avoir plusieurs adresses, au fait que 2 adresses distinctes peuvent contenir le même
numéro, où la même rue, où la même ville, ou le même pays (mais pas coincider sur
tout), et, enfin, à l’hypothèse (implicite) que deux auteurs peuvent vivre à la même
adresse.
194
Auteur Oeuvres P as M angas :
NSS
ISBN
scen
col
dessin
où le domaine est le même pour les attributs scen, col et dessin : l’ensemble des booléens
{True, False} (l’auteur est scénariste ou pas, coloriste ou pas, déssinateur ou pas, pour la
bd en question).
Dépendances Fonctionnelles F : {N SS, ISBN → N SS, ISBN, scen, col, dessin}
Clé : {N SS, ISBN }.
Ce schéma de table est en BCNF.
NB : il faut les 2 attributs dans la clé, car un auteur peut avoir réalisé plusieurs oeuvres,
et une oeuvre peut avoir plusieurs auteurs. Et puis, un auteur donné peut être juste
scénariste pour une bande déssinnée, mais scénariste et déssinateur pour une autre, etc.
195
Auteur Oeuvres M angas :
NSS
ISBN
scen
dessin
où le domaine est le même pour les attributs scen, dessin : l’ensemble des booléens
{True, False} (l’auteur est scénariste ou pas, déssinateur ou pas, pour la manga en
question).
Dépendances Fonctionnelles F : {N SS, ISBN → N SS, ISBN, scen, dessin}
Clé : {N SS, ISBN }.
Ce schéma de table est en BCNF.
NB : On a juste enlévé col de la table Auteur Ouvres P as M angas. Mais il faudrait
de quelque façon séparer les ISBN des mangas des ISBN des pas mangas... Passons.
196
Contrats :
NSS
Ident ed
Dépendances Fonctionnelles F : {N SS ⇒ Ident ed} car un auteur est sous contrat
exclusivement avec un éditeur (tandis qu’un éditeur peut avoir plusieurs auteurs sous
contrat).
Clé : {N SS}.
Ce schéma de table est en BCNF.
197
On n’a pas exprimé la contrainte qu’un auteur a forcement au moins une adresse, sauf si
on pose la contrainte (naturelle) :
πN SS (Inf os Auteur) = πN SS (Auteur Adresses)
=
πN SS (πN SS (Auteur Oeuvres P as M angas) ∪ πN SS (Auteur Oeuvres P as M angas))
N.B. Grâce à la table Auteur Oeuvres P as M angas, on peut reperer pour quelle bd
un auteur est seulement scénariste et pour quelle autre est aussi déssinateur, par exemple,
et idem pour Auteur Oeuvres M angas. Et on a exprimé aussi la contrainte que les
mangas n’ont pas de coloriste.
198
On n’exprime pas les “parfois”, non plus :
– On n’a pas exprimé qu’un auteur a parfois une thématique (donc il peut aussi ne pas en
avoir) ;
– On n’a pas exprimé qu’un auteur a parfois un prénom.
Pour pallier ces problème, il faudrait admettre des valeurs nulls. Remarquer que le
modèle relationnel “propre” ne veut pas de valeurs nuls ! Cette limite est vraiment
intrinséque au modèle relationnel.
199
N.B. Si jamais on pose aussi les contraintes :
πIden edit (BD pas M angas) ⊆ πIden edit (Contrats)
et
πIden edit (BD pas M angas) ⊆ πIden edit (Contrats)
on n’exprimera pas non plus la contrainte qu’un éditeur a parfois un contrat avec un
auteur (donc il peut ne pas en avoir).
Problème analogue si on pose :
πN SS (Auteur Oeuvres pas M angas) ⊆ πN SS (Contrats)
et
πN SS (Auteur Oeuvre M angas) ⊆ πN SS (Contrats)
200
Une Modèlisation Objet
Une parmi les modèlisations possibles crée un schéma avec 5 classes : BD, Auteur,
Editeur, Adresse, Mangas, où Mangas est une sous-classe de la classe BD.
NB : pas de correspondance exacte avec les tables relationnelles (mais on aurait pu faire
autrement, et ne pas utiliser de sous-classes, par exemple).
⇒
201
class BD (key ISBN extent les_bd) {
attribute string titre;
attribute integer ISBN;
attribute format struct dimensions{float long, float larg} format;
attribute float prix;
relationship <Auteur> a_scénariste inverse Auteur::scénariste_de;
relationship <Auteur> a_déssinateur inverse Auteur::scénariste_de;
relationship <Auteur> a_coloriste inverse Auteur::coloriste_de;
relationship Editeur a_éditeur inverse Editeur édite}
class Mangas extends BD (extent les_mangas)
attribute enum directions{GD,DG} sense_lecture
202
class Auteur (key NSS extent les_auteurs) {
attribute integer NSS
attribute string nom;
attribute string prénom;
attribute string thématique;
relationship Set<BD> scénariste_de inverse BD::a_scénariste
relationship Set<BD> déssinateur _de inverse BD::a_déssinateur
relationship Set<BD> coloriste_de inverse BD::a_coloriste
relationship Set<Adresse> a_adresse inverse Adresse::adresse_de;
relationship Editeur contrat_avec_ed inverse Editeur contrat_avec_aut}
class Editeur (key Ident\_edit extent les_editeurs) {
attribute integer Ident\_edit
attribute string nom;
relationship Adresse éd_a_adresse inverse Adresse::adresse_de_éd;
relationship Set<Auteur> contrat_avec_aut inverse Auteur contrat_avec_ed;
relationship Set<BD> edite inverse BD a_éditeur}
203
class Adresse (key (num, rue, ville, pays) extent les_addresses) {
attribute integer num;
attribute string rue;
attribute string ville;
attribute string pays;
relationship Set<Editeur> adresse_de_éd inverse Editeur::éd_a_adresse;
relationship Set<Auteur> adresse_de inverse Auteur::a_adresse;
relationship Set<Auteur> contrat_avec_aut inverse Auteur contrat_avec_ed}
204
On n’a pas exprimé :
1. La contrainte qu’un auteur a forcement au moins une adresse (notre déclaration
permet qu’un auteur ait un ensemble vide d’adresses ; pourquoi ?).
2. La contrainte qu’une Manga n’a jamais de coloriste (à cause de la relation de
sous-classe ; mais on aurait pu l’éviter).
N.B. On peut reperer pour quelle bd un auteur est seulement scénariste et pour quelle
autre est aussi déssinateur, par exemple.
205
On n’exprime pas les “parfois”, non plus :
– on n’a pas exprimé qu’un auteur a parfois une thématique (comme pour le relationnel).
– on n’a pas exprimé qu’un auteur a parfois un prénom (comme pour le relationnel).
– on n’a pas exprimé qu’un auteur a parfois un contrat.
Comme pour le relationnel, cette mauvaise gestion des “parfois” est intrinséque :
ODL ne permet pas de faire la différence entre :
- la contrainte qu’un objet o d’une classe C1 est lié à un nombre indeterminé n d’objets
de C2 (n ≥ 0)
- la contrainte qu’un objet o d’une classe C1 est lié à un nombre n d’objets de C2 où
n ∈ {0, 1}.
Pourquoi ?
206
Une modèlisation semi-structurée
Un DTD que l’on peut écrire : ⇒
207
<!ELEMENT (bande_dessinnée)+, auteur+,editeur+>
<!ELEMENT bande_dessinée (manga|pas-manga)>
<!ELEMENT pas_manga (titre,format,prix)>
<!ATTLIST pas_manga ISBN ID #REQUIRED a_scénariste IDREF #REQUIRED
a_déssinateur IDREF #REQUIRED a_coloriste IDREF #IMPLIED
a_editeur IDREF #REQUIRED>
<!ELEMENT manga (titre,format,prix)>
<!ATTLIST ISBN ID #REQUIRED a_scénariste IDREF #REQUIRED
a_déssinateur IDREF #REQUIRED a_editeur IDREF #REQUIRED
sens_lecture (GD|DG)>
<!ELEMENT titre PCDATA>
<!ELEMENT titre CDATA>
<!ELEMENT format (long,larg)>
<!ATTLIST format unité_més CDATA #REQUIRED>
<!ELEMENT prix CDATA>
<!ATTLIST prix dévise CDATA #REQUIRED>
<!ELEMENT long CDATA>
208
<!ELEMENT larg CDATA>
<!ELEMENT auteur (nom,prenom?, (adresse)+,thématique?)>
<!ATTLIST auteur NSS_aut ID #REQUIRED réalise IDREFS #REQUIRED
contrat_avec_ed IDREF #IMPLIED>
<!ELEMENT nom PCDATA>
<!ELEMENT prenom PCDATA>
<!ELEMENT thématique PCDATA>
<!ELEMENT adresse (numéro, rue, ville, pays)>
<!ELEMENT numéro CDATA>
<!ELEMENT rue PCDATA>
<!ELEMENT ville PCDATA>
<!ELEMENT pays PCDATA>
<!ELEMENT editeur (nom,adresse)>
<!ATTLIST editeur NSS_ed ID #REQUIRED édite IDREFS #REQUIRED
contrat_avec_aut IDREFS #IMPLIED>
209
On exprime :
– Les mangas sont des BD ;
– La contrainte qu’un auteur a forcement au moins une adresse (on a le + !)
– La contrainte qu’une Manga n’a jamais de coloriste.
– Pour une bd un auteur est seulement scénariste et pour une autre est aussi déssinateur,
par exemple.
210
On exprime les “parfois” :
– Un auteur a parfois une thématique (fils thématique ? de auteur) ;
– Un auteur a parfois un prénom (prénom ?).
– Un auteur a parfois un contrat (L’attribut contrat avec ed de auteur est
optionnel)
N.B. La possibilité de déclarer balise ? dans le DTD permet d’exprimer qu’une
relation lie un individu x à 0 ou 1 individus, chose qui ni le relationnel ni l’objet
permettent de faire.
211
At-on exprimé la contrainte qu’un cible d’un lien a scénariste doit forcement être
un noeud auteur ? (Même question pour a déssinateur et a coloriste).
Non : on peut écrire un document xml où, pour une bd, a scénariste pointe à une
autre bd, par exemple, et le document sera validé !
En général, dans un DTD on ne peut pas spécifier la balise attendue pour la cible d’un
attribut de type IDREF ou IDREFS !
En XML-schéma non plus, d’ailleurs.
212