13.07.2013 Views

Requêtes OLAP sur une base de données XML native - Cercle ...

Requêtes OLAP sur une base de données XML native - Cercle ...

Requêtes OLAP sur une base de données XML native - Cercle ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Faculté <strong>de</strong>s Sciences<br />

Département d’Informatique<br />

<strong>Requêtes</strong> <strong>OLAP</strong> <strong>sur</strong> <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong><br />

<strong>native</strong><br />

Boris Verhaegen<br />

Mémoire présenté sous la direction du Prof. Esteban Zimányi<br />

en vue <strong>de</strong> l’obtention du gra<strong>de</strong> <strong>de</strong> Licencié en Informatique<br />

Année académique 2005–2006


Remerciements<br />

Je tiens à remercier tout particulièrement Esteban Zimányi, mon promoteur, pour m’avoir<br />

aidé à trouver ce thème intéressant et pour ses nombreux encouragements, impulsions, relectures<br />

et corrections.<br />

Merci également à mes jurés, Gianluca Bontempi et Roel Wuyts ainsi qu’au prési<strong>de</strong>nt du<br />

jury, Raymond Devillers, qui prendront du temps pour lire et évaluer ce document.<br />

Je voulais aussi exprimer ma gratitu<strong>de</strong> envers ma famille et mes amis pour leur confiance et<br />

leur soutien, tout particulièrement envers mon père pour ses relectures et corrections orthographiques<br />

et grammaticales.<br />

Enfin, je tiens à exprimer ma reconnaissance aux développeurs du logiciel libre eXist, Wolfgang<br />

Meier et Pierrick Brihaye, pour leur sympathie et leurs explications.


TABLE DES MATIÈRES iii<br />

Table <strong>de</strong>s matières<br />

Remerciements ii<br />

1 Introduction 1<br />

2 Les entrepôts <strong>de</strong> <strong>données</strong> 3<br />

2.1 Motivations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

2.2 Définitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />

2.3 Le modèle multidimensionnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

2.3.1 Notions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />

2.3.2 Modèles <strong>de</strong> <strong>données</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

2.4 Collecte et intégration <strong>de</strong>s <strong>données</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2.5 Analyse <strong>de</strong>s <strong>données</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2.6 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

3 Les documents <strong>XML</strong> 13<br />

3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />

3.2 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />

3.3 Motivations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

3.4 Le document <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />

3.4.1 Les outils <strong>de</strong> <strong>base</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />

3.4.2 Notions générales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

3.4.3 Types <strong>de</strong> documents <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

3.4.4 Les éléments, ses attributs et les <strong>données</strong> textuelles . . . . . . . . . . . . . 18<br />

3.4.5 L’espace <strong>de</strong> nom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />

3.5 Les DTD et les Schémas <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />

3.6 Modélisation <strong>de</strong>s documents <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . 22


TABLE DES MATIÈRES iv<br />

3.6.1 Ordres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />

3.6.2 SAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

3.6.3 Infoset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />

3.6.4 DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />

3.6.5 Modèle <strong>de</strong> <strong>données</strong> XQuery . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />

3.7 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />

4 Les langages d’interrogation <strong>XML</strong> 27<br />

4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />

4.2 XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />

4.2.1 Les axes XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />

4.3 XQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

4.3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

4.3.2 Expressions FLWR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />

4.3.3 Quantificateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33<br />

4.3.4 Opérateurs <strong>de</strong> comparaison d’ordre . . . . . . . . . . . . . . . . . . . . . . 33<br />

4.3.5 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />

4.3.6 Traitement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />

4.3.7 Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />

4.4 Autres langages d’interrogation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />

4.4.1 XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />

4.4.2 Lorel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

4.4.3 CDuce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

4.4.4 SQL/<strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

4.5 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39


TABLE DES MATIÈRES v<br />

5 Les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> 40<br />

5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />

5.2 Types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . 41<br />

5.2.1 Bases <strong>de</strong> <strong>données</strong> relationnelles . . . . . . . . . . . . . . . . . . . . . . . . 41<br />

5.2.2 Bases <strong>de</strong> <strong>données</strong> objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />

5.2.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s . . . . . . . . . . . . . . . . . . . . . . . . 42<br />

5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />

5.3.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />

5.3.2 Utilisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44<br />

5.3.3 Systèmes existants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44<br />

5.3.4 In<strong>de</strong>xation <strong>de</strong>s documents <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . . 45<br />

5.3.5 Traitement <strong>de</strong>s requêtes grâce aux in<strong>de</strong>xes . . . . . . . . . . . . . . . . . . 55<br />

5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre . . . . . . . . . . . . . . . . . . . . 58<br />

5.4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />

5.4.2 Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />

5.4.3 In<strong>de</strong>xation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60<br />

5.4.4 Traitement <strong>de</strong>s requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />

5.5 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />

6 Les entrepôts <strong>de</strong> <strong>données</strong> <strong>XML</strong> natifs 70<br />

6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />

6.2 Systèmes d’analyse (<strong>OLAP</strong>) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />

6.2.1 Sources et résultats en <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />

6.2.2 Systèmes natifs <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72<br />

6.3 Besoins d’un système <strong>OLAP</strong> basé <strong>sur</strong> <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . 74<br />

6.3.1 Modélisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />

6.3.2 In<strong>de</strong>xation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />

6.3.3 Langage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />

6.4 Le test TPC-H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />

6.4.1 Traduction <strong>de</strong>s <strong>données</strong> sources . . . . . . . . . . . . . . . . . . . . . . . . 77<br />

6.4.2 Traduction <strong>de</strong>s requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78<br />

6.5 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83


TABLE DES MATIÈRES vi<br />

7 Les groupements en XQuery 84<br />

7.1 Base <strong>de</strong> <strong>données</strong> source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84<br />

7.2 <strong>Requêtes</strong> d’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86<br />

7.2.1 Opérateur GROUP BY en SQL . . . . . . . . . . . . . . . . . . . . . . . . . 86<br />

7.3 Groupements en XQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88<br />

7.4 Scénario d’évaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91<br />

7.4.1 Métho<strong>de</strong>s d’évaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92<br />

7.4.2 Génération <strong>de</strong> l’échantillon . . . . . . . . . . . . . . . . . . . . . . . . . . 93<br />

7.4.3 Conditions du test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />

7.4.4 Me<strong>sur</strong>es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />

7.4.5 Paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95<br />

7.4.6 <strong>Requêtes</strong> effectuées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95<br />

7.5 Analyse <strong>de</strong>s résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96<br />

7.6 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97<br />

8 Conclusions et travaux futurs 100<br />

8.1 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100<br />

8.2 Travaux Futurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101


Chapitre 1<br />

Introduction<br />

Le but <strong>de</strong> ce mémoire est d’analyser la possibilité <strong>de</strong> créer <strong>de</strong>s outils d’analyse (<strong>OLAP</strong>) <strong>sur</strong><br />

un entrepôt <strong>de</strong> <strong>données</strong>, le tout entièrement en <strong>XML</strong>.<br />

Cela sous-entend plusieurs parties. Tout d’abord, nous étudierons les différentes techniques<br />

<strong>de</strong> gestion <strong>de</strong>s <strong>données</strong> <strong>XML</strong> via <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong>. Ensuite, nous analyserons les rares articles<br />

scientifiques publiés au sujet <strong>de</strong>s entrepôts <strong>de</strong> <strong>données</strong> et <strong>de</strong>s systèmes d’analyse <strong>XML</strong>. Pour finir,<br />

nous i<strong>de</strong>ntifierons les besoins d’un tel système et nous émettrons quelques propositions afin d’y<br />

répondre.<br />

Le second chapitre traite <strong>de</strong>s entrepôts <strong>de</strong> <strong>données</strong>. Nous analyserons les notions nécessaires<br />

à leur compréhension comme la modélisation multidimensionnelle. Nous étudierons ensuite les<br />

systèmes gravitant autour <strong>de</strong> l’entrepôt <strong>de</strong> <strong>données</strong>, c’est-à-dire les outils d’intégration <strong>de</strong> <strong>données</strong><br />

(ETL) ainsi que les outils d’analyse (<strong>OLAP</strong> et forage <strong>de</strong> <strong>données</strong>).<br />

Dans le troisième chapitre, nous introduirons le langage <strong>de</strong> balisage extensible <strong>XML</strong>. Nous<br />

commencerons par un historique expliquant son évolution et ensuite, nous expliquerons les notions<br />

essentielles <strong>de</strong> ce langage, nécessaires à la compréhension <strong>de</strong> ce mémoire, comme les différentes<br />

modèles <strong>de</strong> <strong>données</strong> <strong>XML</strong>.<br />

Ensuite, dans le quatrième chapitre, nous analyserons en détail les différents langages d’interrogation<br />

pour <strong>XML</strong> en nous focalisant <strong>sur</strong> XPath et XQuery, <strong>de</strong>ux langages très prometteurs<br />

dans le domaine <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong>.<br />

Le cinquième chapitre consiste en <strong>une</strong> analyse <strong>de</strong>s différents types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong><br />

permettant <strong>de</strong> gérer <strong>de</strong>s documents <strong>XML</strong>. Nous nous attar<strong>de</strong>rons principalement <strong>sur</strong> les <strong>base</strong>s<br />

<strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s en accordant <strong>une</strong> gran<strong>de</strong> importance aux techniques d’in<strong>de</strong>xation <strong>de</strong>s<br />

documents <strong>XML</strong> ainsi qu’aux algorithmes associés. Pour finir, nous introduirons eXist, un moteur<br />

<strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> natif libre implémentant XQuery, que nous utiliserons par la suite dans<br />

ce mémoire.<br />

Dans le sixième chapitre, nous i<strong>de</strong>ntifierons les besoins d’un entrepôt <strong>de</strong> <strong>données</strong> <strong>XML</strong> natif<br />

et tout particulièrement ceux d’un système d’analyse organisé <strong>sur</strong> <strong>une</strong> <strong>base</strong> <strong>de</strong> donnée <strong>XML</strong><br />

<strong>native</strong>. Nous les étudierons selon les points <strong>de</strong> vue modélisation, in<strong>de</strong>xation et langage, en nous<br />

concentrant <strong>sur</strong> ce <strong>de</strong>rnier.<br />

1


Le septième et <strong>de</strong>rnier chapitre est dédié aux groupements <strong>de</strong> <strong>données</strong> <strong>XML</strong> à l’ai<strong>de</strong> <strong>de</strong><br />

XQuery. Nous y découvrirons que ce langage ne possè<strong>de</strong> pas d’opérateur <strong>de</strong> groupement par<br />

valeur et nous analyserons le gain qu’un tel opérateur permettrait d’obtenir via <strong>une</strong> évaluation<br />

<strong>de</strong> performances.<br />

2


Chapitre 2<br />

Les entrepôts <strong>de</strong> <strong>données</strong><br />

Dans ce chapitre, nous présentons les entrepôts <strong>de</strong> <strong>données</strong> et les concepts nécessaires à leur<br />

compréhension. Nous détaillons également les différents outils nécessaires à la construction et à<br />

l’utilisation <strong>de</strong> ce type particulier <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong>.<br />

Contenu<br />

2.1 Motivations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

2.2 Définitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />

2.3 Le modèle multidimensionnel . . . . . . . . . . . . . . . . . . . . . . . 5<br />

2.4 Collecte et intégration <strong>de</strong>s <strong>données</strong> . . . . . . . . . . . . . . . . . . . . 10<br />

2.5 Analyse <strong>de</strong>s <strong>données</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2.6 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

2.1 Motivations<br />

Les entreprises, <strong>de</strong> par leur taille importante et leur ancienneté ont <strong>de</strong> plus en plus <strong>de</strong><br />

difficultés à accé<strong>de</strong>r à l’ensemble <strong>de</strong> leurs <strong>données</strong>, à regrouper leurs différentes <strong>base</strong>s <strong>de</strong> <strong>données</strong><br />

disséminées dans leurs différents services afin <strong>de</strong> les analyser et <strong>de</strong> prendre <strong>de</strong>s décisions rapi<strong>de</strong>ment.<br />

Dans la gran<strong>de</strong> distribution, par exemple, on aimerait déterminer les produits à succès, les<br />

mo<strong>de</strong>s, les habitu<strong>de</strong>s d’achat <strong>de</strong>s consommateurs globalement ou par secteur géographique. Dans<br />

le domaine <strong>de</strong>s services tels que les banques, les entreprises <strong>de</strong> télécommunication, les as<strong>sur</strong>ances<br />

et mutualités, on aimerait pouvoir classifier les clients, détecter <strong>de</strong>s frau<strong>de</strong>s ou les clients qui<br />

risquent d’être infidèles, etc.<br />

Pour réaliser ces analyses facilement et rapi<strong>de</strong>ment, il convient <strong>de</strong> rassembler toutes les informations<br />

<strong>de</strong> l’entreprise dans <strong>une</strong> <strong>base</strong> unique, spécialement conçue pour l’analyse : un entrepôt<br />

<strong>de</strong> <strong>données</strong> (data warehouse). Celui-ci doit par exemple permettre aux déci<strong>de</strong>urs <strong>de</strong> visualiser <strong>de</strong>s<br />

<strong>données</strong> agrégées suivant différents critères : axes temporels, géographiques, types <strong>de</strong> produits,<br />

. . .<br />

3


2.2 Définitions 4<br />

2.2 Définitions<br />

Un entrepôt <strong>de</strong> <strong>données</strong> (data warehouse) est un lieu <strong>de</strong> stockage intermédiaire <strong>de</strong> différentes<br />

<strong>données</strong> en vue <strong>de</strong> la constitution d’un système d’informations décisionnelles. Un <strong>de</strong>s précurseurs<br />

du concept d’entrepôt <strong>de</strong> <strong>données</strong>, Bill Inmon [1], le définit comme suit :<br />

« Un entrepôt est <strong>une</strong> collection <strong>de</strong> <strong>données</strong> orientées sujet, intégrées, non volatiles<br />

et historisées, organisées pour le support d’un processus d’ai<strong>de</strong> à la décision. »<br />

Analysons point par point cette définition. Les <strong>données</strong> d’un entrepôt sont donc :<br />

⊲ Orientées sujet Les <strong>données</strong> sont orientées métier et donc triées par thèmes. L’intégration<br />

dans <strong>une</strong> structure unique est indispensable pour éviter aux <strong>données</strong> concernées par<br />

plusieurs sujets d’être dupliquées. Cependant, dans la pratique, il existe également <strong>de</strong>s<br />

entrepôts plus petits, les magasins <strong>de</strong> <strong>données</strong> (data marts) : l’entrepôt est fragmenté en<br />

plusieurs <strong>base</strong>s qui supportent l’orientation sujet.<br />

⊲ Intégrées Les <strong>données</strong> proviennent <strong>de</strong> plusieurs sources hétérogènes. Avant d’être intégrées<br />

dans l’entrepôt, les <strong>données</strong> doivent êtres mises en forme et unifiées afin d’avoir un<br />

état cohérent. Cela nécessite un gros travail <strong>de</strong> normalisation, <strong>de</strong> gestion <strong>de</strong>s référentiels<br />

et <strong>de</strong> cohérence.<br />

⊲ Non volatiles Les <strong>données</strong> sont stables et non modifiables. Un entrepôt <strong>de</strong> <strong>données</strong> doit<br />

garantir qu’<strong>une</strong> requête lancée à différentes dates <strong>sur</strong> les mêmes <strong>données</strong> donne toujours<br />

les mêmes résultats. De plus, les <strong>données</strong> d’un entrepôt sont mise à jour périodiquement,<br />

ce ne sont donc pas <strong>de</strong>s informations en temps réel.<br />

⊲ Historisées Les <strong>données</strong> sont historisées et donc datées : l’historisation est nécessaire<br />

pour suivre dans le temps l’évolution <strong>de</strong>s différentes valeurs <strong>de</strong>s indicateurs à analyser.<br />

Ainsi, un référentiel temps doit être associé aux <strong>données</strong> afin <strong>de</strong> permettre l’i<strong>de</strong>ntification<br />

<strong>de</strong> valeurs précises dans la durée.<br />

Un entrepôt est donc <strong>une</strong> sorte <strong>de</strong> point focal stockant en un point unique toute l’information<br />

utile provenant <strong>de</strong>s systèmes <strong>de</strong> production et <strong>de</strong>s sources externes. Avant d’être intégrée,<br />

l’information doit être extraite <strong>de</strong>s différentes sources et nettoyée.<br />

Ralph Kimball, l’auteur <strong>de</strong> The Data Warehouse Toolkit [2], propose <strong>une</strong> autre définition :<br />

« A data warehouse is a copy of transaction data specifically structured for query<br />

and analysis. »<br />

« Un entrepôt <strong>de</strong> <strong>données</strong> est <strong>une</strong> copie <strong>de</strong> <strong>données</strong> transactionnelles spécifiquement<br />

structurée pour l’interrogation et l’analyse. »<br />

Un entrepôt <strong>de</strong> <strong>données</strong>, comme indiqué dans les motivations, doit permettre l’analyse <strong>de</strong><br />

<strong>données</strong> suivant plusieurs dimensions. Il convient donc d’utiliser un modèle multidimensionnel.<br />

Avant <strong>de</strong> pouvoir intégrer les <strong>données</strong>, il faut concevoir intelligemment l’entrepôt en fonction<br />

<strong>de</strong>s analyses que l’on veut pouvoir réaliser.<br />

Trois fonctions essentielles sont donc nécessaires pour créer et utiliser un entrepôt :


2.3 Le modèle multidimensionnel 5<br />

Sources<br />

Bases <strong>de</strong><br />

<strong>données</strong><br />

diverses<br />

Fichiers<br />

Internet<br />

Extraction,<br />

Transformation,<br />

Chargement<br />

(ETL)<br />

Analyse <strong>de</strong><br />

<strong>données</strong><br />

(<strong>OLAP</strong>)<br />

Entrepôt <strong>de</strong> <strong>données</strong><br />

Fig. 2.1 – Architecture d’un entrepôt <strong>de</strong> <strong>données</strong>.<br />

Forage <strong>de</strong><br />

<strong>données</strong><br />

(data mining)<br />

⊲ la collecte <strong>de</strong> <strong>données</strong> <strong>de</strong>s différentes sources d’informations et leur intégration<br />

⊲ l’organisation <strong>de</strong>s <strong>données</strong> dans l’entrepôt<br />

⊲ l’analyse <strong>de</strong> <strong>données</strong> pour la prise <strong>de</strong> décision en interaction avec les analyses.<br />

Une vision schématique <strong>de</strong> l’architecture nécessaire à un entrepôt <strong>de</strong> <strong>données</strong> est illustrée à<br />

la figure 2.1. Les chapitres suivants introduisent ces concepts.<br />

2.3 Le modèle multidimensionnel<br />

Comme nous l’avons vu en début <strong>de</strong> chapitre, un entrepôt <strong>de</strong> <strong>données</strong> est orienté sujet<br />

et doit permettre d’analyser <strong>de</strong>s <strong>données</strong> suivant plusieurs dimensions. Les <strong>base</strong>s <strong>de</strong> <strong>données</strong><br />

multidimensionnelles, à la différence <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles classiques permettent<br />

d’effectuer <strong>de</strong>s traitements <strong>sur</strong> <strong>de</strong>s <strong>données</strong> en prenant en compte plus <strong>de</strong> <strong>de</strong>ux axes : les <strong>données</strong><br />

ne sont pas modélisées sous forme tabulaire mais sous forme d’hyper-cubes (ou « cubes <strong>de</strong><br />

<strong>données</strong> » ou encore « data cubes »).<br />

Ces structures sont essentiellement utilisées par <strong>de</strong>s analystes qui cherchent à trouver <strong>de</strong>s<br />

tendances dans <strong>de</strong> gran<strong>de</strong>s quantités <strong>de</strong> <strong>données</strong>. Par exemple, rechercher les facteurs <strong>de</strong> risques<br />

(âge, sexe, traitement, . . . ) <strong>de</strong> maladies pour <strong>une</strong> étu<strong>de</strong> médicale, caractériser <strong>de</strong>s <strong>données</strong> (type<br />

d’objet, siècle, . . . ) dans le cadre <strong>de</strong> fouilles archéologiques ou déterminer <strong>de</strong>s corrélations entre<br />

produits-magasin-ven<strong>de</strong>ur pour le directeur <strong>de</strong> ressources humaines <strong>de</strong> chaînes <strong>de</strong> distribution.


2.3 Le modèle multidimensionnel 6<br />

2.3.1 Notions<br />

Un sujet est défini par un ensemble <strong>de</strong> me<strong>sur</strong>es et un ensemble <strong>de</strong> dimensions. Par exemple,<br />

les me<strong>sur</strong>es d’<strong>une</strong> vente peuvent être son numéro, son prix et sa quantité : ce sont les valeurs<br />

numériques que l’on veut comparer. Les dimensions seraient la date, le type <strong>de</strong> produit et la<br />

région : ce sont les points <strong>de</strong> vue <strong>de</strong>puis lesquels les me<strong>sur</strong>es peuvent être observées.<br />

Une dimension est <strong>une</strong> liste d’éléments organisés <strong>de</strong> façon hiérarchique. La granularité d’<strong>une</strong><br />

dimension est son nombre <strong>de</strong> niveaux hiérarchiques. Par exemple, pour le temps, nous pourrions<br />

avoir la hiérarchie suivante : année, semestre, trimestre, mois, semaine, jour, soit six niveaux.<br />

Les axes <strong>de</strong> dimensions doivent fournir <strong>de</strong>s règles <strong>de</strong> calculs d’agrégat pour chaque me<strong>sur</strong>e.<br />

Par exemple, le nombre <strong>de</strong> ventes du premier trimestre est la somme du nombre <strong>de</strong> ventes<br />

<strong>de</strong> janvier, février et mars. Les dimensions sont stockées dans <strong>de</strong>s tables <strong>de</strong> dimensions qui<br />

contiennent les niveaux hiérarchiques <strong>de</strong>s dimensions ainsi que les formules à appliquer <strong>sur</strong> les<br />

<strong>données</strong> numériques (les faits) pour passer d’un niveau à un autre. Certains cas spéciaux sont<br />

à gérer si les dimensions sont organisées en hiérarchies multiples : les magasins d’<strong>une</strong> entreprise<br />

peuvent être organisées par ville, par province, par secteur ou par région <strong>de</strong> vente. Une région<br />

<strong>de</strong> vente peut regrouper certaines villes <strong>de</strong> provinces différentes. Elzbieta Malinowski et Esteban<br />

Zimányi ont fait <strong>une</strong> étu<strong>de</strong> complète <strong>de</strong>s différents types <strong>de</strong> hiérarchies <strong>de</strong> dimensions dans [3].<br />

Un fait représente la valeur d’<strong>une</strong> me<strong>sur</strong>e, me<strong>sur</strong>ée ou calculée, selon un membre <strong>de</strong> chac<strong>une</strong><br />

<strong>de</strong>s dimensions. Par exemple, « 10000 » est un fait qui exprime la valeur <strong>de</strong> la me<strong>sur</strong>e « coût<br />

<strong>de</strong>s travaux » pour le membre « 2002 » du niveau « année » <strong>de</strong> la dimension « temps » et<br />

le membre « Bruxelles » du niveau « ville » <strong>de</strong> la dimension « géographie ». Les me<strong>sur</strong>es sont<br />

stockées dans <strong>de</strong>s tables <strong>de</strong> faits qui contiennent les valeurs <strong>de</strong>s me<strong>sur</strong>es et les clés vers les tables<br />

<strong>de</strong> dimensions.<br />

Dimension Temps<br />

PK jour<br />

semaine<br />

mois<br />

trimestre<br />

année<br />

Dimension Produit<br />

PK id_produit<br />

nom_produit<br />

id_categorie<br />

nom_categorie<br />

id_famille<br />

nom_famille<br />

Fait Vente<br />

PK id_vente<br />

nombre<br />

montant<br />

FK1 id_produit<br />

FK2 jour<br />

FK3 id_ven<strong>de</strong>ur<br />

FK4 id_magasin<br />

Dimensions Ven<strong>de</strong>urs<br />

PK id_ven<strong>de</strong>ur<br />

nom_ven<strong>de</strong>ur<br />

groupe<br />

<strong>de</strong>partement<br />

Dimension Géographie<br />

PK id_magasin<br />

nom_magasin<br />

comm<strong>une</strong><br />

region<br />

pays<br />

Fig. 2.2 – Modélisation d’un entrepôt à l’ai<strong>de</strong> d’un schéma en étoile.<br />

A titre d’illustration, observons le schéma relationnel <strong>de</strong> la figure 2.2. La table placée au centre<br />

représente les faits et leurs me<strong>sur</strong>es respectives : nombre et montant. Les quatre tables gravitant


2.3 Le modèle multidimensionnel 7<br />

autour <strong>de</strong> la table <strong>de</strong>s faits représentent les dimensions : temps, géographie, produit et ven<strong>de</strong>ur.<br />

Chaque table <strong>de</strong> dimension contient les différents niveaux <strong>de</strong> la hiérarchie <strong>de</strong> dimension. Pour la<br />

dimension géographique, représentée figure 2.3, nous avons 4 niveaux <strong>de</strong> granularité : le magasin,<br />

sa comm<strong>une</strong>, sa région et son pays. Il s’agit ici d’<strong>une</strong> hiérarchie <strong>de</strong> dimension symétrique, c’est<br />

à dire qu’un magasin n’est inclus dans <strong>une</strong> seule comm<strong>une</strong>, <strong>une</strong> comm<strong>une</strong> dans <strong>une</strong> seule région<br />

et ainsi <strong>de</strong> suite.<br />

Géographie Magasins Comm<strong>une</strong>s Régions Pays<br />

Fig. 2.3 – Hiérarchie symétrique d’<strong>une</strong> dimension géographique.<br />

Ces différents mécanismes nous permettront <strong>de</strong> placer les <strong>données</strong> dans <strong>de</strong>s matrices multidimensionnelles<br />

appelées cubes. Un exemple d’un tel cube est présenté à la figure 2.4 Ces cubes<br />

sont parfois appelés hyper-cubes s’il y a plus <strong>de</strong> 3 dimensions. Les <strong>données</strong> pourront être interrogées<br />

directement et facilement <strong>sur</strong> n’importe quelle combinaison <strong>de</strong> dimensions, sans utiliser <strong>de</strong><br />

requêtes trop complexes. Passer d’<strong>une</strong> hiérarchie <strong>de</strong> dimension à <strong>une</strong> autre est réalisée facilement<br />

dans un cube <strong>de</strong> <strong>données</strong> par la technique <strong>de</strong> pivot, <strong>de</strong> rotation. Par cette technique, le cube peut<br />

être pivoté pour afficher différentes orientations <strong>de</strong>s axes. Par exemple, on peut pivoter un cube<br />

pour afficher les régions en lignes, les trimestres en colonnes et les produits dans la troisième<br />

dimension. Cette technique est équivalente à avoir <strong>une</strong> table <strong>de</strong> vente par région pour chaque<br />

produit, où chaque table affiche les ventes par trimestre et par région du produit.<br />

clavier<br />

2003<br />

2004<br />

2005<br />

souris<br />

écran<br />

120 230 210<br />

132 198 256<br />

145 259 237<br />

Bruxelles Wallonie Flandre<br />

78 176 142<br />

137 258 232<br />

Régions<br />

276 187<br />

245 196<br />

Produits<br />

Fig. 2.4 – Représentation d’un cube <strong>de</strong> <strong>données</strong>.<br />

Les opérations slice et dice permettent respectivement d’extraire <strong>une</strong> tranche du cube et un<br />

sous-cube selon <strong>de</strong>s prédicats <strong>sur</strong> les dimensions. Ces opérations sont illustrées respectivement<br />

aux figures 2.5 et 2.6.<br />

Années


2.3 Le modèle multidimensionnel 8<br />

clavier<br />

2003<br />

2004<br />

2005<br />

2003<br />

2004<br />

2005<br />

souris<br />

écran<br />

120 230 210<br />

132 198 256<br />

145 259 237<br />

Bruxelles Wallonie Flandre<br />

78 176 142<br />

137 258 232<br />

276 187<br />

(Slice)<br />

245 196 Coupe <strong>sur</strong> 2005<br />

écran<br />

souris<br />

clavier<br />

Bruxelles Wallonie Flandre<br />

60 125 196<br />

157 287 245<br />

145 259 237<br />

Fig. 2.5 – Opération slice, extraction d’<strong>une</strong> tranche d’un cube.<br />

clavier<br />

souris<br />

écran<br />

120 230 210<br />

132 198 256<br />

145 259 237<br />

Bruxelles Wallonie Flandre<br />

78 176 142<br />

137 258 232<br />

276 187<br />

245 196<br />

Extraction d’un<br />

sous-cube<br />

(Dice)<br />

clavier<br />

souris<br />

2004 132 198<br />

2005<br />

145 259<br />

Fig. 2.6 – Opération dice, extraction d’un sous-cube.<br />

Bruxelles Wallonie<br />

Deux autres opérations importantes sont possibles <strong>sur</strong> les <strong>base</strong>s <strong>de</strong> <strong>données</strong> multidimensionnelles<br />

: roll-up et drill-down. Nous n’avons pas trouvé <strong>de</strong> traduction concise pour ces termes,<br />

nous les utiliserons donc en anglais par la suite. Ces <strong>de</strong>ux opérations permettent <strong>de</strong> naviguer<br />

dans les <strong>données</strong> en suivant les hiérarchies <strong>de</strong> dimensions. La première, roll-up, permet d’agréger<br />

les <strong>données</strong> suivant <strong>une</strong> dimension. La <strong>de</strong>uxième, drill-down, permet <strong>de</strong> faire le contraire, c’est à<br />

dire <strong>de</strong> détailler les <strong>données</strong>. Par exemple, un roll-up <strong>sur</strong> la dimension temporelle nous permet<br />

<strong>de</strong> passer d’<strong>une</strong> vue par trimestre à <strong>une</strong> vue par année. Un drill-down <strong>de</strong> passer d’<strong>une</strong> vue par<br />

année à <strong>une</strong> vue par trimestre.<br />

2.3.2 Modèles <strong>de</strong> <strong>données</strong><br />

Modèle en étoile<br />

La modélisation dimensionnelle agence les <strong>données</strong> d’<strong>une</strong> façon très différente <strong>de</strong> la structure<br />

en 3FN (3 e forme normale) fréquemment utilisée par les modélisateurs <strong>de</strong>s systèmes OLTP. La<br />

modélisation dimensionnelle produit ce qu’on appelle le modèle dimensionnel ou, communément,<br />

le schéma en étoile (star schema). Un tel schéma est présenté à la figure 2.2. C’est la structure <strong>de</strong><br />

<strong>données</strong> la plus utilisée et la plus appropriée aux requêtes et analyses <strong>de</strong>s utilisateurs d’entrepôts<br />

<strong>de</strong> <strong>données</strong>. Elle est simple à créer, stable et intuitivement compréhensible par les utilisateurs<br />

finaux. Le modèle dimensionnel est la fondation même <strong>de</strong> la construction <strong>de</strong>s cubes <strong>OLAP</strong>. Il<br />

142<br />

145<br />

176


2.3 Le modèle multidimensionnel 9<br />

consiste en <strong>une</strong> gran<strong>de</strong> table <strong>de</strong> faits et un cercle d’autres tables qui contiennent les éléments<br />

<strong>de</strong>scriptifs du fait, les dimensions. Quand il est illustré, le modèle ressemble à <strong>une</strong> étoile, d’où<br />

sa dénomination « En étoile ».<br />

On peut citer, comme avantages, la facilité <strong>de</strong> lecture et la faible complexité <strong>de</strong>s requêtes.<br />

En effet, peu <strong>de</strong> jointures sont nécessaires car le nombre <strong>de</strong> tables reste faible. Par contre, il<br />

y a <strong>de</strong> la redondance dans les tables <strong>de</strong> dimensions, ce qui entraîne un stockage lourd et <strong>une</strong><br />

alimentation complexe <strong>de</strong> la <strong>base</strong> <strong>de</strong> <strong>données</strong>.<br />

Modèle en flocons <strong>de</strong> neige<br />

Dimension Produit<br />

PK id_produit<br />

nom_produit<br />

FK1 id_categorie<br />

Catégories<br />

PK id_categorie<br />

nom_catégorie<br />

FK1 id_famille<br />

Familles<br />

PK id_famille<br />

nom_famille<br />

Trimestres<br />

PK trimestre<br />

FK1 année<br />

Mois<br />

PK mois<br />

FK1 année<br />

FK2 trimestre<br />

Fait Vente<br />

PK id_vente<br />

nombre<br />

montant<br />

FK1 id_produit<br />

FK2 jour<br />

FK3 id_ven<strong>de</strong>ur<br />

FK4 id_magasin<br />

Dimension Géographie<br />

PK id_magasin<br />

nom_magasin<br />

FK1 id_comm<strong>une</strong><br />

Régions<br />

PK id_region<br />

nom_region<br />

FK1 id_pays<br />

Années<br />

PK année<br />

Dimension Temps<br />

PK jour<br />

FK1 mois<br />

FK2 semaine<br />

Dimensions Ven<strong>de</strong>urs<br />

PK id_ven<strong>de</strong>ur<br />

nom_ven<strong>de</strong>ur<br />

FK1 id_groupe<br />

Comm<strong>une</strong>s<br />

PK id_comm<strong>une</strong><br />

nom_comm<strong>une</strong><br />

FK1 id_region<br />

Pays<br />

PK id_pays<br />

nom_pays<br />

Semaines<br />

PK semaine<br />

FK1 année<br />

Départements<br />

PK id_<strong>de</strong>partement<br />

nom_<strong>de</strong>partement<br />

Groupes<br />

PK id_groupe<br />

nom_groupe<br />

FK1 id_<strong>de</strong>partement<br />

Fig. 2.7 – Modélisation d’un entrepôt à l’ai<strong>de</strong> d’un schéma en flocons.<br />

Le schéma en flocons <strong>de</strong> neige (snowflake schema) est <strong>une</strong> variante du schéma en étoile.<br />

Un exemple est présenté à la figure 2.7. Dans la théorie, la différence rési<strong>de</strong> dans la simple<br />

normalisation <strong>de</strong>s tables <strong>de</strong> dimensions en 3FN. Il est donc tout simplement question <strong>de</strong> mettre<br />

les attributs <strong>de</strong> chaque niveau hiérarchique dans <strong>une</strong> table <strong>de</strong> dimension distincte pour éviter la<br />

redondance. Bien que ce modèle permet <strong>de</strong> gagner <strong>de</strong> l’espace disque et facilite l’alimentation,


2.4 Collecte et intégration <strong>de</strong>s <strong>données</strong> 10<br />

il implique <strong>de</strong> nombreuses jointures dans les requêtes et donc <strong>une</strong> difficulté d’écriture <strong>de</strong> ces<br />

<strong>de</strong>rnières.<br />

Quand il s’agit <strong>de</strong> choisir <strong>une</strong> modélisation plutôt qu’<strong>une</strong> autre, <strong>de</strong> nombreux paramètres<br />

sont à prendre en compte : la nature <strong>de</strong>s requêtes, les besoins d’analyse, les besoins <strong>de</strong> flexibilité,<br />

l’évolution <strong>de</strong>s dimensions dans le temps, etc. Ce n’est donc jamais <strong>une</strong> question simple et il<br />

convient <strong>de</strong> l’étudier avec le plus grand soin. En effet, <strong>une</strong> mauvaise modélisation peut conduire<br />

à l’inutilité d’un entrepôt avec les pertes <strong>de</strong> temps et d’argent que cela implique.<br />

2.4 Collecte et intégration <strong>de</strong>s <strong>données</strong><br />

L’intégration <strong>de</strong>s <strong>données</strong> est certainement la partie la plus complexe, justifiant ainsi la timidité<br />

<strong>de</strong>s entreprises à fabriquer un tel entrepôt <strong>de</strong> <strong>données</strong>. Il convient d’uniformiser et <strong>de</strong> fédérer<br />

les différentes sources d’informations <strong>de</strong> l’entreprise. Bien souvent, les entreprises possè<strong>de</strong>nt <strong>une</strong><br />

multitu<strong>de</strong> <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>de</strong> structures différentes : <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles, fichiers,<br />

sources Web, . . . Il faut donc définir un schéma global qui intègre les <strong>données</strong> utiles à l’analyse,<br />

d’où <strong>une</strong> gestion stricte <strong>de</strong>s méta-<strong>données</strong> telles que la <strong>de</strong>scription <strong>de</strong>s sources ou <strong>de</strong>s éventuelles<br />

vues exportées <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong>.<br />

Ces opérations sont connues sous le terme ETL (Extract-Transform-Load) ou data pumping.<br />

Il s’agit d’un système intergiciel (middleware) qui permet <strong>de</strong> faire <strong>de</strong>s synchronisations d’informations<br />

d’<strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> vers <strong>une</strong> autre. Ces systèmes sont basés <strong>sur</strong> <strong>de</strong>s connecteurs<br />

servant à exporter et importer <strong>de</strong>s <strong>données</strong>, <strong>de</strong>s transformateurs pour manipuler les <strong>données</strong> et<br />

les convertir dans le schéma <strong>de</strong> la <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>de</strong> <strong>de</strong>stination. Le but est l’intégration <strong>de</strong>s<br />

<strong>données</strong> <strong>de</strong> toute l’entreprise dans <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> comm<strong>une</strong>, l’entrepôt <strong>de</strong> <strong>données</strong>.<br />

Il s’agit ici d’un processus très complexe et très coûteux : Ralph Kimball [4], après 18 mois<br />

d’étu<strong>de</strong>s <strong>sur</strong> les ETL, en a défini 38 sous-systèmes et a évalué à 70% la part <strong>de</strong> l’intégration dans<br />

un projet d’entrepôt <strong>de</strong> <strong>données</strong>.<br />

2.5 Analyse <strong>de</strong>s <strong>données</strong><br />

Il faut différencier <strong>de</strong>ux types d’analyses <strong>de</strong> <strong>données</strong> : le Data Mining ou forage <strong>de</strong> <strong>données</strong><br />

et l’analyse multidimensionnelle (<strong>OLAP</strong>). Dans ce mémoire, nous nous concentrerons principalement<br />

<strong>sur</strong> l’analyse multidimensionnelle.<br />

Le forage <strong>de</strong> <strong>données</strong> (Data Mining) a pour but <strong>de</strong> mettre en évi<strong>de</strong>nce <strong>de</strong>s corrélations<br />

éventuelles dans un volume important <strong>de</strong> <strong>données</strong> afin <strong>de</strong> dégager <strong>de</strong>s tendances. Il s’appuie <strong>sur</strong><br />

<strong>de</strong>s techniques d’intelligence artificielle comme <strong>de</strong>s réseaux <strong>de</strong> neurones ou <strong>sur</strong> <strong>de</strong>s techniques<br />

statistiques afin <strong>de</strong> mettre en évi<strong>de</strong>nce <strong>de</strong>s liens cachés entre les <strong>données</strong> et ainsi prévoir <strong>de</strong>s<br />

tendances.<br />

Online Analytical Processing (<strong>OLAP</strong>) est un terme commercial qui désigne les <strong>base</strong>s <strong>de</strong><br />

<strong>données</strong> multidimensionnelles (aussi appelées cubes ou hyper-cubes) <strong>de</strong>stinées à l’analyse et il<br />

s’oppose au terme OLTP qui désigne les systèmes transactionnels. Ce terme a été défini par E.


2.5 Analyse <strong>de</strong>s <strong>données</strong> 11<br />

F. Codd [5] il y a plus <strong>de</strong> 10 ans au travers <strong>de</strong> 12 règles que doit respecter <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong><br />

si elle veut adhérer au concept <strong>OLAP</strong>. Les 12 règles <strong>de</strong> Codd sont :<br />

⊲ Vue conceptuelle multidimensionnelle<br />

⊲ Transparence<br />

⊲ Accessibilité<br />

⊲ Constance <strong>de</strong>s temps <strong>de</strong> réponses<br />

⊲ Architecture Client/Serveur<br />

⊲ Indépendance <strong>de</strong>s dimensions<br />

⊲ Gestion <strong>de</strong>s matrices creuses<br />

⊲ Accès multi-utilisateurs<br />

⊲ Pas <strong>de</strong> restrictions <strong>sur</strong> les opérations inter et intra dimensions<br />

⊲ Manipulation <strong>de</strong>s <strong>données</strong> aisée<br />

⊲ Simplicité <strong>de</strong>s rapports<br />

⊲ Nombre illimité <strong>de</strong> dimensions et nombre illimité d’éléments <strong>sur</strong> les dimensions<br />

Codd a défini ces règles <strong>sur</strong> <strong>de</strong>man<strong>de</strong> <strong>de</strong> la compagnie Arbor Software, <strong>de</strong>venue aujourd’hui<br />

Hyperion, un grand nom dans les entrepôts <strong>de</strong> <strong>données</strong>. C’est pourquoi ces règles sont controversées<br />

<strong>de</strong> par leur origine commerciale. De plus, ce terme ne donne ni <strong>une</strong> définition ni <strong>une</strong><br />

<strong>de</strong>scription claire <strong>de</strong> ce que signifie <strong>OLAP</strong>. Il ne donne non plus auc<strong>une</strong> indication <strong>de</strong>s motifs<br />

d’utilisation d’outils <strong>OLAP</strong>, ni <strong>de</strong> leurs particularités. Nigel Pendse [6] a redéfini le terme <strong>OLAP</strong><br />

comme un « système d’analyse rapi<strong>de</strong> d’informations multidimensionnelles partagées » (FASMI,<br />

Fast Analysis of Shared Multidimensional Information), ce qui nous paraît être <strong>une</strong> définition<br />

plus appropriée.<br />

Ce concept est appliqué à un modèle virtuel <strong>de</strong> représentation <strong>de</strong> <strong>données</strong> appelé cube ou<br />

hyper-cube <strong>OLAP</strong>. Il existe ensuite plusieurs déclinaisons qui permettent d’adapter le stockage<br />

<strong>de</strong>s <strong>données</strong> <strong>sur</strong> différents types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> pour implémenter le concept <strong>OLAP</strong> :<br />

⊲ R-<strong>OLAP</strong> : outils <strong>OLAP</strong> <strong>sur</strong> <strong>de</strong>s <strong>base</strong>s relationnelles<br />

⊲ M-<strong>OLAP</strong> : outils <strong>OLAP</strong> implémentés à l’ai<strong>de</strong> <strong>de</strong> structures multidimensionnelles<br />

⊲ H-<strong>OLAP</strong> : outils <strong>OLAP</strong> implémentés par un mélange <strong>de</strong> relationnel et <strong>de</strong> multidimensionnel<br />

Le choix d’<strong>une</strong> implémentation ou d’<strong>une</strong> autre n’est pas aisé. Si le R-<strong>OLAP</strong> est plus échelonnable,<br />

il est moins performant que le M-<strong>OLAP</strong>, qui, lui, peut conduire à <strong>une</strong> explosion <strong>de</strong> la taille<br />

<strong>de</strong> la <strong>base</strong> <strong>de</strong> <strong>données</strong>. Ce choix mérite donc <strong>une</strong> réflexion importante. Les outils existants <strong>sur</strong><br />

le marché, comme SQL Server Analysis Tools <strong>de</strong> Microsoft, implémentent parfois les différents<br />

types et fournissent à l’utilisateur <strong>de</strong>s évaluations <strong>de</strong> performances et <strong>de</strong> taille afin <strong>de</strong> l’ai<strong>de</strong>r à<br />

se déci<strong>de</strong>r.<br />

La gran<strong>de</strong> idée sous-jacente est que la représentation <strong>de</strong>s <strong>données</strong> ne doit plus être tabulaire<br />

comme c’est le cas pour les <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles. On doit être capable, et c’est le cas<br />

avec les outils actuellement <strong>sur</strong> le marché, <strong>de</strong> pouvoir présenter les <strong>données</strong> sous la forme que<br />

l’on souhaite.


2.6 Conclusions 12<br />

Les opérations que l’on souhaite pouvoir faire grâce à ce genre d’outils sont les opérations<br />

classiques que l’on peut effectuer <strong>sur</strong> un cube ou un hyper-cube. Nous avons détaillé ces différentes<br />

opérations un peu plus haut dans ce chapitre, à la page 7. Bien souvent, ces opérations<br />

<strong>de</strong>man<strong>de</strong>nt l’agrégation <strong>de</strong> me<strong>sur</strong>es suivant plusieurs dimensions. Les outils <strong>OLAP</strong> procè<strong>de</strong>nt<br />

généralement à <strong>de</strong>s pré-agrégations qui permettent d’accélérer les requêtes.<br />

Il existe <strong>de</strong>s langages spécifiques, comme Microsoft MDX, qui permettent d’écrire ces opérations<br />

<strong>de</strong> manière très simple. Ces langages combinés à <strong>de</strong>s outils graphiques permettent aux<br />

déci<strong>de</strong>urs d’utiliser ces outils sans assistance. Il faut bien se rendre compte que ce genre <strong>de</strong> système<br />

est <strong>de</strong>stiné à être utilisé par <strong>de</strong>s personnes non informaticiennes et donc leur accessibilité<br />

est importante.<br />

Les produits les plus utilisés actuellement, selon <strong>une</strong> étu<strong>de</strong> <strong>de</strong> olapreport.com, un site<br />

influent dans le domaine, sont SQL Server (28% du marché), Hyperion (19%) et Cognos (14%).<br />

Le marché paraît donc encore assez ouvert, même si Microsoft semble le dominer. Etrangement,<br />

SAP et Oracle se placent respectivement à la 5 e et 10 e place. Il existe aussi quelques systèmes<br />

libres comme Mondrian et Palo.<br />

2.6 Conclusions<br />

Les entrepôts <strong>de</strong> <strong>données</strong> et leurs outils <strong>de</strong>viennent indispensables dans le mon<strong>de</strong> <strong>de</strong>s entreprises.<br />

De nombreux systèmes existent mais la création et la gestion d’un système d’ai<strong>de</strong> à la<br />

décision reste très coûteux. Dans ce mémoire, nous allons étudier ce que <strong>XML</strong> peut apporter à<br />

ce domaine.<br />

Pour ce faire, dans les chapitres suivants, nous allons introduire le langage <strong>XML</strong>, ses métho<strong>de</strong>s<br />

d’interrogation et les systèmes permettant <strong>de</strong> gérer les documents <strong>XML</strong>.


Chapitre 3<br />

Les documents <strong>XML</strong><br />

Ce chapitre présente les fon<strong>de</strong>ments du langage <strong>de</strong> balisage extensible <strong>XML</strong> et les technologies<br />

qui lui sont associées.<br />

Contenu<br />

3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />

3.2 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />

3.3 Motivations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

3.4 Le document <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />

3.5 Les DTD et les Schémas <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . . 19<br />

3.6 Modélisation <strong>de</strong>s documents <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . 22<br />

3.7 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />

3.1 Introduction<br />

<strong>XML</strong> (eXtensible Markup Language) a été défini en 1998 par le W3C (World Wi<strong>de</strong> Web<br />

Consortium). Voici <strong>une</strong> traduction d’<strong>une</strong> partie <strong>de</strong> la recommandation 1.0 [7] :<br />

« Le langage <strong>de</strong> balisage extensible (eXtensible Markup Language, <strong>XML</strong>) est un<br />

sous-ensemble <strong>de</strong> SGML [...]. Son but est <strong>de</strong> permettre au SGML générique d’être<br />

transmis, reçu et traité <strong>sur</strong> le Web <strong>de</strong> la même manière que l’est HTML aujourd’hui.<br />

<strong>XML</strong> a été conçu pour être facile à mettre en œuvre et interopérable avec SGML et<br />

HTML. »<br />

<strong>XML</strong> est <strong>une</strong> notation permettant <strong>de</strong> décrire un langage sous la forme d’<strong>une</strong> grammaire<br />

d’arbre. Il permet <strong>de</strong> stocker <strong>de</strong>s <strong>données</strong> structurées dans un fichier texte à l’ai<strong>de</strong> <strong>de</strong> balises<br />

extensibles. Les balises peuvent être définies par les utilisateurs au contraire <strong>de</strong> l’HTML. Ce<br />

formalisme regroupe sous le nom d’<strong>XML</strong> <strong>une</strong> boite à outils extensible et évolutive dont le but<br />

est <strong>de</strong> simplifier l’organisation, l’échange et la structure <strong>de</strong>s <strong>données</strong>. <strong>XML</strong> n’est pas uniquement<br />

un langage à balises mais un ensemble <strong>de</strong> règles pour organiser <strong>de</strong>s <strong>données</strong> et un ensemble <strong>de</strong><br />

technologies permettant <strong>de</strong> manipuler ces <strong>données</strong> organisées.<br />

13


3.2 Historique 14<br />

3.2 Historique<br />

Comme nous l’avons vu dans l’introduction <strong>de</strong> ce chapitre, <strong>XML</strong> est un sous-ensemble <strong>de</strong><br />

SGML [8] (Standard General Markup Language). SGML est un standard ISO datant <strong>de</strong> 1985<br />

décrivant un méta-langage flexible <strong>de</strong>stiné à structurer <strong>de</strong>s documents. Il est basé <strong>sur</strong> GML [9]<br />

(Graphics Markup Language) développé chez IBM par Goldfarb, Mosher et Lorie (d’où l’acronyme)<br />

afin <strong>de</strong> décrire et structurer <strong>de</strong>s documents légaux. Le SGML est ensuite <strong>de</strong>venu un<br />

standard <strong>de</strong> représentation <strong>de</strong> <strong>données</strong> textuelles dans un format indépendant du système. Il<br />

a été utilisé par l’industrie pour produire <strong>de</strong>s catalogues et <strong>de</strong>s documentations techniques.<br />

Cependant, le SGML était très complexe à utiliser et peu pratique.<br />

En 1989, Tim Berners-Lee définit l’HTML [10] (HyperText Markup Language), le langage <strong>de</strong><br />

mise en forme bien connu. C’est le début du Web tel que l’on le connaît. HTML est un dialecte<br />

allégé du SGML mais qui reste assez limité malgré <strong>de</strong> nombreuses adaptations au fil du temps.<br />

Peu après, le W3C a été créé dans le but <strong>de</strong> garantir un accès universel au Web. C’est un<br />

arbitre neutre en ce qui concerne l’architecture, l’interface et les technologies relatives au Web.<br />

Cet organisme produit <strong>de</strong>s papiers <strong>de</strong> travail (Working Drafts) et <strong>de</strong>s recommandations à propos<br />

<strong>de</strong>s standards <strong>de</strong> la toile en ayant toujours comme objectif l’interopérabilité et l’universalité <strong>de</strong>s<br />

technologies utilisées <strong>sur</strong> le Web.<br />

A cette époque, le marché du SGML est assez confi<strong>de</strong>ntiel et sa communauté a peur <strong>de</strong> ne<br />

pas profiter <strong>de</strong> l’essor <strong>de</strong> son fils, l’HTML. De son côté, le W3C trouve que le Web est mal<br />

organisé du fait du mélange entre présentation et structure (par exemple la balise au<br />

lieu <strong>de</strong> ). Un partenariat avec la communauté <strong>de</strong>s développeurs SGML est fait au sein du<br />

W3C et un groupe <strong>de</strong> travail est constitué : SGML-Light Working Group.<br />

Le W3C et la communauté SGML ont un but commun : ré-aiguiller le Web vers un successeur<br />

<strong>de</strong> SGML. En 1996, l’idée du <strong>XML</strong> est née : on veut un SGML simple, facile à manipuler et<br />

permettant un échange d’informations structurées traitables par ordinateur. <strong>XML</strong> se doit <strong>de</strong><br />

supporter un grand nombre d’applications et donc permettre aux utilisateurs <strong>de</strong> spécifier leurs<br />

propres structures <strong>de</strong> <strong>données</strong>. Ce groupe <strong>de</strong> travail va reprendre les meilleurs parties du SGML<br />

et profiter <strong>de</strong> l’expérience <strong>de</strong> l’HTML pour produire <strong>une</strong> technologie toute aussi puissante que<br />

SGML mais beaucoup plus régulière et simple à utiliser.<br />

Les exigences (requirements) d’<strong>XML</strong> peuvent être résumés par les 10 points suivants [7] :<br />

1. <strong>XML</strong> doit être facilement utilisable <strong>sur</strong> le Web.<br />

2. <strong>XML</strong> doit supporter <strong>une</strong> gran<strong>de</strong> variété d’applications.<br />

3. <strong>XML</strong> doit être compatible avec SGML.<br />

4. Il doit être facile d’écrire <strong>de</strong>s programmes qui traitent <strong>de</strong>s documents <strong>XML</strong>.<br />

5. Le nombre d’options doit être réduit au minimum, idéalement à zéro.<br />

6. Les documents <strong>XML</strong> doivent être lisibles et raisonnablement clairs.<br />

7. La conception <strong>de</strong> <strong>XML</strong> doit être menée rapi<strong>de</strong>ment.<br />

8. La <strong>de</strong>scription <strong>de</strong> <strong>XML</strong> doit être formelle et concise.


3.3 Motivations 15<br />

9. Les documents <strong>XML</strong> doivent être faciles à créer.<br />

10. La concision du balisage <strong>XML</strong> est d’<strong>une</strong> importance minime.<br />

En 1998, le groupe <strong>de</strong> travail <strong>XML</strong> du W3C fixe le format dans la recommandation <strong>XML</strong> 1.0.<br />

Très vite, le support natif <strong>de</strong> ce langage arrive dans les navigateurs (Microsoft Internet Explorer<br />

5.0, Netscape 6.0), les suites bureautiques (Microsoft Office 2000, OpenOffice.org), . . .<br />

L’utilisation d’<strong>XML</strong> ne cesse <strong>de</strong> croître, il est utilisé partout : <strong>sur</strong> Internet, dans les <strong>base</strong>s <strong>de</strong><br />

<strong>données</strong>, dans les fichiers <strong>de</strong> configuration, pour représenter <strong>de</strong>s <strong>données</strong> spatiales (GML), <strong>de</strong>s<br />

formules mathématiques (MathML), <strong>de</strong>s composants chimiques (CML), etc. La recommandation<br />

originale <strong>de</strong> <strong>XML</strong> a très peu évolué <strong>de</strong>puis sa sortie : sa simplicité permet <strong>de</strong> décrire n’importe<br />

quel type <strong>de</strong> <strong>données</strong>.<br />

3.3 Motivations<br />

<strong>XML</strong> est <strong>une</strong> métho<strong>de</strong> utilisée pour stocker <strong>de</strong>s <strong>données</strong> structurées dans un fichier texte.<br />

On entend par <strong>données</strong> structurées <strong>de</strong>s éléments tels qu’agendas, paramètres <strong>de</strong> configuration,<br />

fiches clients, <strong>de</strong>ssins vectoriels, . . . : n’importe quel élément pouvant être modélisé à l’ai<strong>de</strong> d’<strong>une</strong><br />

structure arborescente.<br />

Bien souvent, les logiciels stockent ces <strong>données</strong> <strong>sur</strong> disque dans un format binaire, compréhensible<br />

par un nombre limité d’applications. L’avantage du format texte est <strong>de</strong> pouvoir être<br />

manipulé au besoin indépendamment du programme source. Bien que stocké sous format textuel,<br />

un fichier <strong>XML</strong> n’est pas <strong>de</strong>stiné à être lu par <strong>de</strong>s personnes mais il offre la possibilité pour<br />

les développeurs <strong>de</strong> déboguer plus facilement leur application en corrigeant à la main (à l’ai<strong>de</strong><br />

d’un éditeur <strong>de</strong> texte) un fichier <strong>XML</strong> endommagé.<br />

<strong>XML</strong> est donc un ensemble <strong>de</strong> règles, <strong>de</strong> conventions permettant <strong>de</strong> concevoir <strong>de</strong>s fichiers<br />

comprenant <strong>de</strong>s <strong>données</strong> structurées <strong>de</strong> manière non ambiguë, facile à générer et à lire par ordinateur<br />

et ayant un bon support <strong>de</strong> l’internationalisation et <strong>de</strong> la compatibilité entre différentes<br />

plates-formes.<br />

<strong>XML</strong> est un méta-langage qui utilise <strong>de</strong>s balises et <strong>de</strong>s attributs. Une balise est un ensemble<br />

<strong>de</strong> mots encadrés par les symboles < et >. Un attribut est un couple nom - valeur, défini par<br />

nom="valeur". Ces balises ne sont pas fixées : l’utilisateur peut définir ses propres balises, son<br />

propre format <strong>XML</strong>. Les balises en <strong>XML</strong>, au contraire <strong>de</strong> l’HTML, n’ont pas <strong>de</strong> signification<br />

précise : elles sont présentes pour délimiter les <strong>données</strong> et <strong>XML</strong> laisse l’entière interprétation<br />

<strong>de</strong>s <strong>données</strong> à l’application qui les lit. Par exemple, <strong>une</strong> balise en <strong>XML</strong> ne représente pas<br />

nécessairement un paragraphe comme en HTML. Cela peut être un prix, <strong>une</strong> personne, un<br />

produit, . . . Les règles en <strong>XML</strong> sont aussi beaucoup plus strictes qu’en HTML : par exemple,<br />

toute balise ouverte doit être fermée et les attributs doivent obligatoirement être entourés <strong>de</strong><br />

guillemets.<br />

Du fait <strong>de</strong> l’utilisation du format texte et <strong>de</strong> nombreuses balises pour délimiter les <strong>données</strong>,<br />

un fichier <strong>XML</strong> est presque toujours plus volumineux que son équivalent binaire. C’est le prix<br />

à payer pour obtenir les facilités évoquées plus haut dans cette section. Néanmoins, ce prix


3.4 Le document <strong>XML</strong> 16<br />

est à relativiser car l’espace disque n’est plus aussi coûteux qu’auparavant et qu’il existe <strong>de</strong><br />

très bon compresseurs/décompresseurs rapi<strong>de</strong>s. Il est utile <strong>de</strong> noter que le protocole HTTP/1.1<br />

(HyperText Transfer Protocol, le protocole du Web) permet <strong>de</strong> compresser <strong>de</strong>s <strong>données</strong> à la volée,<br />

ce qui économise la ban<strong>de</strong> passante <strong>de</strong> la même manière que les fichiers binaires.<br />

<strong>XML</strong> n’est pas seulement un méta-langage ; c’est <strong>une</strong> boîte à outils. Autour <strong>de</strong> la recommandation<br />

<strong>XML</strong> 1.0 du W3C qui définit principalement ce que sont les balises et les attributs, un<br />

nombre croissant <strong>de</strong> modules ont été définis. Ce sont <strong>de</strong>s modules facultatifs qui fournissent <strong>de</strong>s<br />

ensembles <strong>de</strong> balises et d’attributs, <strong>de</strong>s règles pour certaines tâches particulières, <strong>de</strong>s métho<strong>de</strong>s<br />

pour les exploiter, . . . Citons en quelques uns comme XLink qui décrit <strong>une</strong> métho<strong>de</strong> pour ajouter<br />

<strong>de</strong>s liens hyper-textes à un fichier <strong>XML</strong>. XPointer permet <strong>de</strong> se référer à <strong>de</strong>s parties <strong>de</strong> document<br />

<strong>XML</strong>. XPath est un outil pour accé<strong>de</strong>r aux <strong>données</strong> d’un fichier <strong>XML</strong> à l’ai<strong>de</strong> <strong>de</strong> chemins<br />

<strong>de</strong> type UNIX. XQuery est un langage d’interrogation type SQL. D’autres outils importants<br />

sont les espaces <strong>de</strong> noms (namespaces) qui permettent d’éviter toute confusion lors <strong>de</strong> noms<br />

i<strong>de</strong>ntiques et les Schémas <strong>XML</strong> qui offrent aux développeurs la possibilité <strong>de</strong> définir leur propre<br />

format <strong>XML</strong>. De nombreux autres modules existent et leur nombre est en constante croissance.<br />

Dans les chapitres suivants, nous détaillerons certains <strong>de</strong> ces concepts, jugés intéressants dans le<br />

domaine <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong>.<br />

Les avantages principaux d’<strong>XML</strong> sont donc sa simplicité, sa modularité, sa stabilité (le<br />

format a peu évolué <strong>de</strong>puis son arrivée en 1998) et son universalité. De plus, il est libre <strong>de</strong><br />

droit et possè<strong>de</strong> un nombre grandissant d’outils et d’utilisateurs. Cela facilite gran<strong>de</strong>ment les<br />

recherches, la réutilisation et diminue la dépendance vis-à-vis <strong>de</strong>s fournisseurs et applications.<br />

Enfin, <strong>XML</strong> est beaucoup plus souple que le relationnel pour modéliser le mon<strong>de</strong> réel.<br />

Nous clôturons ces motivations par <strong>une</strong> citation <strong>de</strong> Bert Bos, membre du W3C :<br />

« <strong>XML</strong> n’est pas toujours la meilleure solution, mais il vaut toujours la peine d’être<br />

pris en considération »<br />

3.4 Le document <strong>XML</strong><br />

Dans ce chapitre, nous introduirons brièvement les concepts relatifs aux documents <strong>XML</strong><br />

que nous utiliserons dans la suite <strong>de</strong> ce mémoire.<br />

3.4.1 Les outils <strong>de</strong> <strong>base</strong><br />

Un fichier <strong>XML</strong> étant avant tout un fichier texte, il peut être édité avec n’importe quel<br />

éditeur <strong>de</strong> texte comme Emacs par exemple. Il existe aussi <strong>de</strong>s éditeurs spécialisés orientés <strong>XML</strong><br />

tels que oXygen qui permettent <strong>de</strong> visualiser <strong>de</strong> façon graphique les documents <strong>XML</strong>.<br />

La plupart <strong>de</strong>s navigateurs récents permettent d’afficher les documents <strong>XML</strong> <strong>de</strong> façon hiérarchique<br />

<strong>de</strong> telle sorte que l’on peut se déplacer dans le fichier comme dans un arbre. Ceux-ci<br />

permettent aussi <strong>de</strong> vérifier la validité d’un fichier <strong>XML</strong>, nous en parlerons au point 3.5. Cependant,<br />

rappellons que le but premier d’<strong>XML</strong> est <strong>de</strong> décrire <strong>de</strong>s <strong>données</strong> et non pas <strong>de</strong> les


3.4 Le document <strong>XML</strong> 17<br />

présenter. <strong>XML</strong> est aussi indépendant du système utilisé : l’utilisation d’un navigateur est donc<br />

loin d’être nécessaire pour vali<strong>de</strong>r les <strong>données</strong>. De nombreux analyseurs syntaxiques (parsers)<br />

existent pour cela : citons Expat et Xerces qui sont <strong>de</strong>ux projets libres.<br />

3.4.2 Notions générales<br />

Document <strong>XML</strong><br />

<br />

Marc Dupond<br />

<br />

1234567<br />

7654321<br />

<br />

<br />

Prologue<br />

Attribut<br />

Elément<br />

Fig. 3.1 – Exemple <strong>de</strong> fichier <strong>XML</strong>.<br />

Contenu<br />

(PCDATA)<br />

Un exemple <strong>de</strong> fichier <strong>XML</strong> très simple est illustré à la figure 3.1. Comme on peut le remarquer,<br />

chaque section est marquée à l’ai<strong>de</strong> <strong>de</strong> balises <strong>de</strong>scriptives permettant d’i<strong>de</strong>ntifier le type<br />

<strong>de</strong> <strong>données</strong> qu’elle contient.<br />

Un document <strong>XML</strong> est soit bien formé, soit vali<strong>de</strong>. Il peut en outre être illégal mais, dans ce<br />

cas, nous ne pouvons le considérer en tant que fichier <strong>XML</strong>. Introduisons ces <strong>de</strong>ux concepts et<br />

les notions nécessaires à leur compréhension :<br />

Un document <strong>XML</strong> bien formé est un document qui suit la recommandation <strong>XML</strong>, c’est-àdire<br />

qu’il est conforme aux règles en ce qui concerne les éléments et les attributs, qu’il contient<br />

les déclarations essentielles et qu’il respecte parfaitement <strong>une</strong> structure arborescente.<br />

Un document <strong>XML</strong> est vali<strong>de</strong> s’il est bien formé et qu’il suit les règles d’<strong>une</strong> définition <strong>de</strong><br />

type <strong>de</strong> document (DTD) ou d’un Schéma <strong>XML</strong>. Une DTD permet d’imposer <strong>une</strong> structure à<br />

un document <strong>XML</strong> : un document <strong>XML</strong> peut donc se conformer à un ensemble <strong>de</strong> règles afin<br />

d’éviter <strong>de</strong>s erreurs <strong>de</strong> forme. Un Schéma <strong>XML</strong> permet en plus <strong>de</strong> typer les <strong>données</strong> se trouvant<br />

dans le document auquel il est associé alors que la DTD ne se préoccupe pas du typage. Nous<br />

verrons plus en détail ces outils par la suite, au point 3.5.<br />

3.4.3 Types <strong>de</strong> documents <strong>XML</strong><br />

Les documents <strong>XML</strong> peuvent se classer en <strong>de</strong>ux gran<strong>de</strong>s catégories : orientés <strong>données</strong> et<br />

orientés présentation.


3.4 Le document <strong>XML</strong> 18<br />

Documents orientés <strong>données</strong><br />

Les documents orientés <strong>données</strong> (data-centric) sont ceux où <strong>XML</strong> est utilisé pour transporter<br />

<strong>de</strong>s <strong>données</strong>. Ils incluent les ordres <strong>de</strong> ventes, les enregistrements <strong>de</strong> patients et les <strong>données</strong> scientifiques.<br />

Leur structure physique (l’ordre <strong>de</strong>s éléments, l’utilisation <strong>de</strong> PCDATA ou d’attributs)<br />

n’est pas importante dans la majorité <strong>de</strong>s cas.<br />

Documents orientés présentation<br />

Les documents orientés présentation (document-centric) sont ceux dans lesquels <strong>XML</strong> est<br />

utilisé pour ses capacités similaires à SGML, comme dans un manuel d’utilisateur, <strong>une</strong> page<br />

web statique en XHTML ou <strong>de</strong>s brochures. Ils sont caractérisés par leur structure irrégulière<br />

et leur contenu mixte. A l’opposé <strong>de</strong>s documents orientés <strong>données</strong>, leur structure physique est<br />

importante. Par exemple, pour un manuel d’utilisateur, l’ordre <strong>de</strong>s chapitres est important. Par<br />

contre, pour <strong>une</strong> facture, l’ordre <strong>de</strong>s articles ne l’est pas ou l’est moins.<br />

3.4.4 Les éléments, ses attributs et les <strong>données</strong> textuelles<br />

Dans le document <strong>XML</strong>, après le prologue, se trouve <strong>une</strong> série d’éléments. Un élément est<br />

l’unité <strong>de</strong> <strong>base</strong> d’un document <strong>XML</strong>, composé <strong>de</strong> <strong>données</strong> textuelles et <strong>de</strong> balises. Les frontières<br />

d’un élément sont définies par <strong>une</strong> balise <strong>de</strong> début et <strong>une</strong> balise <strong>de</strong> fin. Un élément peut contenir<br />

<strong>de</strong>s attributs additionnels. Par exemple, Jean Dupond est un élément<br />

et Jean Dupond est un élément contenant un attribut.<br />

Notons qu’<strong>XML</strong> permet la définition d’éléments vi<strong>de</strong>s : ils n’ont pas <strong>de</strong> contenu et pas <strong>de</strong><br />

balise fermante. Ces éléments sont formés en ajoutant <strong>une</strong> barre oblique à la fin <strong>de</strong> la balise<br />

ouvrante. est un élément vi<strong>de</strong>.<br />

Du point <strong>de</strong> vue <strong>de</strong> la syntaxe, le nom d’un élément doit toujours commencer par <strong>une</strong> lettre<br />

et est sensible à la casse. Un élément ne peut contenir que du texte ou <strong>une</strong> combinaison <strong>de</strong> textes<br />

d’autres éléments : Jean Dupont18 est <strong>une</strong> combinaison<br />

vali<strong>de</strong>.<br />

Un document <strong>XML</strong> bien formé doit contenir au moins un, et un seul élément non vi<strong>de</strong>, appelé<br />

élément racine. Celui-ci peut contenir d’autres éléments définissant ainsi un arbre.<br />

Comme le précise la spécification <strong>XML</strong>, tout texte qui n’est pas du balisage est <strong>une</strong> donnée<br />

textuelle du document. Précisons toutefois que certains symboles sont interdits comme et<br />

&. Pour utiliser ces caractères, il faut les remplacer par leur représentation hexadécimale.<br />

Les éléments peuvent, comme indiqué plus haut, contenir <strong>de</strong>s attributs qui fournissent<br />

<strong>de</strong>s informations supplémentaires. Ces attributs sont <strong>de</strong>s couples (nom, valeur) <strong>de</strong> la forme<br />

nom="valeur". Ils doivent se trouver dans la balise ouvrante après le nom <strong>de</strong> l’élément. Notons<br />

que les noms d’attributs sont aussi sensibles à la casse, qu’ils doivent être uniques au sein d’un<br />

même élément et que les valeurs <strong>de</strong>s attributs se trouvent obligatoirement entre guillemets. La<br />

décision d’utiliser un attribut plutôt qu’un élément peut être un problème complexe car leurs


3.5 Les DTD et les Schémas <strong>XML</strong> 19<br />

fonctionnalités sont similaire. Les <strong>de</strong>ux formes suivantes sont correctes et permettent d’obtenir<br />

le même effet :<br />

Jean Dupond<br />

Jean Dupondm<br />

Des raisons vali<strong>de</strong>s pour utiliser <strong>de</strong>s attributs au lieu d’éléments sont l’affectation d’un i<strong>de</strong>ntificateur<br />

à un élément ou la <strong>de</strong>scription <strong>de</strong> caractéristiques <strong>de</strong> l’élément lui même :<br />

Jean Dupond<br />

Jonagold<br />

Notons qu’il est aussi possible <strong>de</strong> limiter les valeurs possibles d’un attribut grâce à <strong>une</strong> DTD<br />

ou un Schéma <strong>XML</strong> afin d’éviter les erreurs. Nous en parlerons au point 3.5.<br />

3.4.5 L’espace <strong>de</strong> nom<br />

Un document <strong>XML</strong> peut contenir <strong>de</strong>s éléments et <strong>de</strong>s attributs correspondants à plusieurs<br />

domaines distincts, par exemple plusieurs dialectes. Il se peut donc qu’il y ait <strong>de</strong>s collisions au<br />

niveau <strong>de</strong>s noms d’éléments et d’attributs.<br />

Peu après la première recommandation <strong>XML</strong> <strong>de</strong> 1998, <strong>une</strong> solution à ce problème est établie :<br />

les espaces <strong>de</strong> noms (namespaces en anglais). Les espaces <strong>de</strong> noms permettent d’introduire <strong>une</strong><br />

collection <strong>de</strong> noms utilisables pour les éléments et attributs d’un document <strong>XML</strong>. Une collection<br />

est i<strong>de</strong>ntifiée par un URI.<br />

On peut donc utiliser un espace <strong>de</strong> nom par défaut ou plusieurs espaces <strong>de</strong> nom au sein d’un<br />

même document <strong>XML</strong> à l’ai<strong>de</strong> <strong>de</strong> préfixes. Nous ne rentrerons pas dans les détails <strong>de</strong> ce concept.<br />

3.5 Les DTD et les Schémas <strong>XML</strong><br />

Les DTD et les <strong>XML</strong> Schémas sont <strong>de</strong>s langages utilisés pour définir la structure <strong>de</strong>s documents<br />

<strong>XML</strong>. Ils déterminent quels éléments peuvent être contenus dans un document <strong>XML</strong>,<br />

quels éléments peuvent être imbriqués dans d’autres, quelle valeur par défaut leurs attributs<br />

peuvent avoir, etc. A l’ai<strong>de</strong> d’<strong>une</strong> DTD ou d’un Schéma <strong>XML</strong> et du document <strong>XML</strong> correspondant,<br />

un analyseur syntaxique peut confirmer que le document est conforme à la structure et<br />

aux contraintes désirées. Un tel document est dit vali<strong>de</strong>.<br />

Les DTD <strong>XML</strong>[7] sont un sous-ensemble <strong>de</strong>s DTD SGML. Une DTD définit la structure du<br />

document à l’ai<strong>de</strong> d’<strong>une</strong> liste d’éléments légaux. Le mot-clé !ELEMENT définit le type <strong>de</strong> l’élément<br />

et le mot-clé !ATTLIST précise ses attributs. La DTD permet également <strong>de</strong> déclarer le nombre<br />

<strong>de</strong> fois qu’un élément fils peut apparaître dans un élément parent : un ou plus (+), zéro ou plus<br />

(*) ou zéro ou un ( ?). Les attributs <strong>de</strong> type ID et IDREF permettent <strong>de</strong> créer <strong>de</strong>s relations entre<br />

les attributs, à l’image <strong>de</strong>s clés étrangères utilisées dans les systèmes relationnels.<br />

Les types d’éléments possibles sont les suivants :<br />

⊲ #PCDATA désigne les <strong>données</strong> textuelles <strong>de</strong>vant être traitées par l’analyseur ;


3.5 Les DTD et les Schémas <strong>XML</strong> 20<br />

⊲ #CDATA désigne les <strong>données</strong> textuelles qui ne doivent pas être traitées par l’analyseur ;<br />

⊲ EMPTY signifie que l’élément ne peut rien contenir ;<br />

⊲ ANY signifie que l’élément peut contenir ce que l’on veut.<br />

Pour illustrer, analysons l’exemple suivant :<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

]><br />

<br />

L’art <strong>de</strong> l’intrusion <br />

< auteurs ><br />

< personne > Mitnick < prenom >Kevin <br />

< personne >Simon < prenom > William <br />

<br />

<br />

Il s’agit d’un document <strong>XML</strong> vali<strong>de</strong> précédé <strong>de</strong> sa DTD. Cette DTD peut être interprétée comme<br />

suit :<br />

⊲ !DOCTYPE livre définit qu’il s’agit d’un document <strong>de</strong> type livre.<br />

⊲ !ELEMENT livre (titre, auteurs) définit qu’un élément livre doit contenir comme<br />

fils un élément titre et un élément auteurs.<br />

⊲ !ATTLIST livre ISBN CDATA #REQUIRED définit l’attribut ISBN d’un élément livre.<br />

Cet attribut est obligatoire pour chaque livre. S’il n’est pas spécifié, le document ne sera<br />

pas validé.<br />

⊲ !ELEMENT titre #CDATA et les autres lignes similaires définissent que les éléments titre,<br />

nom et prenom doivent contenir <strong>de</strong>s <strong>données</strong> CDATA. Rien d’autre n’est précisé à propos<br />

<strong>de</strong> ces <strong>données</strong>, si ce n’est que ce sont <strong>de</strong>s <strong>données</strong> textuelles.<br />

⊲ !ELEMENT auteurs (personne+) définit qu’un élément auteurs doit être composé d’au<br />

moins un élément personne.<br />

⊲ !ELEMENT personne (nom,prenom) définit qu’un élément personne est composé d’un<br />

élément nom et d’un élément prenom.<br />

Cependant, un <strong>de</strong>s gros défauts <strong>de</strong>s DTD, malgré leur simplicité, est qu’il n’est pas possible<br />

<strong>de</strong> définir <strong>de</strong>s contraintes comme le nombre <strong>de</strong> fois qu’un élément particulier doit apparaître<br />

dans le document, le type <strong>de</strong>s <strong>données</strong> <strong>de</strong> chaque élément, etc. Il faut se rappeler que les DTD<br />

ont été inventées à l’époque du SGML, utilisé pour décrire <strong>de</strong>s documents. Des contraintes<br />

d’instanciation et <strong>de</strong> typage sont moins critiques pour <strong>de</strong>s documents <strong>XML</strong> orientés présentation,


3.5 Les DTD et les Schémas <strong>XML</strong> 21<br />

que nous pouvons comparer avec les documents SGML. Pour plus d’informations à propos <strong>de</strong>s<br />

DTD, nous vous invitons à consulter les références suivantes [7, 11].<br />

<strong>XML</strong> Schéma [12, 13] est un langage <strong>de</strong> <strong>de</strong>scription <strong>de</strong> format <strong>de</strong> document <strong>XML</strong> permettant<br />

<strong>de</strong> définir la structure et la grammaire d’un document <strong>XML</strong>. Il a fait l’objet <strong>de</strong> la recommandation<br />

du W3C datant en 2001. Le document produit à l’ai<strong>de</strong> <strong>de</strong> ce langage est un fichier <strong>de</strong><br />

<strong>de</strong>scription <strong>de</strong> structure (<strong>XML</strong> Scheme Description ou fichier XSD). Ce <strong>de</strong>rnier est, au contraire<br />

<strong>de</strong> la DTD, un document <strong>XML</strong> bien formé. Il n’y a donc plus <strong>de</strong> balises telles que < !ELEMENT>,<br />

< !ATTLIST>, . . .<br />

Le rôle d’un fichier XSD est un peu équivalent à celui d’<strong>une</strong> DTD ; c’est-à-dire qu’il permet<br />

<strong>de</strong> vali<strong>de</strong>r un document <strong>XML</strong>. <strong>XML</strong> Schéma comporte cependant quelques différences : les types<br />

<strong>de</strong> <strong>données</strong> <strong>de</strong> <strong>base</strong> utilisables dans les DTD (#PCDATA, ANY, EMPTY) ont été enrichis (entiers,<br />

réels, chaîne, date, liste, . . . ). Les types <strong>de</strong> <strong>données</strong> sont dérivables : on peut donc réutiliser un<br />

type défini pour l’enrichir. Il est également possible <strong>de</strong> grouper les attributs en factorisant leurs<br />

définitions afin <strong>de</strong> faciliter leur réutilisation. L’on peut également définir précisément le nombre<br />

d’occurrences d’un élément au sein d’un document <strong>XML</strong>.<br />

Il est intéressant <strong>de</strong> remarquer que <strong>XML</strong> Schéma est lui même défini par un schéma, dont<br />

les balises <strong>de</strong> définition s’auto-définissent, ce qui en fait un exemple <strong>de</strong> définition récursive.<br />

Contrairement aux DTD, les <strong>XML</strong> Schémas ont été développés par <strong>de</strong>s gens non documentalistes,<br />

mais appartenant au mon<strong>de</strong> <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> et <strong>de</strong>s langages. Le <strong>de</strong>sign est donc puissant<br />

et mo<strong>de</strong>rne mais complexe.<br />

Précisons que <strong>XML</strong> Schéma utilise les espaces <strong>de</strong> noms <strong>XML</strong> (namespaces). Un document<br />

XSD <strong>de</strong>vra donc indiquer l’URL <strong>de</strong> l’espace <strong>de</strong> nom consacré à <strong>XML</strong> Schéma. Les déclarations<br />

<strong>de</strong>vront donc être contenues dans l’élément <strong>XML</strong> suivant :<br />

< xsd:schema xmlns =" http: // www .w3.org /2001/ <strong>XML</strong>Schema "><br />

(...)<br />

<br />

A titre d’illustration, voici le Schéma <strong>XML</strong> suivant, qui correspond à l’exemple <strong>de</strong> la page<br />

précé<strong>de</strong>nte.<br />

<br />

< xsd:schema xmlns:xsd =" http: // www .w3.org /2001/ <strong>XML</strong>Schema "><br />

< xsd:element name =" livre "><br />

< xsd:complexType ><br />

< xsd:sequence ><br />

< xsd:element name =" titre " type =" xsd:string "/><br />

< xsd:element name =" auteurs "><br />

< xsd:element name =" personne " maxOccurs =" unboun<strong>de</strong>d "><br />

< xsd:complexType ><br />

< xsd:sequence ><br />

< xsd:element name =" nom " type =" xsd:string "/><br />

< xsd:element name =" prenom " type =" xsd:string "/><br />

<br />


3.6 Modélisation <strong>de</strong>s documents <strong>XML</strong> 22<br />

<br />

<br />

<br />

< xsd:attribute name =" ISBN " type =" xsd:string " use =" required "/><br />

<br />

<br />

<br />

Introduire manuellement ce genre <strong>de</strong> document n’est pas <strong>une</strong> tâche aisée. Il existe bien sûr<br />

moult logiciels permettant <strong>de</strong> détecter <strong>de</strong>s schémas à partir <strong>de</strong> documents <strong>XML</strong> ou <strong>de</strong> les créer<br />

à l’ai<strong>de</strong> d’<strong>une</strong> interface graphique ergonomique comme par exemple le logiciel oXygen 1 .<br />

Les Schémas <strong>XML</strong> sont donc plus adaptés pour définir <strong>de</strong>s documents <strong>XML</strong> structurés. Cela<br />

nous intéresse particulièrement dans le domaine <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong>, car nous pouvons définir<br />

très précisément le type <strong>de</strong> ces <strong>données</strong> afin <strong>de</strong> garantir leur intégrité dans la <strong>base</strong>.<br />

D’autres langages similaires existent comme, par exemple, RelaxNG [14], développé par OA-<br />

SIS. Il est, selon ses auteurs, plus simple et plus compact que les Schémas <strong>XML</strong>. Nous ne nous<br />

attar<strong>de</strong>rons pas plus <strong>sur</strong> ces langages <strong>de</strong> définition <strong>de</strong> structure.<br />

3.6 Modélisation <strong>de</strong>s documents <strong>XML</strong><br />

Un document <strong>XML</strong> est habituellement modélisé comme un graphe dont les nœuds correspon<strong>de</strong>nt<br />

aux éléments et attributs <strong>XML</strong>. Le graphe est généralement un arbre, si nous supposons<br />

qu’il n’y a pas d’attribut <strong>de</strong> type IDREF/IDREFS. Ce type d’attribut permet <strong>de</strong> lier <strong>de</strong>s éléments<br />

à l’ai<strong>de</strong> d’un système <strong>de</strong> clés comme dans les <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles. Nous l’apellerons<br />

l’arbre <strong>XML</strong> par la suite. Un attribut est modélisé comme un fils <strong>de</strong> l’élément correspondant. Les<br />

valeurs textuelles <strong>de</strong>s éléments ou <strong>de</strong>s attributs apparaissent comme <strong>de</strong>s feuilles <strong>de</strong> l’arbre <strong>XML</strong>.<br />

Une caractéristique comm<strong>une</strong> <strong>de</strong>s langages d’interrogation <strong>XML</strong> (dont nous parlerons dans le<br />

chapitre 4) est la possibilité <strong>de</strong> formuler <strong>de</strong>s chemins dans le graphe <strong>XML</strong>.<br />

Pour illustrer, observons un document <strong>XML</strong> et son arbre, représenté à la figure 3.2. Dans<br />

cette illustration, les éléments sont représentés par <strong>de</strong>s cercles, les attributs par un triangle et<br />

les valeurs <strong>de</strong>s éléments ou attributs par <strong>de</strong>s rectangles.<br />

Dans les sections suivantes, nous parlerons <strong>de</strong>s différents ordres d’un document <strong>XML</strong> ainsi<br />

que différentes sortes <strong>de</strong> modélisation.<br />

3.6.1 Ordres<br />

Dans la suite <strong>de</strong> ce document, nous allons parler <strong>de</strong> trois ordres différents. Bien que cela<br />

semble être trivial, nous nous permettons <strong>de</strong> les introduire brièvement dans ce chapitre. Les<br />

trois ordres que nous allons utiliser sont les suivants :<br />

⊲ L’ordre du document<br />

⊲ L’ordre <strong>de</strong>s nœuds en parcours post-fixé<br />

⊲ L’ordre <strong>de</strong>s nœuds en parcours pré-fixé<br />

1 http://www.oxygenxml.com/


3.6 Modélisation <strong>de</strong>s documents <strong>XML</strong> 23<br />

Ordre du document<br />


In Figure 1.2 the preor<strong>de</strong>r and postor<strong>de</strong>r traversal of an <strong>XML</strong> tree are shown. The document<br />

or<strong>de</strong>r is a < b < c < d < e < f < g < h < i < j, and thus pre(a) = 0, pre(b) = 1, . . . ,<br />

pre(j) = 9. The postor<strong>de</strong>r traversal is acquired: post(d) = 0, post(e) = 1, post(c) = 2,<br />

post(f) = 3, post(b) = 4, post(i) = 5, post(j) = 6, post(h) = 7, post(g) = 8, post(a) = 9.<br />

3.6 Modélisation <strong>de</strong>s documents <strong>XML</strong> 24<br />

(2)<br />

c<br />

(1)<br />

(3) d (4)<br />

b<br />

e<br />

(5)<br />

f<br />

(a)<br />

a<br />

(0)<br />

g<br />

h<br />

(6)<br />

(7)<br />

i (8) j (9)<br />

(2)<br />

c<br />

(4)<br />

(0) d (1)<br />

Fig. 3.3 1.2. – (a) Parcours Preor<strong>de</strong>rpré-ordre and (b) postor<strong>de</strong>r et (b) parcours traversal post-ordre of and’un <strong>XML</strong>arbre. tree<br />

b<br />

e<br />

(3)<br />

f<br />

(b)<br />

a<br />

i<br />

(9)<br />

g<br />

h<br />

(8)<br />

(7)<br />

(5) j (6)<br />

SAX n’est pas à proprement parlé un modèle pour les documents <strong>XML</strong> mais il peut être<br />

vu comme un modèle événementiel pour <strong>XML</strong>. En effet, SAX permet <strong>de</strong> parcourir le document<br />

<strong>XML</strong> séquentiellement. A chaque nouvel élément et à chaque fin d’élément, un événement est<br />

1.4 déclenché. <strong>XML</strong> Cet outilQuery sert donc àLanguages interroger un document <strong>XML</strong> à l’ai<strong>de</strong> d’un programme tiers <strong>de</strong><br />

façon séquentielle. Il est donc impossible <strong>de</strong> remonter dans le document <strong>XML</strong> ou <strong>de</strong> réordonner<br />

To les obtain nœuds, specified ce qu’il est data possible from <strong>de</strong> anfaire <strong>XML</strong>avec data<strong>base</strong> le modèle a number DOM. of special query languages have<br />

been <strong>de</strong>veloped, e.g. <strong>XML</strong>-QL [20], XQL [66], XPath [81], and XQuery [80]. A common<br />

L’avantage <strong>de</strong> SAX est qu’il ne nécessite pas beaucoup <strong>de</strong> place en mémoire contrairement<br />

feature of these languages is a possibility to formulate paths in the <strong>XML</strong> graph. Such a<br />

à DOM dont nous parlerons au point 3.6.4.<br />

path is a sequence of element or attribute names from the root element to a leaf. Regular<br />

expressions provi<strong>de</strong> a valuable method for paths specifications. In fact, most of <strong>XML</strong><br />

query 3.6.3 languages Infoset are <strong>base</strong>d on the XPath language that uses a form of path expressions for<br />

composing more general queries.<br />

Infoset [16] est <strong>une</strong> représentation abstraite <strong>de</strong>s informations contenues dans un document<br />

<strong>XML</strong>. Infoset définit un document <strong>XML</strong> bien formé comme un ensemble d’éléments d’informations.<br />

Il y a onze éléments d’information et chaque élément possè<strong>de</strong> un ensemble <strong>de</strong> propriétés.<br />

Par exemple, pour un élément <strong>XML</strong>, les propriétés sont les suivantes : <strong>une</strong> liste d’éléments<br />

enfants, l’élément parent, les attributs, le nom <strong>de</strong> l’élément, l’espace <strong>de</strong> nom et son préfixe.<br />

Il est à noter que toutes les informations du document <strong>XML</strong> ne sont pas représentées dans<br />

l’Infoset comme, par exemple, l’ordre <strong>de</strong>s attributs et les éléments <strong>XML</strong> vi<strong>de</strong>s. Le but d’Infoset est<br />

<strong>de</strong> représenter les informations généralement utiles à un analyseur <strong>XML</strong>. Le groupe s’occupant<br />

<strong>de</strong> la recommandation Infoset a donc jugé inutile <strong>de</strong> gar<strong>de</strong>r <strong>de</strong>s informations comme les éléments<br />

vi<strong>de</strong>s. Cependant, Infoset est <strong>de</strong>venu la <strong>base</strong> <strong>de</strong> plusieurs modèles <strong>de</strong> <strong>données</strong> plus sophistiqués<br />

utilisés par les processeurs <strong>XML</strong>.<br />

3.6.4 DOM<br />

Le DOM [17], Document Object Mo<strong>de</strong>l ou modèle objet <strong>de</strong> document <strong>XML</strong>, est fondamentalement<br />

différent d’Infoset. Infoset est un modèle <strong>de</strong> <strong>données</strong>, il définit <strong>une</strong> représentation abstraite<br />

<strong>de</strong>s <strong>données</strong> d’un document <strong>XML</strong>. DOM est plutôt <strong>une</strong> API, il définit <strong>une</strong> interface pour les <strong>données</strong><br />

et la structure d’un document <strong>XML</strong> afin qu’un programme puisse naviguer dans l’arbre et


3.6 Modélisation <strong>de</strong>s documents <strong>XML</strong> 25<br />

manipuler les informations contenues. Il est intéressant <strong>de</strong> constater que DOM est indépendant<br />

<strong>de</strong>s langages <strong>de</strong> programmation et <strong>de</strong>s plateformes.<br />

Le DOM a été défini par le W3C. La spécification DOM <strong>de</strong> niveau 1 définit un ensemble<br />

d’objets, dans le sens <strong>de</strong> la programmation orientée objet, qui peuvent représenter n’importe quel<br />

document structuré, comme un document <strong>XML</strong>. La spécification <strong>de</strong> niveau 2 ajoute le support<br />

<strong>de</strong>s dates et <strong>de</strong>s espaces <strong>de</strong>s noms. Le niveau 3 introduit <strong>de</strong>s possibilités <strong>de</strong> chargement et <strong>de</strong><br />

sauvegar<strong>de</strong>, ainsi que <strong>de</strong> validation.<br />

Le DOM est <strong>une</strong> API basée <strong>sur</strong> un arbre, par opposition aux API basées <strong>sur</strong> les événements<br />

comme SAX. DOM définit <strong>une</strong> hiérarchie <strong>de</strong>s nœuds. Cette hiérarchie, appelée DOM Structure<br />

Mo<strong>de</strong>l ou modèle <strong>de</strong> structure DOM, peut se voir comme un modèle <strong>de</strong> <strong>données</strong> pour <strong>de</strong>s<br />

documents <strong>XML</strong>.<br />

Le principal défaut <strong>de</strong> DOM en tant que modèle <strong>de</strong> <strong>données</strong> est qu’il ne stocke pas les types<br />

<strong>de</strong> <strong>données</strong>. Toutes les valeurs sont traitées comme <strong>de</strong>s <strong>données</strong> textuelles <strong>de</strong> type DOMString.<br />

Des versions propriétaires <strong>de</strong> DOM ont été créées, par Microsoft notamment, pour pallier à ce<br />

problème.<br />

DOM permet donc à un programme <strong>de</strong> manipuler le document <strong>XML</strong> en mémoire. Il donne<br />

accès aux informations contenues dans les éléments ou les attributs via un parcours d’arbre (où<br />

tous les axes <strong>de</strong> navigation classique sont permis) ou via le nom <strong>de</strong>s éléments ou <strong>de</strong>s attributs.<br />

Il est à noter que DOM utilise beaucoup <strong>de</strong> mémoire par rapport à un document <strong>XML</strong>. Par<br />

exemple, pour un document <strong>de</strong> 100Mo, l’image DOM en mémoire peut faire 400Mo. Les <strong>base</strong>s<br />

<strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s, par exemple, <strong>de</strong>vront y être attentives lors du stockage et <strong>de</strong> l’interrogation<br />

<strong>de</strong> documents <strong>XML</strong> conséquents. Ces <strong>de</strong>rniers points sont <strong>de</strong>s désavantages si l’on<br />

utilise DOM pour interroger un document <strong>XML</strong>, via XPath par exemple. Cela dit, DOM est<br />

un moyen très populaire d’accé<strong>de</strong>r et <strong>de</strong> manipuler un document <strong>XML</strong> en mémoire et beaucoup<br />

d’implémentations <strong>de</strong> moteurs <strong>de</strong> requêtes l’utilisent.<br />

3.6.5 Modèle <strong>de</strong> <strong>données</strong> XQuery<br />

Un modèle spécifique pour XPath et XQuery a été créé par le W3C [18]. Il s’agit d’un Infoset<br />

étendu pour XQuery, <strong>une</strong> représentation abstraite d’un document <strong>XML</strong> sous forme d’arbre ou<br />

<strong>de</strong> séquence spécialement conçu pour les besoins d’un moteur XQuery.<br />

En effet, le modèle <strong>de</strong> <strong>données</strong> Infoset n’était pas suffisant pour <strong>de</strong>ux raisons :<br />

1. Infoset ne gère pas les types <strong>de</strong> <strong>données</strong>. Un langage <strong>de</strong> requête raisonnable ne peut pas se<br />

passer <strong>de</strong> connaître les types <strong>de</strong>s <strong>données</strong> qu’il traite. En effet, cela poserait <strong>de</strong>s problèmes<br />

lors <strong>de</strong> comparaisons ou d’ordonnancements.<br />

2. Infoset ne peut représenter que <strong>de</strong>s documents <strong>XML</strong> bien formés. Or, XQuery a besoin <strong>de</strong><br />

pouvoir représenter un résultat intermédiaire, <strong>une</strong> valeur, <strong>une</strong> séquence <strong>de</strong> nœuds, . . . Ces<br />

types <strong>de</strong> <strong>données</strong> ne sont pas gérées par Infoset.<br />

Le modèle <strong>de</strong> <strong>données</strong> XQuery possè<strong>de</strong> six types <strong>de</strong> nœuds, chacun contenant un ensemble<br />

<strong>de</strong> propriétés et <strong>de</strong> caractéristiques, à l’image d’Infoset : élément <strong>XML</strong>, texte, attribut, espace<br />

<strong>de</strong> nom, instructions <strong>de</strong> traitement et commentaire.


3.7 Conclusions 26<br />

3.7 Conclusions<br />

Dans ce chapitre, nous avons décrit le langage <strong>XML</strong> et les outils <strong>de</strong> <strong>base</strong> qui lui sont associés.<br />

Nous avons vu que <strong>XML</strong> permet <strong>de</strong> décrire très facilement le mon<strong>de</strong> réel et avec plus <strong>une</strong> gran<strong>de</strong><br />

flexibilité que la représentation relationnelle.<br />

Dans le chapitre suivant, nous allons d’abord détailler les langages <strong>de</strong>stinés à interroger et<br />

extraire <strong>de</strong>s informations <strong>de</strong> ces documents <strong>XML</strong> Nous présenterons ensuite les différents types<br />

<strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> permettant <strong>de</strong> gérer <strong>de</strong>s documents <strong>XML</strong>.


Chapitre 4<br />

Les langages d’interrogation <strong>XML</strong><br />

Dans ce chapitre, nous allons présenter les différents langages d’interrogation pour <strong>XML</strong>.<br />

Nous nous attar<strong>de</strong>rons principalement <strong>sur</strong> XPath et XQuery que nous allons utiliser abondamment<br />

par la suite.<br />

Contenu<br />

4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />

4.2 XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />

4.3 XQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

4.4 Autres langages d’interrogation . . . . . . . . . . . . . . . . . . . . . . 37<br />

4.5 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />

4.1 Introduction<br />

Il existe différents types <strong>de</strong> langages afin d’interroger <strong>de</strong>s <strong>données</strong> <strong>XML</strong> :<br />

⊲ Les langages d’adressage : Ces langages permettent d’écrire <strong>de</strong>s requêtes afin <strong>de</strong> naviguer<br />

à l’intérieur d’un ensemble <strong>de</strong> <strong>données</strong>, à l’ai<strong>de</strong> d’expressions <strong>de</strong> chemin. Ces<br />

expressions <strong>de</strong> chemin sont souvent représentées <strong>de</strong> la même manière que dans les systèmes<br />

<strong>de</strong> fichiers UNIX. Le standard <strong>de</strong>s langages d’adressage est XPath [19] qui sert <strong>de</strong><br />

fondation pour les autres langages d’interrogation <strong>de</strong> documents <strong>XML</strong>.<br />

⊲ Les langages <strong>de</strong> transformations : Ces langages permettent <strong>de</strong> restructurer et <strong>de</strong><br />

reformater <strong>de</strong>s documents <strong>XML</strong> à l’ai<strong>de</strong> <strong>de</strong> règles. Le standard actuel est XSLT [20]. Il<br />

en existe d’autres comme par exemple CDuce [21].<br />

⊲ Les langages <strong>de</strong> requêtes : Ces langages permettent d’émettre <strong>de</strong>s requêtes complexes<br />

<strong>sur</strong> <strong>de</strong>s documents <strong>XML</strong>, comme SQL pour les <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles. XQuery<br />

[22] et Lorel [23] sont <strong>de</strong>s exemples <strong>de</strong> tels langages, le premier étant recommandé par le<br />

W3C.<br />

Par la suite, nous nous concentrerons <strong>sur</strong> les langages <strong>de</strong> requêtes et d’adressage et, tout<br />

particulièrement, <strong>sur</strong> XPath et XQuery.<br />

27


4.2 XPath 28<br />

4.2 XPath<br />

Le langage d’expression <strong>de</strong> chemin <strong>XML</strong>, XPath, a été publié comme recommandation par<br />

le W3C en 1999 [19]. Jim Melton en fait <strong>une</strong> <strong>de</strong>scription complète dans son livre Querying<br />

<strong>XML</strong> [24]. Selon sa spécification, XPath a été créé pour fournir <strong>une</strong> syntaxe comm<strong>une</strong> pour les<br />

fonctionnalités partagées entre XSLT et XPointer. Son but est <strong>de</strong> pouvoir adresser <strong>de</strong>s parties<br />

d’un document <strong>XML</strong>. Autrement dit, XPath permet <strong>de</strong> sélectionner un ensemble <strong>de</strong> nœuds <strong>de</strong><br />

l’arbre <strong>XML</strong> à l’ai<strong>de</strong> d’<strong>une</strong> expression <strong>de</strong> chemin.<br />

La notation choisie pour XPath ressemble délibérément à la notation utilisée pour parcourir<br />

les systèmes <strong>de</strong> fichiers <strong>de</strong> type UNIX et à celle utilisée dans les URL <strong>sur</strong> Internet. Une expression<br />

typique XPath ressemble à la suivante :<br />

/ clients / client [ @id ="1548"]/ nom<br />

Cette expression se lit très facilement, du moins pour ceux qui sont habitués à utiliser un système<br />

<strong>de</strong> fichier. Si nous ne tenons pas compte <strong>de</strong> l’expression entre crochets, cette expression permet <strong>de</strong><br />

sélectionner les éléments nom <strong>de</strong>s éléments client contenus dans l’élément clients. L’expression<br />

entre crochets est un filtre. Celui-ci est constitué d’un prédicat. Ce filtre permet <strong>de</strong> sélectionner le<br />

ou les élément(s) client dont l’attribut id est égal à 1548. Pour illustrer, observons les résultats<br />

<strong>de</strong> cette requête <strong>sur</strong> le document suivant :<br />

< clients ><br />

<br />

Marc Dupont <br />

1958 -03 -06 <br />

In<strong>de</strong>pendant <br />

<br />

<br />

Luc Dubois <br />

1967 -12 -20 <br />

<br />

<br />

Le résultat <strong>de</strong> notre requête sera donc Luc Dubois.<br />

Les expressions <strong>de</strong> chemin sont composées d’étapes. Les étapes sont représentées à l’ai<strong>de</strong> d’un<br />

axe, d’un nom d’élément et d’un prédicat éventuel. Les axes permettent <strong>de</strong> définir le sens <strong>de</strong><br />

parcours du document <strong>XML</strong>. XPath définit un grand nombre d’axes comme enfant, <strong>de</strong>scendant,<br />

parent, ancêtre, frère suivant, . . . Nous présenterons les principaux axes XPath plus loin dans<br />

ce chapitre, au point 4.2.1. Les noms d’éléments sont similaires aux noms <strong>de</strong> dossiers ou <strong>de</strong><br />

répertoires <strong>de</strong>s systèmes <strong>de</strong> fichiers. Ils permettent <strong>de</strong> définir les éléments <strong>XML</strong> par lesquels le<br />

chemin doit passer. Les prédicats sont <strong>de</strong>s expressions logiques relatives à un élément. Ils doivent<br />

être écrits entre crochets et permettent <strong>de</strong> filtrer les éléments lors du parcours.<br />

Les expressions XPath sont ainsi faites qu’il est très facile <strong>de</strong> les comprendre en les lisant.<br />

Nous ne nous attar<strong>de</strong>rons donc pas <strong>sur</strong> leur définition formelle. Cependant, certains concepts ne


4.2 XPath 29<br />

sont peut être pas évi<strong>de</strong>nts d’un premier abord. Nous allons donc les détailler dans la suite <strong>de</strong><br />

ce chapitre.<br />

XPath n’est pas exactement un langage <strong>de</strong> requêtes, car, bien qu’il permette <strong>de</strong> poser <strong>de</strong>s<br />

conditions et d’obtenir <strong>de</strong>s informations <strong>sur</strong> un document, il ne permet pas <strong>de</strong> changer, par<br />

exemple, la structure du document. Malgré cela, XPath est très utile et relativement simple à<br />

comprendre et à assimiler. Cela en fait le standard pour l’expression <strong>de</strong> chemin <strong>sur</strong> un arbre<br />

<strong>XML</strong>. Il est utilisé à la fois pour XSLT et pour XQuery, le langage <strong>de</strong> requêtes recommandé par<br />

le W3C.<br />

4.2.1 Les axes XPath<br />

Axes Ensemble <strong>de</strong> nœuds résultant<br />

parent Le premier nœud <strong>sur</strong> le chemin <strong>de</strong> u vers le nœud racine<br />

ancestor Tous les nœuds <strong>sur</strong> le chemin <strong>de</strong> u vers la racine<br />

ancestor-or-self u et tous les nœuds <strong>sur</strong> le chemin vers la racine<br />

child Les <strong>de</strong>scendants directs du nœud u<br />

<strong>de</strong>scendant Tous les nœuds dont u est l’ancêtre<br />

<strong>de</strong>scendant-or-self u et tous les nœuds dont u est l’ancêtre<br />

preceding Les nœuds précé<strong>de</strong>nts le nœud u (exceptés les ancêtres) dans l’ordre<br />

du document<br />

following Les nœuds suivants le nœud u (exceptés les <strong>de</strong>scendants) dans l’ordre<br />

du document<br />

preceding-sibling Les frères précé<strong>de</strong>nts du nœud u dans l’ordre du document<br />

following-sibling Les frères suivants du nœud u dans l’ordre du document<br />

attribute Les attributs du nœud u<br />

self u<br />

16 Tab. 4.1 – Sémantique Chapter <strong>de</strong>s1. axes Extensible XPath pour Mark-up le nœud u. Language (<strong>XML</strong>)<br />

2<br />

1<br />

3 4<br />

5<br />

0<br />

6<br />

7<br />

8 9<br />

2<br />

1<br />

3 4<br />

5<br />

0<br />

6<br />

7<br />

8 9<br />

2<br />

1<br />

3 4<br />

(a) (b) (c)<br />

5<br />

0<br />

6<br />

7<br />

8 9<br />

Fig. 4.1 – Sémantique <strong>de</strong>s axes XPath : (a) parent : :*, (b) ancestor : :* et (c) ancestor-<br />

Fig. or-self 1.3. : :* XPath à partir semantics: du nœud 7. signposted no<strong>de</strong>s are no<strong>de</strong>s of the result forest if an<br />

(a) parent::*, (b) ancestor::*, and (c) ancestor-or-self::* step is taken from context<br />

no<strong>de</strong>XPath 7. définit <strong>une</strong> famille <strong>de</strong> 13 axes. Un axe est un type <strong>de</strong> relation qu’un élément du document<br />

<strong>XML</strong> entretient avec les autres éléments. Les axes les plus courants sont l’axe « enfant »<br />

0<br />

0<br />

0<br />

(child) et l’axe « <strong>de</strong>scendant ou soi » (<strong>de</strong>scedant-or-self ). Ces <strong>de</strong>ux axes peuvent être abrégés res-<br />

1<br />

6<br />

1<br />

6<br />

1<br />

6<br />

pectivement grâce aux symboles / et //. Ainsi, les <strong>de</strong>ux expressions suivantes sont équivalentes.<br />

2<br />

3 4<br />

5<br />

7<br />

8 9<br />

2<br />

3 4<br />

5<br />

7<br />

8 9<br />

2<br />

3 4<br />

(a) (b) (c)<br />

5<br />

7<br />

8 9<br />

Fig. 1.4. XPath semantics: signposted no<strong>de</strong>s are no<strong>de</strong>s of the result forest if an


(a) (b) (c)<br />

Fig. 1.3. XPath semantics: signposted no<strong>de</strong>s are no<strong>de</strong>s of the result forest if an<br />

(a) 4.2parent::*, XPath (b) ancestor::*, and (c) ancestor-or-self::* step is taken from context 30<br />

no<strong>de</strong> 7.<br />

2<br />

1<br />

3 4<br />

5<br />

0<br />

6<br />

7<br />

8 9<br />

2<br />

1<br />

3 4<br />

5<br />

0<br />

6<br />

7<br />

8 9<br />

2<br />

1<br />

3 4<br />

5<br />

0<br />

6<br />

7<br />

8 9<br />

(a) (b) (c)<br />

1.5. Another <strong>XML</strong> Technologies 17<br />

Fig.<br />

1.5.<br />

4.2<br />

Another<br />

– Sémantique<br />

<strong>XML</strong> Technologies<br />

<strong>de</strong>s axes XPath : (a) child : :*, (b) <strong>de</strong>scendant : :*<br />

17<br />

et (c)<br />

Fig. <strong>de</strong>scendant-or-self 1.4. XPath semantics: : : à 0partirsignposted<br />

du nœud 1. no<strong>de</strong>s are no<strong>de</strong>s of the result forest if an<br />

0<br />

(a) child::*, (b) <strong>de</strong>scendant::*, 1<br />

6 and (c) <strong>de</strong>scendant-or-self::* 1<br />

6 step is taken from<br />

context no<strong>de</strong> 1.<br />

0<br />

0<br />

1.4.2 XQuery2<br />

2<br />

3 4<br />

The XQuery [80] is a hopeful <strong>XML</strong> query language today. A subset of the XPath is a<br />

part of the XQuery but more (a) complex constructs are put into the (b) language. Therefore, the<br />

XQuery Fig. is1.5. said to XPath be too semantics: complex. signposted no<strong>de</strong>s are no<strong>de</strong>s of the result forest if an<br />

Fig. (a) 4.3 preceding::* – Sémantique and <strong>de</strong>s axes (b) following::* XPath : (a) preceding step is taken : :*, from(b) context following no<strong>de</strong> : 6 and :* à1, partir re- du<br />

Fig. 1.5. XPath semantics: signposted no<strong>de</strong>s are no<strong>de</strong>s of the result forest if an<br />

Example nœud spectively. 6 et 11.9 respectivement.<br />

(XQuery queries).<br />

(a) preceding::* and (b) following::* step is taken from context no<strong>de</strong> 6 and 1, respectively.<br />

0<br />

In Listing 1.6 three XQuery queries are shown.<br />

0<br />

1. doc(’books.xml’)/books/book[price50<br />

Fig. or<strong>de</strong>r 4.4 by – $x/name Sémantique <strong>de</strong>s (a) axes XPath : (a) preceding-sibling (b) : :*, (b) followingsibling<br />

return Fig. $x/name : 1.6. :* àXPath partir du semantics: nœud 6 et signposted 2 respectivement. no<strong>de</strong>s are no<strong>de</strong>s of the result forest if an<br />

(a) preceding-sibling::* and (b) following-sibling::* step is taken from context<br />

3. no<strong>de</strong> Fig. 61.6. and 2, XPath respectively. semantics: signposted no<strong>de</strong>s are no<strong>de</strong>s of the result forest if an<br />

La { première (a) preceding-sibling::* est réduite, l’autre est and complète (b) following-sibling::* :<br />

step is taken from context<br />

no<strong>de</strong> for $b 6 and in doc(’books.xml’)/books/book,<br />

2, respectively.<br />

/ clients / client $n in $b/name, [ @id ="1548"]/ nom<br />

/ child :: clients $a in $b/author / child :: client [ @id ="1548"]/ child :: nom<br />

return $n in $b/name,<br />

<br />

D’autres raccourcis $a in $b/author sont fournis par XPath, par exemple,<br />

return { $n }<br />

⊲ l’expression { $a } ./ décrit le nœud contexte.<br />

{ $n }<br />

⊲ l’expression } { $a ../ } indique le nœud parent.<br />

<br />

⊲ l’expression // dénote le nœud racine, mais pour <strong>une</strong> expression <strong>de</strong> type a//b, cette<br />

}<br />

expression dénote n’importe quel nœud b <strong>de</strong>scendant du nœud a.<br />

1.5 Another <strong>XML</strong> Technologies<br />

6<br />

1<br />

3<br />

2<br />

4<br />

3 2 4<br />

5<br />

5<br />

0<br />

7<br />

6<br />

8<br />

7<br />

9<br />

8 9<br />

76<br />

8 7 9<br />

Le tableau 4.1 liste les axes XPath et explique brièvement leur sémantique. Les figures 4.1,<br />

4.2, 1.5 4.3 et 4.4 Another illustrent la sémantique <strong>XML</strong> Technologies<br />

<strong>de</strong>s principaux axes XPath.<br />

There are a lot of technologies related to the <strong>XML</strong>. Due to the fact that this book is aimed<br />

only to in<strong>de</strong>xing <strong>XML</strong> data some of them are briefly <strong>de</strong>scribed. SOAP [91] is the Simple<br />

Object There are Access a lotProtocol of technologies used forrelated invoketo co<strong>de</strong> theoffered <strong>XML</strong>. by Due Web to the services fact that overthis the Internet book is aimed using<br />

<strong>XML</strong> only to and in<strong>de</strong>xing HTTP. <strong>XML</strong> data some of them are briefly <strong>de</strong>scribed. SOAP [91] is the Simple<br />

Object Access Protocol used for invoke co<strong>de</strong> offered by Web services over the Internet using<br />

<strong>XML</strong> and HTTP.<br />

2<br />

1<br />

5<br />

6


4.3 XQuery 31<br />

4.3 XQuery<br />

4.3.1 Introduction<br />

En 1998, le W3C a commencé à étudier un langage <strong>de</strong> requêtes pour <strong>XML</strong>. Un groupe <strong>de</strong><br />

travail a ainsi été constitué et <strong>une</strong> étu<strong>de</strong> comparative <strong>de</strong> nombreux langages a été faite [25].<br />

Celle-ci a mis en évi<strong>de</strong>nce l’importance <strong>de</strong> décomposer <strong>une</strong> requête en trois parties :<br />

⊲ un motif qui associe <strong>de</strong>s variables à <strong>de</strong>s portions <strong>de</strong> documents,<br />

⊲ un filtre optionnel qui sélectionne <strong>une</strong> partie <strong>de</strong>s résultats obtenus grâce au motif et<br />

⊲ un constructeur qui définit la structure <strong>de</strong> chaque résultat <strong>de</strong> la requête.<br />

Un peu plus tard, un document du W3C [26] posera le cadre du futur XQuery. Les objectifs<br />

principaux y sont décrits et <strong>une</strong> notion importante y est définie : les requêtes <strong>de</strong>vront pouvoir<br />

porter <strong>sur</strong> un simple document <strong>XML</strong> ou <strong>sur</strong> <strong>une</strong> collection <strong>de</strong> documents. Elles <strong>de</strong>vront pouvoir<br />

sélectionner <strong>de</strong>s documents entiers ou ne gar<strong>de</strong>r que <strong>de</strong>s sous-arbres qui remplissent certaines<br />

conditions <strong>de</strong> contenu ou <strong>de</strong> structure.<br />

Les objectifs principaux repris dans ce document sont les suivants :<br />

⊲ l’importance <strong>de</strong> la déclarativité pour <strong>une</strong> requête, avec le découpage <strong>de</strong> la requête en<br />

trois parties,<br />

⊲ la possibilité <strong>de</strong> porter <strong>une</strong> condition <strong>sur</strong> du texte,<br />

⊲ la présence <strong>de</strong> quantificateurs existentiels et universels (ce qui manque cruellement à<br />

SQL),<br />

⊲ la combinaison d’informations <strong>de</strong> différentes parties d’un ou <strong>de</strong> plusieurs documents,<br />

⊲ l’agrégation d’informations à partir <strong>de</strong> documents proches,<br />

⊲ le tri <strong>sur</strong> les éléments,<br />

⊲ l’imbrication <strong>de</strong> requêtes (nesting),<br />

⊲ et l’opération <strong>sur</strong> les noms <strong>de</strong>s éléments <strong>XML</strong>.<br />

XQuery [22] est donc né à partir <strong>de</strong> ces recommandations et objectifs. Le langage a été conçu<br />

pour permettre <strong>de</strong>s requêtes précises et facilement compréhensibles. Il introduit un type <strong>de</strong> requête<br />

nouveau, basé <strong>sur</strong> <strong>de</strong>s expressions FLWR (prononcez flower) comparables aux expressions<br />

select-from-where <strong>de</strong> SQL. XQuery est un langage basé <strong>sur</strong> Quilt [27] et emprunte <strong>de</strong> nombreuses<br />

idées à XQL [28], <strong>XML</strong>-QL [29], SQL et OQL [30].<br />

XQuery est un langage fonctionnel dont chaque requête est <strong>une</strong> expression <strong>de</strong> différents types<br />

comme <strong>de</strong>s expressions <strong>de</strong> chemin, <strong>de</strong>s expressions FLWR, <strong>de</strong>s expressions conditionnelles ou<br />

<strong>de</strong>s fonctions. Les expressions <strong>de</strong> chemin sont basées <strong>sur</strong> la syntaxe XPath. La recommandation<br />

XPath 2.0 est entièrement liée à XQuery.


4.3 XQuery 32<br />

4.3.2 Expressions FLWR<br />

La caractéristique principale <strong>de</strong> XQuery est qu’il utilise <strong>de</strong>s expressions FLWR pour l’écriture<br />

<strong>de</strong> requêtes. Son nom vient <strong>de</strong>s 4 clauses principales suivantes :<br />

⊲ for : mécanisme d’itération <strong>sur</strong> un ensemble <strong>de</strong> nœuds.<br />

⊲ let : permet l’assignation <strong>de</strong> variables.<br />

⊲ where : les clauses for et let génèrent un ensemble <strong>de</strong> nœuds <strong>XML</strong> qui peuvent être<br />

filtrés par <strong>de</strong>s prédicats <strong>de</strong> la clause where.<br />

⊲ return : construit le résultat pour chaque nœud vérifiant la clause where.<br />

Une expression FLWR peut se comparer à <strong>une</strong> expression type SQL select-from-where<br />

mais leurs fonctionnements respectifs sont assez différents. En effet, le principe est inversé d’un<br />

type d’expression à l’autre. Par exemple, en SQL, la construction <strong>de</strong>s résultats se fait à l’ai<strong>de</strong><br />

<strong>de</strong> la clause select, au début <strong>de</strong> la requête. Tandis qu’en XQuery, elle se fait à l’ai<strong>de</strong> <strong>de</strong> la<br />

clause return en fin <strong>de</strong> requête. Le fonctionnement et la syntaxe principale <strong>de</strong> ces expressions<br />

est illustré à la figure 4.5 et 4.6.<br />

clause for<br />

clause let clause where clause or<strong>de</strong>r by<br />

Fig. 4.5 – Expression FLWR.<br />

for et let<br />

where<br />

or<strong>de</strong>r by<br />

return<br />

Liste <strong>de</strong> tuples et variables<br />

Tuples et variables filtrés<br />

Tuples ordonnés<br />

Résultats <strong>XML</strong> (arbre <strong>de</strong> tuples)<br />

clause return<br />

Fig. 4.6 – Représentation schématique du fonctionnement d’<strong>une</strong> expression FLWR.


4.3 XQuery 33<br />

A titre d’illustration, observons la requête FLWR suivante qui liste les noms <strong>de</strong> tous les<br />

clients ayant acheté au moins <strong>de</strong>ux produits :<br />

<br />

for $client in // client<br />

let $produits := // comman<strong>de</strong> [ client = $client / @id ]// article<br />

where count ( $produits ) >= 2<br />

return<br />

{ $client / nom / text () }<br />

<br />

La clause for permet d’itérer <strong>sur</strong> tous les clients du fichier. Pour chaque client, la clause let va<br />

sélectionner la liste <strong>de</strong> tous les produits achetés par ce client. C’est ici qu’a lieu la jointure, grâce<br />

à un prédicat <strong>sur</strong> les comman<strong>de</strong>s. En effet, on ne sélectionne que les comman<strong>de</strong>s relatives au<br />

client courant, retenu par la clause for. Ensuite, la clause where filtre les résultats, en appliquant<br />

la fonction d’agrégation count() <strong>sur</strong> les résultats <strong>de</strong> la clause let. Pour finir, on construit le<br />

résultat à l’ai<strong>de</strong> <strong>de</strong> la clause return.<br />

4.3.3 Quantificateurs<br />

Tout comme SQL, XQuery possè<strong>de</strong> un quantificateur existentiel : some. XQuery définit aussi<br />

un quantificateur universel every. Ce quantificateur manque cruellement à SQL. Lors <strong>de</strong>s cours<br />

<strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> suivis pendant mon cursus universitaire [31], <strong>de</strong> nombreux exemples <strong>de</strong> cette<br />

limitation ont été abordés. En effet, comme il n’y a pas <strong>de</strong> quantificateur universel dans SQL,<br />

il était nécessaire <strong>de</strong> s’ai<strong>de</strong>r <strong>de</strong> la logique pour transformer les requêtes universelles en requêtes<br />

utilisant <strong>de</strong>s quantificateurs existentiels niés. Cela rend ces requêtes SQL particulièrement difficiles<br />

à lire et à comprendre et donc compliquées à maintenir. Un tel quantificateur universel est<br />

donc plus que bienvenu dans XQuery. La syntaxe <strong>de</strong> ces quantificateurs est illustrée à la figure<br />

4.7.<br />

Fig. 4.7 – Fonctionnement <strong>de</strong>s quantificateurs XQuery.<br />

4.3.4 Opérateurs <strong>de</strong> comparaison d’ordre<br />

Comme nous l’avons vu précé<strong>de</strong>mment au point 3.6.1, l’ordre d’un document <strong>XML</strong> peut être<br />

<strong>de</strong> la plus gran<strong>de</strong> importance. Le groupe <strong>de</strong> travail autour d’XQuery a pris en compte ce constat<br />

et XQuery fournit donc <strong>de</strong>s opérateurs supplémentaires permettant <strong>de</strong> tester si un élément est<br />

situé après ou avant dans l’ordre du document <strong>XML</strong>. Ces <strong>de</strong>ux opérateurs sont < < et > > et<br />

signifient respectivement avant et après.


4.3 XQuery 34<br />

Pour illustrer la nécessité <strong>de</strong> tels opérateurs <strong>de</strong> comparaison, considérons un document <strong>XML</strong><br />

traitant <strong>de</strong> la cardiologie. Cet exemple est repris <strong>de</strong> [32]. Ce document contient diverses informations<br />

comme <strong>de</strong>s diagnostics, <strong>de</strong>s stratégies <strong>de</strong> traitement et <strong>de</strong>s procédures médicales détaillées.<br />

Il peut être intéressant d’utiliser XQuery pour trouver <strong>de</strong>s cas d’exceptions comme, par exemple,<br />

<strong>une</strong> procédure médicale dans laquelle la première incision est faite avant d’administrer un anesthésiant<br />

au patient.<br />

Il est à noter que l’ordre du document n’a rien à voir avec la clause or<strong>de</strong>r by disponible<br />

également. Cette <strong>de</strong>rnière trie les résultats dans un ordre alphabétique ou numérique <strong>sur</strong> <strong>base</strong><br />

d’un ou plusieurs paramètres. Elle a le même comportement que son équivalent SQL.<br />

4.3.5 Fonctions<br />

XQuery permet <strong>de</strong> définir et d’utiliser <strong>de</strong>s fonctions. Le prototype <strong>de</strong> <strong>base</strong> d’<strong>une</strong> fonction est<br />

illustré à la figure 4.8.<br />

Fig. 4.8 – Prototype d’<strong>une</strong> fonction en XQuery.<br />

Les fonctions XQuery doivent respecter certaines règles comme le fait que tous les types<br />

utilisés doivent l’être fortement, qu’ils soient <strong>de</strong>s types d’arguments ou le type <strong>de</strong> sortie. Les<br />

fonctions peuvent s’appeller elles-mêmes ou en appeller d’autres.<br />

4.3.6 Traitement<br />

Il faut différencier <strong>de</strong>ux gran<strong>de</strong>s familles <strong>de</strong> traitement <strong>de</strong>s requêtes XQuery : traitement en<br />

flux ou traitement basé <strong>sur</strong> les in<strong>de</strong>xes.<br />

Dans le premier cas, le moteur XQuery ne connaît pas les <strong>données</strong> <strong>sur</strong> lesquelles il doit<br />

exécuter la requête. Le document <strong>XML</strong> à interroger arrive comme un flot (stream) dans le<br />

moteur <strong>de</strong> requête. Le document est donc lu séquentiellement par le moteur <strong>de</strong> requête et ne<br />

peut être lu qu’<strong>une</strong> seule fois.<br />

Dans le <strong>de</strong>uxième cas, les documents <strong>sur</strong> lesquels porte la requête XQuery sont connus et<br />

in<strong>de</strong>xés. Le traitement <strong>de</strong> la requête sera donc différent, puisqu’<strong>une</strong> bonne partie <strong>de</strong>s informations<br />

– comme la structure du document – est déjà connue et qu’il ne faut pas lire les documents <strong>XML</strong><br />

séquentiellement parce que ceux-ci sont déjà été in<strong>de</strong>xés.<br />

Le traitement <strong>de</strong>s requêtes sera donc totalement différent dans les <strong>de</strong>ux cas <strong>de</strong> figure.


4.3 XQuery 35<br />

4.3.7 Limitations<br />

De nombreuses discussions à propos d’XQuery dans <strong>de</strong>s articles scientifiques [33, 34, 35, 36],<br />

dans les listes <strong>de</strong> discussions et <strong>de</strong>s livres [24] mettent en évi<strong>de</strong>nce les limitations d’XQuery et<br />

proposent <strong>de</strong>s solutions.<br />

XQueryX<br />

Pour commencer, XQuery, bien qu’il soit un langage d’interrogation pour <strong>XML</strong>, ne respecte<br />

pas la syntaxe <strong>XML</strong>. XQueryX [35] a donc été proposé. XQueryX est <strong>une</strong> syntaxe alter<strong>native</strong><br />

pour XQuery, où <strong>une</strong> requête est représentée comme un document <strong>XML</strong> bien formé. XQueryX<br />

a été développé pour répondre au sentiment d’<strong>une</strong> partie <strong>de</strong>s personnes du mon<strong>de</strong> <strong>XML</strong> :<br />

« <strong>XML</strong> est <strong>une</strong> bonne façon <strong>de</strong> représenter <strong>de</strong>s choses, et par conséquent, chaque<br />

chose <strong>de</strong>vrait être représentée en <strong>XML</strong> »<br />

Par exemple, un <strong>de</strong>s avantages <strong>de</strong> <strong>XML</strong> Schéma par rapport aux DTD est qu’un Schéma<br />

<strong>XML</strong> est un document <strong>XML</strong> tandis qu’<strong>une</strong> DTD ne l’est pas. Les avantages principaux <strong>de</strong> la<br />

représentation <strong>XML</strong> <strong>de</strong> XQuery sont les suivants :<br />

⊲ vali<strong>de</strong>r les requêtes XQueryX à l’ai<strong>de</strong> d’un Schéma <strong>XML</strong>.<br />

⊲ créer <strong>de</strong>s requêtes à l’ai<strong>de</strong> d’un outil graphique <strong>XML</strong> existant.<br />

⊲ sauvegar<strong>de</strong>r les requêtes <strong>de</strong> la même manière que les autres documents <strong>XML</strong>.<br />

⊲ transférer <strong>de</strong>s requêtes via un protocole comme SOAP.<br />

⊲ interroger les requêtes XQueryX à l’ai<strong>de</strong> XPath ou d’XQuery.<br />

⊲ intégrer <strong>de</strong>s requêtes dans un document <strong>XML</strong>.<br />

Un défaut d’XQueryX est qu’il est plus difficile à lire par <strong>une</strong> personne et plus verbeux<br />

que XQuery, nous en verrons un exemple plus loin. Un argument en réponse à cela est que<br />

<strong>de</strong> moins en moins <strong>de</strong> personnes introduisent leurs requêtes manuellement. Il utilisent plutôt<br />

<strong>de</strong>s applications graphiques ou écrivent <strong>de</strong>s programmes pour les ai<strong>de</strong>r à rédiger leurs requêtes.<br />

Cet argument n’est pas partagé par toute la communauté <strong>XML</strong>. Néanmoins, la traduction d’un<br />

type vers un autre est très facile et bien documentée. Les <strong>de</strong>ux représentations <strong>de</strong>vraient donc<br />

exister en parallèle, chac<strong>une</strong> adaptée à certains types d’utilisation. Pour illustrer cela, observons<br />

la différence entre les <strong>de</strong>ux requêtes suivantes, empruntées au W3C, la première en XQuery et<br />

la secon<strong>de</strong> en XQueryX.<br />

for $b in document (" bib . xml ") // book<br />

where $b/ publisher = " Morgan Kaufmann "<br />

and $b/ year = "1998"<br />

return $b/ title<br />

<br />

< q:forAssignment variable ="$b"><br />

<br />

< q:function name =" document "><br />

< q:constant datatype =" charstring ">


4.3 XQuery 36<br />

bib . xml<br />

<br />

<br />

< q:i<strong>de</strong>ntifier ><br />

book<br />

<br />

<br />

<br />

< q:where >... <br />

< q:return >... <br />

<br />

Recherche textuelle<br />

XPath et XQuery ne disposent pas d’opérateurs et <strong>de</strong> fonctions adaptées à la recherche<br />

textuelle (full-text query) dans un document <strong>XML</strong>. Par exemple, il n’existe ni <strong>de</strong> fonction <strong>de</strong><br />

recherche insensible à la casse, ni <strong>de</strong> fonction <strong>de</strong> recherche <strong>de</strong> texte à la structure du document.<br />

Or, <strong>XML</strong> étant énormément utilisé dans les sites Web, <strong>de</strong> telles fonctionnalités seraient les<br />

bienvenues pour fabriquer aisément un moteur <strong>de</strong> recherche efficace.<br />

eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>, implémente <strong>une</strong> série d’opérateurs et d’in<strong>de</strong>xes pour<br />

pallier à ce manque. Nous en parlerons en détail au point 5.4 consacré à eXist.<br />

Mise à jour<br />

Un autre manque <strong>de</strong> XQuery est qu’il ne possè<strong>de</strong> pas d’opérateur permettant d’ajouter <strong>de</strong>s<br />

<strong>données</strong> ou <strong>de</strong> les mettre à jour. XQuery permet uniquement <strong>de</strong> consulter <strong>de</strong>s informations sans<br />

pouvoir les modifier. Dans le contexte <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong>, il s’agit d’un défaut important. Par<br />

contre, pour les processeurs XQuery qui travaillent en lecture séquentielle, cela ne pose pas <strong>de</strong><br />

problème car leur but n’est jamais <strong>de</strong> modifier les <strong>données</strong> sources.<br />

Les moteurs commerciaux qui ont implémenté XQuery proposent <strong>de</strong>s extensions permettant<br />

d’éviter ce problème, mais rien n’est standardisé. <strong>XML</strong>:DB 1 , la communauté du logiciel libre<br />

autour <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong>, propose un langage <strong>de</strong> mise à jour : XUpdate [37]. Celui ci<br />

est implémenté dans eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> dont nous reparlerons.<br />

Groupement<br />

Dans le domaine <strong>de</strong> l’analyse <strong>de</strong> <strong>données</strong> (<strong>OLAP</strong>), les groupements <strong>de</strong> <strong>données</strong> en fonction<br />

<strong>de</strong> la valeur d’un ou plusieurs <strong>de</strong> leurs attributs sont très fréquents. C’est d’ailleurs l’opération la<br />

plus utilisée dans ce domaine. Par exemple, le dirigeant d’<strong>une</strong> entreprise peut avoir besoin d’un<br />

tableau représentant son chiffre d’affaires par région du pays, par magasin et par couleur pour<br />

les chaus<strong>sur</strong>es qu’il vend. Il pourra ainsi prévoir la quantité <strong>de</strong> chaus<strong>sur</strong>es vertes à stocker dans<br />

1 http://xmldb-org.sourceforge.net


4.4 Autres langages d’interrogation 37<br />

son magasin <strong>de</strong> Liège pour les mois suivants. En SQL, le mot clé GROUP BY existe et permet <strong>de</strong><br />

faire ce genre <strong>de</strong> requêtes. Des extensions sont disponibles comme ROLLUP et CUBE. Ces mots clés<br />

permettent <strong>de</strong> grouper <strong>de</strong>s tuples selon plusieurs critères et ai<strong>de</strong>nt à ce que les requêtes soient<br />

plus facilement lisibles.<br />

XQuery ne possè<strong>de</strong> pas un tel opérateur <strong>de</strong> groupement. Les groupements sont possibles<br />

grâce à <strong>une</strong> combinaison <strong>de</strong> fonctions distinct-values() mais les requêtes sont difficiles à<br />

écrire et à lire. Elles peuvent aussi être compliquées à utiliser. Plusieurs étu<strong>de</strong>s [36, 38, 39, 40]<br />

ont été faites <strong>sur</strong> la nécessité d’ajouter <strong>une</strong> clause group by au squelette <strong>de</strong>s expressions FLWR<br />

d’XQuery. Nous en reparlerons plus loin dans le chapitre 7 entièrement consacré à ce problème.<br />

4.4 Autres langages d’interrogation<br />

4.4.1 XSLT<br />

XSLT, Extensible Stylesheet Language Transformations est un langage <strong>de</strong> transformation <strong>de</strong><br />

documents <strong>XML</strong>. Il permet <strong>de</strong> transformer un document <strong>XML</strong> d’un certain type, comme <strong>une</strong><br />

page XHTML en un document <strong>XML</strong> d’un autre type, comme un document PDF. La syntaxe<br />

XSLT respecte la syntaxe <strong>XML</strong>. Une requête XSLT sera donc un document <strong>XML</strong> bien formé.<br />

Ce langage a été créé en 1999 par le W3C [20]. Il utilise les expressions <strong>de</strong> chemin XPath.<br />

Le langage XSLT est un langage déclaratif. Une requête XSLT, ou plutôt <strong>une</strong> feuille <strong>de</strong> style<br />

(stylesheet) XSLT, consiste en un ensemble <strong>de</strong> règles spécifiant ce qu’il faut ajouter à l’arbre <strong>de</strong><br />

sortie quand le processeur XSLT trouve un nœud qui rencontre les conditions <strong>de</strong> la règle.<br />

XSLT est le langage <strong>de</strong> transformation <strong>XML</strong> le plus répandu à l’heure actuelle. Le site du<br />

Service Informatique et Réseaux <strong>de</strong> l’Ecole Polytechnique <strong>de</strong> l’ULB 2 l’utilisait pour générer les<br />

pages relatives à son catalogue <strong>de</strong> publications. De nombreuses implémentations <strong>de</strong> processeurs<br />

XSLT existent. Citons SAXON (saxon.sourceforge.net) <strong>de</strong> Michael Kay, <strong>une</strong> personne éminente<br />

dans le domaine <strong>de</strong>s langages <strong>XML</strong>. Son processeur SAXON est souvent cité comme la<br />

référence en la matière.<br />

Ce langage ne nous intéresse pas dans le domaine <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> car son mo<strong>de</strong> <strong>de</strong><br />

traitement est séquentiel. Il n’est pas fait pour utiliser <strong>de</strong>s <strong>données</strong> in<strong>de</strong>xées, ce qui le rend moins<br />

performant pour traiter un grand nombre <strong>de</strong> <strong>données</strong>. XSLT a été étudié pour transformer <strong>de</strong>s<br />

documents, comme par exemple proposer <strong>une</strong> fonctionnalité <strong>de</strong> transformation en PDF <strong>de</strong>s pages<br />

XHTML d’un site Web.<br />

Comparaison entre XSLT et XQuery<br />

Une comparaison entre XQuery et XSLT [41] montre <strong>une</strong> zone <strong>de</strong> recouvrement entre les<br />

fonctionnalités fournies par les <strong>de</strong>ux langages. L’article montre que les use cases <strong>de</strong> XQuery [42]<br />

peuvent se réécrire sans problèmes en XSLT. Une gran<strong>de</strong> partie <strong>de</strong> ce recouvrement vient du<br />

fait que XPath est utilisé dans les <strong>de</strong>ux langages.<br />

2 http://cs.ulb.ac.be


4.4 Autres langages d’interrogation 38<br />

L’avantage principal d’XQuery rési<strong>de</strong> en sa facilité d’utilisation et <strong>de</strong> compréhension, dans<br />

son typage fort <strong>de</strong>s <strong>données</strong> et sa capacité d’optimisation. En effet, les expressions FLWR sont<br />

faciles à lire et à écrire. Les différentes clauses sont bien séparées, comme en SQL. En XSLT, les<br />

règles tiennent en <strong>une</strong> seule ligne, les conditions étant mélangées avec l’expression, ce qui les rend<br />

difficiles à lire et à comprendre. XQuery utilise un typage fort <strong>de</strong>s <strong>données</strong>, ce qui permet d’avoir<br />

<strong>une</strong> programmation plus sûre, les erreurs <strong>de</strong> type étant détectées au moment <strong>de</strong> la compilation<br />

<strong>de</strong> la requête. Pour finir, <strong>de</strong> par la séparation <strong>de</strong>s clauses <strong>de</strong>s expressions FLWR, XQuery peut<br />

bénéficier d’optimisations physiques, logiques ou <strong>de</strong> réécritures comme celles proposées dans [43].<br />

4.4.2 Lorel<br />

Lorel [23] a été conçu comme un langage <strong>de</strong> requêtes pour <strong>de</strong>s <strong>données</strong> semi-structurées, puis<br />

a été étendu pour <strong>XML</strong>. Il est inspiré <strong>de</strong> SQL et <strong>de</strong> OQL. La syntaxe <strong>de</strong> <strong>base</strong> d’<strong>une</strong> requête<br />

Lorel est <strong>une</strong> expression <strong>de</strong> la forme :<br />

select constructeur<br />

from motif<br />

where filtre<br />

Un motif définit <strong>une</strong> relation en associant <strong>de</strong>s variables à <strong>de</strong>s sous-ensembles, comme en<br />

OQL, le langage <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> objets. Le constructeur crée un nouvel objet complexe<br />

pour chaque tuple <strong>de</strong> cette relation. La clause where est classique, il s’agit d’un filtre.<br />

Cette syntaxe est plus déclarative que le FLWR <strong>de</strong> XQuery mais reste assez verbeuse. Lorel<br />

dispose d’expressions <strong>de</strong> chemin très puissantes (dans un graphe ou dans un arbre <strong>XML</strong>) mais<br />

n’est pas typé et repose <strong>sur</strong> <strong>une</strong> utilisation intensive <strong>de</strong> règles <strong>de</strong> conversion.<br />

4.4.3 CDuce<br />

CDuce est un langage fonctionnel pour la transformation <strong>de</strong> structures. Il est orienté <strong>XML</strong>,<br />

centré <strong>sur</strong> les types et basé <strong>sur</strong> le filtrage par expressions régulières. Il est issu d’<strong>une</strong> thèse <strong>de</strong><br />

l’ENS <strong>de</strong> Paris en 2003. CDuce [21] est élaboré <strong>sur</strong> <strong>base</strong> <strong>de</strong> XDuce (prononcez transduce), un<br />

langage fonctionnel pour la manipulation <strong>de</strong> structures <strong>XML</strong>.<br />

La particularité principale <strong>de</strong> CDuce est l’accent mis <strong>sur</strong> les types. En effet, les types sont<br />

utilisés partout : dans la validation <strong>de</strong>s requêtes, dans la sémantique <strong>de</strong>s fonctions et dans la<br />

compilation, qui est dirigée et optimisée selon les types, un peu comme XQuery.<br />

A l’heure actuelle, CDuce est encore un outil d’expérimentation et n’est pas totalement<br />

opérationnel.<br />

4.4.4 SQL/<strong>XML</strong><br />

SQL/<strong>XML</strong> [44] n’est pas, à proprement parlé, un langage d’interrogation <strong>XML</strong>. Il s’agit<br />

principalement d’extensions et <strong>de</strong> fonctions pour SQL <strong>de</strong>stinées à traiter <strong>de</strong>s documents <strong>XML</strong>


4.5 Conclusions 39<br />

ou à produire <strong>de</strong>s résultats sous forme <strong>de</strong> documents <strong>XML</strong>. Ce langage a été développé principalement<br />

par Microsoft et Oracle pour répondre aux <strong>de</strong>man<strong>de</strong>s <strong>de</strong> leurs clients à propos <strong>de</strong><br />

<strong>XML</strong>. SQL/<strong>XML</strong> permet également d’utiliser <strong>de</strong>s expressions XQuery <strong>sur</strong> <strong>de</strong>s documents <strong>XML</strong><br />

convertis en tables relationnelles. A titre d’illustration, <strong>une</strong> requête XQuery encapsulée dans <strong>une</strong><br />

requête SQL/<strong>XML</strong> est présentée ci-<strong>de</strong>ssous :<br />

SELECT <strong>XML</strong>QUERY (<br />

’for $m in $col / comman<strong>de</strong><br />

where $m/ client / continent = ’EUROPE ’<br />

return $m/ client /nom ’<br />

PASSING comman<strong>de</strong> AS ’COL ’<br />

RETURNING CONTENT NULL ON EMPTY<br />

) AS result FROM COMMANDES_<strong>XML</strong><br />

COMMANDES_<strong>XML</strong> est <strong>une</strong> table relationnelle dans laquelle chaque ligne représente <strong>une</strong> comman<strong>de</strong><br />

dans son format <strong>XML</strong>. Les résultats <strong>de</strong> cette requête sont les suivants :<br />

Paul Dupond <br />

Louis Dubois <br />

...<br />

Ce langage ne nous intéresse pas dans le cadre <strong>de</strong> ce mémoire, car il est basé <strong>sur</strong> <strong>de</strong>s techniques<br />

relationnelles alors que nous nous occupons principalement du traitement <strong>de</strong> requêtes dans <strong>de</strong>s<br />

<strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s. Cependant, nous trouvions important d’en parler ici à titre<br />

d’information et <strong>de</strong> comparaison.<br />

4.5 Conclusions<br />

Dans ce chapitre, nous avons analysé les différents langages d’interrogation pour <strong>XML</strong>. Nous<br />

nous sommes focalisés principalement <strong>sur</strong> XPath et XQuery, <strong>de</strong>s langages très prometteurs dont<br />

nous avons toutefois i<strong>de</strong>ntifié certains problèmes ou manquements.<br />

Dans le chapitre suivant, nous allons introduire les différents types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong><br />

permettant d’interroger <strong>de</strong>s documents <strong>XML</strong> à l’ai<strong>de</strong> <strong>de</strong> ces langages, et tout particulièrement<br />

à l’ai<strong>de</strong> <strong>de</strong> XQuery. Nous accor<strong>de</strong>rons <strong>une</strong> gran<strong>de</strong> importance à l’in<strong>de</strong>xation <strong>de</strong> ces documents<br />

<strong>XML</strong> afin <strong>de</strong> pouvoir utiliser ces langages <strong>de</strong> façon performante.


Chapitre 5<br />

Les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong><br />

Dans ce chapitre, nous allons analyser les différents types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> permettant<br />

<strong>de</strong> gérer <strong>de</strong>s documents <strong>XML</strong>. Nous nous attar<strong>de</strong>rons tout particulièrement <strong>sur</strong> les <strong>base</strong>s <strong>de</strong><br />

<strong>données</strong> <strong>XML</strong> <strong>native</strong>s, en détaillant leurs structures d’in<strong>de</strong>xes ainsi que les algorithmes associés.<br />

Pour finir, nous analyserons en détail eXist, un moteur <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre<br />

qui implémente XQuery.<br />

Contenu<br />

5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />

5.2 Types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> . . . . . . . . . . . . . . . . . . . . . 41<br />

5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s . . . . . . . . . . . . . . . . . . . . . . 43<br />

5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre . . . . . . . . . . . . . 58<br />

5.5 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />

5.1 Introduction<br />

<strong>XML</strong> est un format d’échange <strong>de</strong> <strong>données</strong> <strong>de</strong> plus en plus utilisé. Il est alors logique <strong>de</strong><br />

possé<strong>de</strong>r <strong>de</strong>s outils permettant <strong>de</strong> les stocker, <strong>de</strong> les interroger, <strong>de</strong> garantir leur intégrité, etc.<br />

C’est le rôle d’un système <strong>de</strong> gestion <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> (SGDB). Généralement, on attend d’un<br />

tel système les caractéristiques suivantes :<br />

⊲ Des outils d’interrogation, tels que les langages SQL ou XQuery.<br />

⊲ Des capacités <strong>de</strong> transactions, incluant les propriétés ACID 1 . C’est à dire qu’un tel système<br />

doit offrir l’atomicité <strong>de</strong>s opérations, la consistance <strong>de</strong> la <strong>base</strong> <strong>de</strong> <strong>données</strong> dans<br />

son ensemble, l’isolation <strong>de</strong>s opérations <strong>de</strong>s différents utilisateurs et la résistance <strong>de</strong>s<br />

opérations à un problème système.<br />

⊲ L’échelonnabilité (scalability) et la robustesse.<br />

⊲ Une gestion <strong>de</strong> la sécurité et <strong>de</strong>s performances. Par exemple, la gestion <strong>de</strong>s utilisateurs,<br />

<strong>de</strong>s in<strong>de</strong>x, <strong>de</strong> l’optimisation, etc.<br />

1 ACID sont les initiales <strong>de</strong> « Atomicity », « Concistency », « Isolation » et « Durabitily ».<br />

40


5.2 Types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> 41<br />

Plusieurs sortes d’outils permettent <strong>de</strong> stocker et gérer <strong>de</strong>s documents <strong>XML</strong>. Les principaux<br />

outils existants sont les <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles avec support <strong>XML</strong>, les <strong>base</strong>s <strong>de</strong> <strong>données</strong><br />

<strong>XML</strong> <strong>native</strong>s et les <strong>base</strong>s <strong>de</strong> <strong>données</strong> objets.<br />

Il est important <strong>de</strong> remarquer que <strong>de</strong>s <strong>données</strong> <strong>XML</strong> peuvent être très différentes <strong>de</strong>s <strong>données</strong><br />

relationnelles classiques. Nous en ferons <strong>une</strong> analyse détaillée dans le chapitre suivant, mais<br />

notons déjà les différences suivantes :<br />

⊲ L’ordre d’un document <strong>XML</strong> est important.<br />

⊲ Les documents <strong>XML</strong> peuvent contenir <strong>de</strong>s <strong>données</strong> non numériques.<br />

⊲ La structure d’un document <strong>XML</strong> est arborescente.<br />

⊲ Un document <strong>XML</strong> ne respecte pas nécessairement un schéma strict comme les <strong>données</strong><br />

relationnelles.<br />

⊲ La structure d’un document <strong>XML</strong> contient <strong>une</strong> sémantique intrinsèque.<br />

En considérant les points soulevés ici, nous introduirons un à un les différents types <strong>de</strong><br />

<strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> en nous concentrant tout particulièrement <strong>sur</strong> les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong><br />

<strong>native</strong>s, systèmes particulièrement flexibles et prometteurs.<br />

5.2 Types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong><br />

5.2.1 Bases <strong>de</strong> <strong>données</strong> relationnelles<br />

Depuis les années 1980, les <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles (SGDBR) sont les plus utilisées<br />

pour stocker et interroger <strong>de</strong>s informations. La plupart <strong>de</strong>s entreprises dépen<strong>de</strong>nt d’un tel système<br />

pour stocker et protéger leurs <strong>données</strong>. Les milliards <strong>de</strong> dollars investis dans les systèmes<br />

commerciaux comme Oracle et IBM DB2 leur ont donné <strong>une</strong> énorme force dans le domaine <strong>de</strong> la<br />

gestion <strong>de</strong> <strong>données</strong>. De tels systèmes sont aujourd’hui très performants, echelonnables (scalable)<br />

et fiables.<br />

Dans le début <strong>de</strong>s années 2000, la plupart <strong>de</strong>s moteurs relationnels commerciaux ont intégré<br />

le support <strong>de</strong> l’<strong>XML</strong>. Au départ, il ne s’agissait que <strong>de</strong> stocker et <strong>de</strong> récupérer l’entièreté d’un<br />

document <strong>XML</strong>, sans traitement particulier <strong>de</strong>s <strong>données</strong> contenues dans le document. Certains<br />

systèmes stockaient les documents <strong>XML</strong> à la façon d’<strong>une</strong> longue chaîne <strong>de</strong> caractères dans <strong>de</strong>s<br />

colonnes CLOB 2 tandis que d’autres découpaient les <strong>données</strong> <strong>XML</strong> comme les éléments et les<br />

attributs en plusieurs tables. Ce mécanisme est appelé shredding, ou « mise en lambeau » d’un<br />

document <strong>XML</strong>.<br />

L’expérience aidant et les besoins d’utiliser <strong>XML</strong> grandissant, les moteurs relationnels ont<br />

intégré un support direct <strong>de</strong> <strong>XML</strong>, à l’ai<strong>de</strong> d’un type <strong>de</strong> <strong>données</strong> spécialisé. Un type natif <strong>XML</strong><br />

a été défini et <strong>de</strong> nouvelles fonctions ont été développées comme, par exemple, transformer<br />

<strong>de</strong>s <strong>données</strong> relationnelles en <strong>XML</strong>. De plus, <strong>une</strong> multitu<strong>de</strong> <strong>de</strong> moyens ont été inventés pour<br />

interroger le contenu <strong>de</strong>s documents <strong>XML</strong> stockés dans ce type natif <strong>XML</strong>. Les principaux sont<br />

2 CLOB, Character Large Object, objet pouvant contenir <strong>une</strong> longue chaîne <strong>de</strong> caractères.


5.2 Types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> 42<br />

XPath, XQuery et SQL/<strong>XML</strong>. Enfin, ces systèmes offrent un support <strong>de</strong>s méta-<strong>données</strong>, bien<br />

souvent à l’ai<strong>de</strong> d’<strong>XML</strong> Schéma.<br />

De par leur ancienneté et leur fiabilité, les <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles sont <strong>une</strong> bonne<br />

solution pour gérer <strong>de</strong>s <strong>données</strong> <strong>XML</strong> mais sont malheureusement conceptuellement inadaptées<br />

à l’<strong>XML</strong>. En effet, un document <strong>XML</strong> représente un arbre et n’est pas nécessairement aussi bien<br />

structuré qu’<strong>une</strong> table relationnelle. De plus, la mise en lambeau <strong>de</strong>s documents <strong>XML</strong> conduit<br />

souvent à <strong>une</strong> perte <strong>de</strong> performance et à <strong>une</strong> difficulté d’écriture <strong>de</strong>s requêtes <strong>de</strong> par la structure<br />

relationnelle complexe qu’elle implique.<br />

5.2.2 Bases <strong>de</strong> <strong>données</strong> objet<br />

A la fin <strong>de</strong>s années 80, <strong>une</strong> nouvelle forme <strong>de</strong> système <strong>de</strong> gestion <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> a été<br />

introduite <strong>sur</strong> le marché. Il s’agit <strong>de</strong>s SGDBOO, les Systèmes <strong>de</strong> Gestion <strong>de</strong> Base <strong>de</strong> Données<br />

Orientées-Objet. Ces systèmes gèrent les <strong>données</strong> comme <strong>de</strong>s objets, plutôt que comme <strong>de</strong>s<br />

tables, <strong>de</strong>s lignes ou <strong>de</strong>s colonnes. En effet, il est plus naturel <strong>de</strong> représenter le mon<strong>de</strong> réel<br />

comme <strong>une</strong> collection d’objets, chacun ayant un état et <strong>de</strong>s comportements spécifiques. De plus,<br />

les langages <strong>de</strong> programmations orientés-objet commençant à être à la mo<strong>de</strong> à cette époque, les<br />

développeurs voulaient pouvoir stocker <strong>de</strong> manière persistante leurs objets, ce que les SGDBOO<br />

permettent <strong>de</strong> faire assez proprement.<br />

Malheureusement, les SGDBOO souffrent <strong>de</strong> ne pas avoir un langage <strong>de</strong> requête commun<br />

et standardisé, comme l’est SQL pour les SGBDR. La communauté existante autour <strong>de</strong>s <strong>base</strong>s<br />

<strong>de</strong> <strong>données</strong> orientées-objet a donc décidé d’adapter SQL. Le résultat en est OQL, un langage<br />

permettant uniquement <strong>de</strong> chercher et <strong>de</strong> récupérer <strong>de</strong>s <strong>données</strong>, mais pas <strong>de</strong> les mettre à jour.<br />

Ce type <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> aurait pu être très intéressant pour notre étu<strong>de</strong> car on peut<br />

considérer un document <strong>XML</strong> comme <strong>une</strong> collection hiérarchisée d’objets. En effet, chaque nœud<br />

d’un document <strong>XML</strong> a <strong>une</strong> i<strong>de</strong>ntité unique, comme les objets et un objet peut en inclure d’autres.<br />

Malheureusement, l’ODMG, le groupe <strong>de</strong> gestion <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> objets, n’a jamais publié<br />

<strong>de</strong> version permettant <strong>de</strong> gérer l’<strong>XML</strong>. Seul un groupe <strong>de</strong> chercheurs a créé un tel système, <strong>de</strong>venu<br />

libre par la suite, Ozone, qui, selon eux, est totalement compatible avec le DOM du W3C. Il n’y<br />

a donc pas <strong>sur</strong> le marché <strong>de</strong>s SGBDOO commerciaux <strong>de</strong> produit qui intègre un support explicite<br />

du <strong>XML</strong>, au sens d’Ozone. Une <strong>de</strong>s raisons est probablement qu’aucun SGBDOO n’a réussi à<br />

percer parmi les géants comme Microsoft et Oracle, sociétés qui ont intégré <strong>une</strong> gestion partielle<br />

<strong>de</strong>s objets dans leurs systèmes relationnels.<br />

5.2.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s<br />

Depuis quelques années, on voit apparaître <strong>sur</strong> le marché <strong>de</strong>s systèmes s’auto-décrivant<br />

comme <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s. Ces systèmes supportent le document <strong>XML</strong> comme<br />

unité fondamentale <strong>de</strong> stockage, implémentent <strong>de</strong>s langages étudiés pour traiter du <strong>XML</strong> comme<br />

XQuery et stockent les document <strong>XML</strong> suivant un modèle propre, compatible avec <strong>XML</strong>. Le<br />

chapitre suivant est entièrement consacré à ce nouveau type <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong>.


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 43<br />

5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s<br />

5.3.1 Définition<br />

Le terme Native <strong>XML</strong> Data<strong>base</strong> (NXD), ou <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>, est apparu pour la<br />

première fois dans la campagne <strong>de</strong> publicité pour Tamino, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> <strong>de</strong><br />

Software AG [45]. Depuis, grâce au succès <strong>de</strong> cette campagne, le terme est arrivé dans l’usage<br />

courant par différentes entreprises développant <strong>de</strong>s produits similaires. Etant <strong>de</strong>venu un terme<br />

publicitaire, il n’a jamais eu <strong>de</strong> définition technique formelle. Une définition possible <strong>de</strong> ce qu’est<br />

<strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> serait la suivante :<br />

⊲ Une <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> définit un modèle logique pour un document <strong>XML</strong>.<br />

Elle stocke et récupère les documents suivant ce modèle <strong>de</strong> <strong>données</strong>. Au minimum, il doit<br />

inclure les éléments, les attributs, les PCDATA et l’ordre du document. Des exemples <strong>de</strong><br />

tels modèles sont le modèle XPath, le <strong>XML</strong> Infoset et les modèles utilisés par DOM.<br />

⊲ Une <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> gère le document <strong>XML</strong> comme <strong>une</strong> unité fondamentale<br />

<strong>de</strong> stockage, comme <strong>une</strong> ligne dans <strong>une</strong> table relationnelle.<br />

⊲ Les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s n’ont pas un modèle physique sous-jacent particulier.<br />

Par exemple, le modèle physique peut être relationnel, hiérarchique, orienté objet ou<br />

utiliser un format <strong>de</strong> stockage propriétaire comme <strong>de</strong>s fichiers compressés in<strong>de</strong>xés.<br />

La première partie <strong>de</strong> cette définition est similaire à celle <strong>de</strong>s autres types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong>,<br />

définissant le modèle utilisé pour le stockage et l’interrogation. Dans le cas <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong><br />

<strong>XML</strong> <strong>native</strong>s, le modèle <strong>de</strong> <strong>données</strong> peut être différent : il pourrait notamment supporter <strong>de</strong>s<br />

requêtes basées <strong>sur</strong> le modèle XPath en stockant les documents comme du texte. Dans ce cas, <strong>de</strong>s<br />

parties, comme les sections CDATA et l’usage <strong>de</strong>s entités, sont stockées dans la <strong>base</strong> <strong>de</strong> <strong>données</strong><br />

mais pas incluses dans le modèle. Il existe un certain nombre <strong>de</strong> modèles pour <strong>XML</strong> comme<br />

Infoset et DOM. Le modèle choisi pour faire <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> est toutefois<br />

moins important que sa capacité à supporter arbitrairement la profon<strong>de</strong>ur <strong>de</strong> l’imbrication <strong>de</strong>s<br />

nœuds, la complexité <strong>de</strong> leurs relations, leur ordre, leur i<strong>de</strong>ntité, etc.<br />

La secon<strong>de</strong> partie <strong>de</strong> cette définition considère que l’unité <strong>de</strong> stockage fondamentale dans <strong>une</strong><br />

<strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>native</strong> <strong>XML</strong> est le document <strong>XML</strong>. Bien qu’il semble possible qu’<strong>une</strong> <strong>base</strong> <strong>de</strong><br />

<strong>données</strong> <strong>XML</strong> <strong>native</strong> puisse assigner ce rôle à <strong>de</strong>s fragments <strong>de</strong> documents, l’unité <strong>de</strong> stockage<br />

fondamentale reste effectivement le document <strong>XML</strong> dans la plupart <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong><br />

actuelles.<br />

La troisième partie <strong>de</strong> la définition pose que le modèle physique sous-jacent n’est pas important.<br />

C’est exact et c’est certainement le cas pour toutes les sortes <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong>. Le<br />

format <strong>de</strong> stockage physique utilisé par <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> relationnelle n’est pas <strong>une</strong> condition<br />

nécessaire au caractère relationnel <strong>de</strong> la <strong>base</strong>. De plus, il est tout à fait envisageable d’utiliser<br />

un support relationnel pour fabriquer un moteur <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> comme eXist<br />

l’a fait à ses débuts. Il est également possible dans un système relationnel d’utiliser un autre<br />

support que <strong>de</strong>s tableaux.<br />

Les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s sont donc <strong>de</strong>s <strong>base</strong>s <strong>données</strong> conçues spécialement pour<br />

stocker <strong>de</strong>s documents <strong>XML</strong>. Comme les autres <strong>base</strong>s <strong>de</strong> <strong>données</strong>, elles gèrent les transactions, la


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 44<br />

sécurité, l’accès multi-utilisateurs, offrent <strong>de</strong>s API <strong>de</strong> programmations, les langages <strong>de</strong> requêtes,<br />

etc. La seule différence par rapport aux autres <strong>base</strong>s <strong>de</strong> <strong>données</strong> est que leur modèle <strong>de</strong> structure<br />

interne est basé <strong>sur</strong> <strong>XML</strong> et <strong>sur</strong> rien d’autre, contrairement au modèle relationnel utilisé pour<br />

les <strong>base</strong>s <strong>de</strong> <strong>données</strong> « <strong>XML</strong>-enabled ».<br />

5.3.2 Utilisations<br />

Les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>native</strong>s <strong>XML</strong> sont communément utilisées pour stocker <strong>de</strong>s documents<br />

<strong>XML</strong> orientés présentation. La raison principale en est leur support pour les langages <strong>de</strong> requêtes<br />

<strong>XML</strong>. Ceux-ci permettent <strong>de</strong> poser <strong>de</strong>s questions comme « Donnez moi tous les documents dans<br />

lesquels le troisième paragraphe contient un mot en gras » ou encore pour limiter les recherches<br />

textuelles à certaines portions d’un document. Ce genre <strong>de</strong> requêtes est difficile à écrire dans<br />

un langage comme SQL. Une autre raison est que les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>native</strong>s <strong>XML</strong> préservent<br />

l’ordre du document, les instructions <strong>de</strong> traitement ou les commentaires, ce que les <strong>base</strong>s <strong>de</strong><br />

<strong>données</strong> « <strong>XML</strong>-enabled » ne font pas nécessairement.<br />

Les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>native</strong>s <strong>XML</strong> sont aussi utilisées pour intégrer <strong>de</strong>s <strong>données</strong>. L’intégration<br />

<strong>de</strong> <strong>données</strong> a été historiquement traitée au moyen <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles fédérées et<br />

celles-ci requièrent que toutes les sources <strong>de</strong> <strong>données</strong> soient adaptées au modèle relationnel. Or, ce<br />

procédé est impossible ou complexe pour beaucoup <strong>de</strong> types <strong>de</strong> <strong>données</strong> et le modèle <strong>de</strong> <strong>données</strong><br />

<strong>XML</strong> fournit dès lors <strong>une</strong> plus gran<strong>de</strong> flexibilité. Les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s gèrent<br />

également les changements <strong>de</strong> schéma plus facilement que les <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles.<br />

De plus, elles peuvent gérer <strong>de</strong>s <strong>données</strong> sans schéma. Ces <strong>de</strong>ux remarques sont importantes<br />

quand on intègre <strong>de</strong>s <strong>données</strong> <strong>de</strong> sources qu’on ne contrôle pas directement. Dans le cas <strong>de</strong> la<br />

fédération <strong>de</strong>s <strong>données</strong> pour un entrepôt, le fait que la <strong>base</strong> puisse supporter les changements <strong>de</strong><br />

schéma est très intéressant pour le développement <strong>de</strong>s ETL, dont nous avons parlé au point 2.4<br />

Une autre utilisation <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s est le stockage <strong>de</strong>s <strong>données</strong> semistructurées,<br />

comme les <strong>données</strong> financières ou biologiques, qui changent si fréquemment que<br />

la définition d’un schéma complet est impossible. Les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s peuvent<br />

gérer ce type <strong>de</strong> <strong>données</strong> car elles ne requièrent pas <strong>de</strong> schéma comme les <strong>base</strong>s <strong>de</strong> <strong>données</strong><br />

relationnelles.<br />

La <strong>de</strong>rnière utilisation principale d’<strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> est la gestion <strong>de</strong> l’évolution<br />

<strong>de</strong>s schémas. Bien que les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s ne fournissent pas <strong>de</strong> solutions<br />

complètes pour chaque besoin, elles fournissent plus <strong>de</strong> flexibilité que les <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles.<br />

Par exemple, les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>native</strong>s <strong>XML</strong> ne requièrent pas que les <strong>données</strong><br />

existantes soient migrées vers un nouveau schéma. Elles peuvent prendre en charge les changements<br />

<strong>de</strong> schéma et peuvent stocker <strong>de</strong>s <strong>données</strong> même si elles ne sont pas conformes au<br />

schéma.<br />

5.3.3 Systèmes existants<br />

Depuis quelques années, <strong>une</strong> multitu<strong>de</strong> <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s apparaît <strong>sur</strong> le<br />

marché. La plus connue est Tamino, <strong>de</strong> Software AG [45]. Berkeley DB [46] propose également


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 45<br />

<strong>une</strong> version <strong>XML</strong> <strong>de</strong> son moteur. Ronald Bourret propose <strong>sur</strong> son site web [47] <strong>une</strong> liste détaillée<br />

<strong>de</strong>s produits existants. Nous vous invitons à consulter cette page pour <strong>de</strong> plus amples détails.<br />

eXist est un moteur <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre qui implémente XQuery. Nous<br />

avons choisi d’utiliser ce produit pour nos expérimentations, le moteur étant complet et implémentant<br />

XQuery. De plus, les développeurs sont très réactifs et sympathiques. La section 5.4 <strong>de</strong><br />

ce mémoire est totalement consacrée à eXist.<br />

5.3.4 In<strong>de</strong>xation <strong>de</strong>s documents <strong>XML</strong><br />

Pré-requis<br />

D’un point <strong>de</strong> vue <strong>base</strong> <strong>de</strong> <strong>données</strong>, le format <strong>XML</strong> est <strong>une</strong> nouvelle approche pour modéliser<br />

l’information. L’implémentation d’un système nous permettant <strong>de</strong> stocker et d’interroger<br />

efficacement <strong>de</strong>s documents requiert le développement <strong>de</strong> nouvelles techniques d’in<strong>de</strong>xation.<br />

Expressions <strong>de</strong> chemin Les langages <strong>de</strong> requêtes <strong>XML</strong> comme XPath, Quilt ou XQuery utilisent<br />

<strong>de</strong>s expressions <strong>de</strong> chemin pour naviguer à travers la structure logique et hiérarchique d’un<br />

document <strong>XML</strong>. Ce <strong>de</strong>rnier est modélisé comme un arbre ordonné. Une expression <strong>de</strong> chemin<br />

représente un ensemble <strong>de</strong> nœuds <strong>de</strong> l’arbre. Par exemple, l’expression comman<strong>de</strong>//article/nom<br />

sélectionne tous les éléments nom qui sont <strong>de</strong>s enfants <strong>de</strong>s éléments article qui ont un élément<br />

ancêtre dénommé comman<strong>de</strong>. Le double slash dans la sous-expression comman<strong>de</strong>//article<br />

spécifie qu’il doit y avoir un chemin menant d’un élément comman<strong>de</strong> à un élément article.<br />

Cela correspond à la relation ancêtre-<strong>de</strong>scendant. Dans cet exemple, seuls les éléments article<br />

<strong>de</strong>scendants d’un élément comman<strong>de</strong> seront sélectionnés. Le simple slash dans la sous-expression<br />

article/nom représente <strong>une</strong> relation parent-enfant. Cela va sélectionner uniquement les noms<br />

dont le parent est un élément article. Le slash et le double slash sont respectivement <strong>de</strong>s<br />

abréviations pour les relations parent-enfant et ancêtre-<strong>de</strong>scendant. Par exemple, l’expression<br />

//article est un diminutif pour /<strong>de</strong>scendant-or-self::no<strong>de</strong>()/child::article.<br />

Il est à noter que XPath définit également <strong>de</strong>s relations supplémentaires entre les nœuds<br />

comme frère-suivant et frère-précé<strong>de</strong>nt. Le résultat d’<strong>une</strong> expression <strong>de</strong> chemin est <strong>une</strong> séquence<br />

<strong>de</strong> nœuds différents ordonnée selon l’ordre du document <strong>XML</strong>.<br />

Prédicats Les nœuds sélectionnés à l’ai<strong>de</strong> d’<strong>une</strong> expression <strong>de</strong> chemin peuvent être filtrés à<br />

l’ai<strong>de</strong> <strong>de</strong> prédicats. Un prédicat est <strong>une</strong> expression entourée <strong>de</strong> crochets. Le prédicat est évalué<br />

pour chaque nœud <strong>de</strong> la séquence et renvoie <strong>une</strong> valeur <strong>de</strong> vérité, vrai ou faux. Les nœuds<br />

sélectionnés pour lesquels le prédicat est faux sont éliminés <strong>de</strong> la sélection. Par exemple, pour<br />

trouver toutes les comman<strong>de</strong>s dont le nom d’un article contient la chaîne « Lampe », on peut<br />

utiliser l’expression suivante :<br />

comman<strong>de</strong> // article [ contains (nom ,’ Lampe ’)]


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 46<br />

La sous-expression <strong>de</strong> prédicat représente <strong>une</strong> sélection basée <strong>sur</strong> les valeurs tandis que la sousexpression<br />

comman<strong>de</strong>//article représente <strong>une</strong> sélection structurelle. Les sélections basées <strong>sur</strong><br />

les valeurs peuvent être faites <strong>sur</strong> les noms d’éléments, <strong>sur</strong> les noms et valeurs d’attributs et <strong>sur</strong><br />

les chaînes <strong>de</strong> caractères contenues dans un élément. Les sélections structurelles sont basées <strong>sur</strong><br />

les relations structurelles entre les nœuds, comme ancêtre-<strong>de</strong>scendant ou parent-enfant.<br />

De manière intuitive, on pourrait évaluer <strong>de</strong>s expressions <strong>de</strong> chemin en parcourant tout<br />

l’arbre <strong>de</strong> haut en bas ou <strong>de</strong> bas en haut. Cependant, malgré sa conception simple et propre,<br />

cette approche s’avère inefficace pour <strong>de</strong> gran<strong>de</strong>s collections <strong>de</strong> documents <strong>XML</strong>. Des travaux<br />

à ce propos confirment ces dires [48, 49, 50]. Par exemple, considérons <strong>une</strong> expression XPath<br />

sélectionnant tous les noms d’articles dans <strong>une</strong> collection <strong>de</strong> comman<strong>de</strong>s :<br />

/ comman<strong>de</strong>s // article / nom<br />

Dans <strong>une</strong> approche conventionnelle en amont (top-down), le processeur <strong>de</strong> requêtes <strong>de</strong>vra suivre<br />

tous les chemins commençant par comman<strong>de</strong> pour tester si un <strong>de</strong>scendant article existe. En<br />

effet, il n’y a aucun moyen <strong>de</strong> déterminer les emplacements possibles <strong>de</strong>s <strong>de</strong>scendants article<br />

à l’avance. Cela implique qu’un grand nombre <strong>de</strong> nœuds doivent être analysés pour tester si le<br />

nœud est un élément et si son nom est article.<br />

Il est donc évi<strong>de</strong>nt qu’<strong>une</strong> structure d’in<strong>de</strong>x est nécessaire pour traiter efficacement <strong>de</strong>s<br />

requêtes <strong>sur</strong> <strong>de</strong>s gran<strong>de</strong>s collections <strong>de</strong> documents. Le plan d’in<strong>de</strong>xation <strong>de</strong>vra fournir <strong>de</strong> quoi<br />

traiter <strong>de</strong>s sélections basées <strong>sur</strong> les valeurs ainsi que <strong>de</strong>s sélections structurelles. En ce qui<br />

concerne la sélection basée <strong>sur</strong> les valeurs, <strong>de</strong>s in<strong>de</strong>xes classiques peuvent être utilisés comme les<br />

arbres B+ dont nous parlerons au point suivant. Par contre, pour les sélections structurelles, ce<br />

n’est pas aussi simple. En effet, pour accélérer le traitement d’<strong>une</strong> expression <strong>de</strong> chemin basée<br />

<strong>sur</strong> <strong>de</strong>s relations structurelles, le plan d’in<strong>de</strong>xation <strong>de</strong>vra supporter <strong>une</strong> i<strong>de</strong>ntification rapi<strong>de</strong><br />

<strong>de</strong> telles relations entre les nœuds comme les relations parent-enfant et ancêtre-<strong>de</strong>scendant. Le<br />

traitement <strong>de</strong>s expressions se fera au maximum <strong>sur</strong> <strong>base</strong> <strong>de</strong>s informations d’in<strong>de</strong>x et il faudra<br />

donc limiter au maximum la nécessité d’accé<strong>de</strong>r au document <strong>XML</strong>.<br />

In<strong>de</strong>xation basée <strong>sur</strong> les valeurs<br />

Pour in<strong>de</strong>xer <strong>de</strong>s <strong>données</strong> selon leurs valeurs, les structures <strong>de</strong> <strong>données</strong> communément utilisées<br />

dans les <strong>base</strong>s <strong>de</strong> <strong>données</strong> sont les arbres B ou B-tree et leurs variantes, comme le B+-tree ou<br />

arbre B+.<br />

Les arbres B [51] sont <strong>de</strong>s arbres balancés et triés qui permettent l’insertion et la suppression<br />

<strong>de</strong> nœuds en complexité amortie logarithmique. La recherche dans un tel arbre est similaire<br />

à celle effectuée dans un arbre binaire <strong>de</strong> recherche, c’est-à-dire en parcourant l’arbre <strong>de</strong> haut<br />

en bas et en choisissant à chaque fois le fils correspondant à la fourchette <strong>de</strong> valeur que l’on<br />

recherche.<br />

L’idée principale <strong>de</strong>s arbres B est que ses nœuds peuvent avoir un nombre variable <strong>de</strong> fils<br />

dans <strong>une</strong> fourchette déterminée. Quand un nœud est inséré ou supprimé <strong>de</strong> l’arbre, le nombre<br />

<strong>de</strong> fils d’un nœud varie et les nœuds sont restructurés afin <strong>de</strong> gar<strong>de</strong>r la structure définie. Ce<br />

type d’arbre ne doit pas être re-balancé aussi fréquemment qu’un arbre binaire <strong>de</strong> recherche


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 47<br />

Fig. 5.1 – Structure d’in<strong>de</strong>x basée <strong>sur</strong> les valeurs : arbre B+ simple (Source : Wikipedia).<br />

auto-balancé classique mais peut prendre plus <strong>de</strong> place en mémoire car certains nœuds peuvent<br />

ne pas être complètement remplis.<br />

Une variante très utilisée dans l’in<strong>de</strong>xation, l’arbre B+ [52], diffère <strong>de</strong>s arbres B dans le<br />

fait que toutes les <strong>données</strong> sont sauvegardées dans les feuilles <strong>de</strong> l’arbre. Les nœuds internes ne<br />

contiennent que <strong>de</strong>s clés et <strong>de</strong>s pointeurs. Toutes les feuilles sont au même niveau et sont liées<br />

ensemble à la manière d’<strong>une</strong> liste afin <strong>de</strong> gérer facilement les requêtes portant <strong>sur</strong> <strong>de</strong>s fourchettes<br />

<strong>de</strong> valeurs. Un exemple d’arbre B+ très simple, tiré <strong>de</strong> Wikipedia, est illustré à la figure 5.1.<br />

In<strong>de</strong>xation structurelle<br />

Un nombre important <strong>de</strong> recherches ont été faites récemment afin <strong>de</strong> concevoir <strong>de</strong>s structures<br />

d’in<strong>de</strong>x correspondants aux besoins spécifiques <strong>de</strong> <strong>XML</strong>. Plusieurs plans <strong>de</strong> numérotation pour<br />

les documents <strong>XML</strong> ont été proposés [53, 54, 48, 55, 50, 49]. Un plan <strong>de</strong> numérotation assigne<br />

un i<strong>de</strong>ntificateur unique à chaque nœud dans l’arbre logique du document, comme en traversant<br />

l’arbre en pré-ordre ou par niveau. Les i<strong>de</strong>ntificateurs ainsi générés sont utilisés, dans le<br />

plan d’in<strong>de</strong>xation, comme référence au nœud actuel. Un plan <strong>de</strong> numérotation doit fournir <strong>de</strong>s<br />

mécanismes pour déterminer rapi<strong>de</strong>ment les relations structurelles entre <strong>une</strong> paire <strong>de</strong> nœuds et<br />

i<strong>de</strong>ntifier toutes les occurrences d’<strong>une</strong> telle relation dans un document ou dans <strong>une</strong> collection <strong>de</strong><br />

documents <strong>XML</strong>.<br />

En résumé, un plan <strong>de</strong> numérotation doit supporter <strong>de</strong>ux opérations basiques :<br />

⊲ La décision : Pour <strong>de</strong>ux nœuds donnés, déci<strong>de</strong>r s’ils ont <strong>une</strong> relation spécifique, comme<br />

parent-enfant, ancêtre-<strong>de</strong>scendant, frère-suivant, frère-précé<strong>de</strong>nt.<br />

⊲ La reconstruction : Pour un nœud donné, déterminer les i<strong>de</strong>ntificateurs <strong>de</strong>s nœuds<br />

<strong>de</strong> son voisinage comme, par exemple, le père, le frère suivant, le premier enfant, . . .<br />

Dans les pages suivantes, nous allons détailler différents plan <strong>de</strong> numérotations. Nous nous<br />

attar<strong>de</strong>rons particulièrement <strong>sur</strong> ceux utilisés dans eXist.


language. Often, the processing <strong>XML</strong> queries is not too efficient, or algorithms and data<br />

structures are not possible to apply for in<strong>de</strong>xing huge volume <strong>XML</strong> data. Consequently,<br />

these approaches are evaluated as well: the extent of implemented query language subset<br />

and the efficiency of the query processing are compared.<br />

5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 48<br />

2.1 Numbering Scheme<br />

Numérotation To facilitate<strong>de</strong> <strong>XML</strong> Dietz query processing it is crucial to provi<strong>de</strong> mechanisms to quickly <strong>de</strong>termine<br />

the ancestor-<strong>de</strong>scendant relationship between <strong>XML</strong> tree no<strong>de</strong>s.<br />

Le plan The <strong>de</strong> Dietz’s numérotation numbering <strong>de</strong> Dietz scheme [56] [22, est 23] le premier was theà first utiliser to use l’ordre tree<strong>de</strong>traversal parcoursor<strong>de</strong>r <strong>de</strong> l’arbre to<br />

pour déterminer <strong>de</strong>termine the les relations ancestor-<strong>de</strong>scendant structurellesrelationship ancêtre-<strong>de</strong>scendant between any entre pair <strong>une</strong>ofpaire tree <strong>de</strong> no<strong>de</strong>s. nœuds Author donnée.<br />

proposition was: for two given no<strong>de</strong>s x and y of a tree T , x is an ancestor of y if and only<br />

La proposition originale est la suivante : Pour <strong>de</strong>ux nœuds donnés x et y d’un arbre T , x est un<br />

if x occurs before y in the preor<strong>de</strong>r traversal of T and after y in the postor<strong>de</strong>r traversal.<br />

ancêtre d’y si et seulement si x apparaît avant y dans le parcours en pré-ordre <strong>de</strong> T et après y<br />

dans leExample parcours 2.1 en post-ordre. (Dietz’s numbering scheme).<br />

In Figure 2.1 an <strong>XML</strong> tree whose no<strong>de</strong>s are annotated by Dietz’s numbering scheme is<br />

La figure 5.2 illustre un arbre <strong>XML</strong> numéroté avec ce plan <strong>de</strong> numérotation. Chaque nœud<br />

shown. Each no<strong>de</strong> is labeled with a pair of preor<strong>de</strong>r and postor<strong>de</strong>r numbers. In the tree,<br />

possè<strong>de</strong> weun canlabel tell composé no<strong>de</strong> (1,4) <strong>de</strong>issa anplace ancestor dans ofl’ordre no<strong>de</strong> (5,3), préfixe because et postfixe no<strong>de</strong> (1,4) respectivement. comes beforeDans no<strong>de</strong>cet<br />

arbre, (5,3) on voit in the quepreor<strong>de</strong>r le nœud (i.e., (1, 4) 1 < est5) un and ancêtre after no<strong>de</strong> du nœud (5,3) in (5, the 3) car postor<strong>de</strong>r le nœud (i.e., (1, 4 4) > vient 3). Due avant<br />

le nœud to (5, the3) fact enthat parcours 2 < 5 préordre but 2 < 3(1 no<strong>de</strong> < 5) (2,2) et après is notle annœud ancestor (5, 3) of no<strong>de</strong> dans (5,3). le parcours postordre<br />

(4 > 3). Le nœud (2, 2) n’est pas un ancêtre du nœud (5, 3) car 2 < 3.<br />

(2,2)<br />

(1,4)<br />

(3,0) (4,1)<br />

(5,3)<br />

(0,9)<br />

(6,8)<br />

(7,7)<br />

(8,5) (9,6)<br />

Fig. 5.2 – Arbre <strong>XML</strong> numéroté suivant la numérotation <strong>de</strong> Dietz.<br />

Fig. 2.1. An <strong>XML</strong> tree whose no<strong>de</strong> are annotated by Dietz’s numbering scheme<br />

L’avantage <strong>de</strong> cette métho<strong>de</strong> est que la relation ancêtre-<strong>de</strong>scendant peut être déterminée<br />

en temps An constant obviousenbenefit examinant from this les approach labels <strong>de</strong>sisnœuds. that thePar ancestor-<strong>de</strong>scendant contre, en cas <strong>de</strong>relationship mise à jour, can<strong>une</strong><br />

réin<strong>de</strong>xation<br />

be <strong>de</strong>termined<br />

complète<br />

in<br />

<strong>de</strong><br />

constant<br />

l’arbre<br />

time<br />

est nécessaire,<br />

by examining<br />

ce qui<br />

the<br />

fait<br />

preor<strong>de</strong>r<br />

que cette<br />

and<br />

métho<strong>de</strong><br />

postor<strong>de</strong>r<br />

ne<br />

numbers<br />

sera pas<br />

of<br />

efficace<br />

tree<br />

no<strong>de</strong>s.<br />

dans le domaine <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong>, où les ajouts <strong>de</strong> <strong>données</strong> sont fréquents.<br />

Numérotation basée <strong>sur</strong> la position <strong>de</strong>s nœuds et leur profon<strong>de</strong>ur.<br />

Un plan d’in<strong>de</strong>xation basé <strong>sur</strong> l’i<strong>de</strong>ntificateur du document, la position <strong>de</strong>s nœuds et <strong>sur</strong> leur<br />

profon<strong>de</strong>ur a été proposé par Zhang et al. [50] en 2001. Dans ce plan, un élément est i<strong>de</strong>ntifié<br />

par un quadruplet : l’i<strong>de</strong>ntificateur du document, la position <strong>de</strong> départ dans le document, la<br />

position <strong>de</strong> fin et le niveau <strong>de</strong> profon<strong>de</strong>ur. Les positions sont exprimées en terme <strong>de</strong> nombre <strong>de</strong><br />

mots à partir du début du document <strong>XML</strong>. La proposition suivante permet <strong>de</strong> déterminer les<br />

relations ancêtre-<strong>de</strong>scendant entre <strong>une</strong> paire <strong>de</strong> nœuds : Un nœud x i<strong>de</strong>ntifié par le quadruplet<br />

(D1, S1, E1, L1) 3 est un <strong>de</strong>scendant du nœud (D2, S2, E2, L2) si et seulement si<br />

⊲ D1 = D2 et<br />

⊲ S1 < S2 et<br />

⊲ E1 > E2.<br />

3 L’attribut L est utilisé uniquement pour les relations parent-enfant.


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 49<br />

Numérotation XISS<br />

Le système XISS, par Li et Moon en 2001 [48], propose un plan <strong>de</strong> numérotation basé <strong>sur</strong><br />

un parcours pré-ordre étendu. C’est <strong>une</strong> extension du plan <strong>de</strong> Dietz qui répond à son manque<br />

<strong>de</strong> flexibilité en laissant <strong>de</strong>s trous dans la numérotation. Ce plan assigne <strong>une</strong> paire <strong>de</strong> nombres<br />

or<strong>de</strong>r et size à chaque nœud tel que :<br />

⊲ Pour un nœud y et son parent x, or<strong>de</strong>r(x) < or<strong>de</strong>r(y) et or<strong>de</strong>r(y)+size(y)


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 50<br />

Numérotation en arbre k-aire par niveau<br />

Lee et al. [54] ont proposé un plan <strong>de</strong> numérotation qui modélise l’arbre du document <strong>XML</strong><br />

comme un arbre k-aire complet, où k est égal au nombre maximum <strong>de</strong> nœuds fils d’un élément<br />

dans le document. Un i<strong>de</strong>ntificateur unique est assigné à chaque nœud à l’ai<strong>de</strong> d’un parcours<br />

par niveau <strong>de</strong> l’arbre. La figure 5.4 montre les i<strong>de</strong>ntificateurs assignés aux nœuds d’un simple<br />

document <strong>XML</strong>, qui est modélisé par un arbre binaire (2-aire) complet. Comme l’arbre doit être<br />

complet, <strong>de</strong>s i<strong>de</strong>ntificateurs vi<strong>de</strong>s sont insérés à différentes positions.<br />

<br />

Marc Dupond<br />

<br />

1234567<br />

7654321<br />

<br />

<br />

4<br />

Marc Dupond<br />

2<br />

nom<br />

5<br />

1<br />

contact<br />

6<br />

bureau<br />

3<br />

telephone<br />

I<strong>de</strong>ntificateur<br />

clairsemé<br />

7<br />

maison<br />

12<br />

14<br />

8 9 10 11 13 15<br />

1234567<br />

7654321<br />

Fig. 5.4 – Numérotation en arbre binaire complet.<br />

Les i<strong>de</strong>ntificateurs uniques générés par ce plan <strong>de</strong> numérotation ont quelques propriétés<br />

importantes. En effet, <strong>de</strong>puis un i<strong>de</strong>ntificateur donné, on peut déterminer facilement l’i<strong>de</strong>ntificateur<br />

<strong>de</strong> son nœud parent, <strong>de</strong> son nœud frère ou <strong>de</strong> ses nœuds enfants. Par exemple, pour un<br />

arbre k-aire, on peut obtenir l’i<strong>de</strong>ntificateur du parent d’un nœud i<strong>de</strong>ntifié par i par la fonction<br />

suivante :<br />

<br />

(i − 2)<br />

parenti = + 1<br />

k<br />

Pour obtenir l’i<strong>de</strong>ntificateur du j e fils d’un nœud i<strong>de</strong>ntifié par i, on utilise la fonction suivante :<br />

parenti,j = k(i − 1) + j + 1<br />

Cependant, la contrainte <strong>de</strong> complétu<strong>de</strong> <strong>de</strong> l’arbre impose <strong>une</strong> restriction majeure <strong>sur</strong> la taille<br />

maximale d’un document à in<strong>de</strong>xer avec ce plan <strong>de</strong> numérotation. Par exemple, <strong>une</strong> comman<strong>de</strong><br />

typique aura un nombre limité <strong>de</strong> sous-éléments comme un client et un magasin tandis que la<br />

majorité <strong>de</strong>s nœuds sont <strong>de</strong>s articles, situés plus bas dans le parcours par niveau <strong>de</strong> l’arbre. Intuitivement,<br />

on constate que, dans beaucoup <strong>de</strong> cas, un nombre trop important d’i<strong>de</strong>ntificateurs<br />

clairsermés seront utilisés, ce qui limitera la taille <strong>de</strong>s documents que l’on pourra in<strong>de</strong>xer en<br />

fonction <strong>de</strong> leur structure.


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 51<br />

Numérotation virtuelle par niveau<br />

Le plan <strong>de</strong> numérotation implémenté dans eXist fournit <strong>une</strong> extension basée <strong>sur</strong> les arbres<br />

k-aires vu au point précé<strong>de</strong>nt. Pour <strong>sur</strong>monter le problème <strong>de</strong> limitation <strong>de</strong> taille du document<br />

à in<strong>de</strong>xer, la contrainte <strong>de</strong> complétu<strong>de</strong> <strong>de</strong> l’arbre a été partiellement oubliée en faveur d’un plan<br />

<strong>de</strong> numérotation alternatif. Le document n’est plus vu comme un arbre k-aire complet. A la<br />

place, le nombre d’enfants d’un nœud doit être recalculé pour chaque niveau <strong>de</strong> l’arbre <strong>de</strong> la<br />

manière suivante : pour <strong>de</strong>ux nœuds x et y d’un arbre, size(x) = size(y) si level(x) = level(y),<br />

où size(n) est le nombre d’enfants d’un nœud n et level(m) est la longueur du chemin entre le<br />

nœud racine <strong>de</strong> l’arbre et le nœud m. L’information additionnelle <strong>sur</strong> le nombre d’enfants qu’un<br />

nœud peut avoir à chaque niveau <strong>de</strong> l’arbre est stockée avec le document dans un simple tableau.<br />

La figure 5.5 montre les i<strong>de</strong>ntificateurs générés par cette métho<strong>de</strong> pour le même exemple que<br />

celui <strong>de</strong> la page précé<strong>de</strong>nte.<br />

<br />

Marc Dupond<br />

<br />

1234567<br />

7654321<br />

<br />

<br />

4<br />

Marc Dupond<br />

2<br />

nom<br />

8 9<br />

5<br />

1<br />

contact<br />

6<br />

bureau<br />

10<br />

1234567<br />

3<br />

telephone<br />

I<strong>de</strong>ntificateur<br />

clairsemé<br />

(nœud virtuel)<br />

Fig. 5.5 – Numérotation virtuelle par niveaux.<br />

7<br />

maison<br />

11<br />

7654321<br />

Cette approche tient compte du fait que les documents <strong>XML</strong> typiques ont généralement<br />

un nombre beaucoup plus important <strong>de</strong> nœuds dans les couches basses <strong>de</strong> l’arbre que dans les<br />

couches hautes. La limite <strong>de</strong> la taille <strong>de</strong>s documents in<strong>de</strong>xables est augmentée considérablement.<br />

On peut donc in<strong>de</strong>xer <strong>de</strong>s documents plus grands, tout en consommant moins <strong>de</strong> mémoire car il<br />

y a beaucoup moins d’i<strong>de</strong>ntificateurs clairsemés (appelés ici nœuds virtuels, pour numérotation<br />

virtuelle).<br />

De même, insérer un nœud à un niveau bas <strong>de</strong> l’arbre n’a pas d’effet <strong>sur</strong> les i<strong>de</strong>ntificateurs<br />

uniques assignés aux nœuds <strong>de</strong>s niveaux supérieurs. Il est aussi possible <strong>de</strong> laisser <strong>de</strong>s i<strong>de</strong>ntificateurs<br />

clairsemés entre les nœuds existants pour éviter un réordonnancement fréquent <strong>de</strong>s nœuds<br />

lors <strong>de</strong>s mises à jour <strong>de</strong>s documents.


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 52<br />

Ce plan <strong>de</strong> numérotation alternatif n’affecte pas les propriétés générales <strong>de</strong>s arbres k-aires<br />

vues au point précé<strong>de</strong>nt. Pour un nœud, il est toujours possible <strong>de</strong> calculer son parent, ses frères<br />

ou ses enfants en utilisant les informations additionnelles <strong>sur</strong> le nombre <strong>de</strong> fils que chaque nœud<br />

peut avoir à chaque niveau <strong>de</strong> l’arbre. On peut voir l’arbre ainsi construit comme un arbre<br />

contenant <strong>de</strong>s arbres k-aires où k est déterminé pour chaque nœud. Chaque axe <strong>de</strong> navigation<br />

XPath est donc supporté par ce plan <strong>de</strong> numérotation.<br />

Ce plan réduit significativement la taille <strong>de</strong> stockage d’un nœud dans le magasin <strong>XML</strong> d’eXist.<br />

Il n’est en effet pas nécessaire <strong>de</strong> sauver <strong>de</strong>s liens symboliques ou physiques vers le parent,<br />

les frères, les enfants et les attributs. Pour accé<strong>de</strong>r au parent d’un nœud, il suffit <strong>de</strong> calculer<br />

son i<strong>de</strong>ntificateur et <strong>de</strong> le rechercher dans l’in<strong>de</strong>x. Avec cette métho<strong>de</strong>, le nœud d’un élément<br />

n’occupe pas plus que 4 ou 8 bytes dans le magasin <strong>XML</strong> d’eXist.<br />

De plus, avec ce plan d’in<strong>de</strong>xation, il est possible d’évaluer <strong>de</strong>s expressions <strong>de</strong> chemin multiples,<br />

ce qu’il est possible <strong>de</strong> faire avec XQuery. En effet, l’on peut réutiliser les informations<br />

d’in<strong>de</strong>x d’<strong>une</strong> première expression dans le traitement d’<strong>une</strong> secon<strong>de</strong> expression.<br />

Pour conclure, observons les avantages et inconvénients <strong>de</strong> cette approche. Les avantages<br />

sont les suivants :<br />

⊲ Le calcul <strong>de</strong>s relations structurelles entre les nœuds est simple (opération <strong>de</strong> décision).<br />

⊲ Depuis un i<strong>de</strong>ntificateur, on peut reconstruire les i<strong>de</strong>ntificateurs <strong>de</strong> tout le voisinage<br />

(opération <strong>de</strong> reconstruction).<br />

⊲ Tous les axes XPath sont supportés : enfant, <strong>de</strong>scendant, ancêtre, parent, . . .<br />

⊲ La métho<strong>de</strong> est efficace du point <strong>de</strong> vue <strong>de</strong> la place : tous les i<strong>de</strong>ntificateurs peuvent être<br />

restructurés facilement car on ne doit pas stocker les i<strong>de</strong>ntificateurs <strong>de</strong> nœuds dans le<br />

DOM.<br />

Les désavantages sont les suivants :<br />

⊲ L’encodage est clairsemé : on a besoin d’insérer <strong>de</strong>s nœuds virtuels à cause <strong>de</strong> la contrainte<br />

<strong>de</strong> complétu<strong>de</strong> <strong>de</strong>s arbres.<br />

⊲ La taille d’un document est limitée. Bien que ce plan <strong>de</strong> numérotation augmente cette<br />

limite significativement, il reste toujours <strong>une</strong> taille limite <strong>sur</strong> le nombre <strong>de</strong> bits utilisé<br />

pour un i<strong>de</strong>ntificateur (couramment 32 ou 64 bits).<br />

⊲ La taille limite du document dépend <strong>de</strong> la structure <strong>de</strong> l’arbre et est compliquée à prédire.<br />

⊲ La mise à jour peut entraîner <strong>une</strong> renumérotation complète <strong>de</strong> l’arbre.<br />

Numérotation dynamique par niveau<br />

En 2004, Boëhme et Rahm ont proposé un plan <strong>de</strong> numérotation intéressant permettant <strong>de</strong><br />

supprimer la limite <strong>de</strong> la taille <strong>de</strong>s documents in<strong>de</strong>xables et <strong>de</strong> mettre à jour les nœuds sans<br />

ré-in<strong>de</strong>xation complète [57]. Ce plan est nommé « numérotation dynamique par niveau » ou<br />

DLN. Il est basé <strong>sur</strong> <strong>de</strong>s i<strong>de</strong>ntificateurs à longueur variable.<br />

Les i<strong>de</strong>ntificateurs <strong>de</strong> ce plan <strong>de</strong> numérotation, appelés « nombres dynamiques <strong>de</strong> niveau »,<br />

sont inspirés <strong>de</strong> la classification décimale <strong>de</strong> Dewey, numérotation utilisée pour classer les livres


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 53<br />

dans les bibliothèques. Les i<strong>de</strong>ntificateurs <strong>de</strong> Dewey sont <strong>une</strong> séquence <strong>de</strong> valeurs numériques<br />

séparées par <strong>de</strong>s caractères spéciaux. Ils sont hiérarchiques. La racine du document possè<strong>de</strong><br />

l’i<strong>de</strong>ntificateur 1 tandis que tous les autres nœuds sont numérotés à l’ai<strong>de</strong> <strong>de</strong> l’i<strong>de</strong>ntificateur <strong>de</strong><br />

leur nœud parent comme préfixe, suivit d’<strong>une</strong> valeur <strong>de</strong> niveau. Par exemple, pour un arbre<br />

simple : 1, 1.1, 1.2, 1.2.1, 1.2.2, 1.3, etc. Dans ce cas, 1 représente le nœud racine, 1.1 est le<br />

premier nœud du second niveau, 1.2 le second et ainsi <strong>de</strong> suite. Une illustration <strong>de</strong> cet arbre est<br />

proposée à la figure 5.6.<br />

<br />

<br />

…<br />

<br />

<br />

…<br />

<br />

<br />

…<br />

…<br />

<br />

<br />

1.1<br />

chapitre<br />

1.1.1<br />

section<br />

1<br />

document<br />

1.2<br />

chapitre<br />

1.2.1<br />

section<br />

1.3.1<br />

section<br />

1.3<br />

chapitre<br />

Fig. 5.6 – Numérotation dynamique par niveaux (DLN).<br />

1.3.2<br />

section<br />

A l’ai<strong>de</strong> <strong>de</strong> ce plan <strong>de</strong> numérotation, déterminer la relation entre <strong>de</strong>ux nœuds donnés est <strong>une</strong><br />

opération triviale et fonctionne aussi bien pour l’axe ancêtre-<strong>de</strong>scendant que pour les relations<br />

frère-suivant et frère-précé<strong>de</strong>nt. Tous les axes <strong>de</strong> navigation XPath peuvent donc être gérés efficacement.<br />

Le problème principal est que ces i<strong>de</strong>ntificateurs risquent d’avoir besoin d’un nombre<br />

plus important <strong>de</strong> bits pour leur encodage que dans les plans précé<strong>de</strong>nts. Il faut donc trouver<br />

un encodage efficace qui<br />

⊲ restreint l’espace <strong>de</strong> stockage nécessaire pour un i<strong>de</strong>ntificateur et<br />

⊲ garantit <strong>une</strong> comparaison binaire correcte <strong>de</strong>s i<strong>de</strong>ntificateurs, en respectant l’ordre du<br />

document.<br />

En effet, en fonction du niveau d’encapsulation <strong>de</strong>s éléments dans le document <strong>XML</strong>, les i<strong>de</strong>ntificateurs<br />

peuvent <strong>de</strong>venir très longs. Il est à noter qu’il n’est pas rare qu’un document <strong>XML</strong><br />

contienne plus <strong>de</strong> 15 niveaux.<br />

La proposition originale <strong>de</strong> Böhme et Rahm décrit différentes approches pour enco<strong>de</strong>r les<br />

i<strong>de</strong>ntificateurs DLN. Nous allons détailler la technique d’encodage implémentée dans eXist en<br />

juillet 2006. Il s’agit d’un encodage efficace à bits variables et qui supporte <strong>une</strong> <strong>de</strong>s caractéristiques<br />

principales <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s : le fait que le document <strong>XML</strong> ne doit pas<br />

avoir <strong>une</strong> structure déterminée. Cet encodage utilise <strong>de</strong>s unités <strong>de</strong> largeur fixe (4 bits) pour les<br />

i<strong>de</strong>ntificateurs <strong>de</strong> niveau. Un i<strong>de</strong>ntificateur <strong>de</strong> niveau commence avec <strong>une</strong> unité, en utilisant les<br />

3 bits <strong>de</strong> poids faible pour le numéro <strong>de</strong> niveau et le bit <strong>de</strong> poids fort comme drapeau. Si l’on<br />

ne sait plus enco<strong>de</strong>r le numéro <strong>de</strong> niveau <strong>sur</strong> 3 bits, c’est-à-dire s’il est plus grand que 7, <strong>une</strong><br />

secon<strong>de</strong> unité est ajoutée et le bit <strong>de</strong> poids le plus fort <strong>de</strong> la première unité est mis à 1. Les


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 54<br />

bits <strong>de</strong> poids fort indiquent donc le nombre d’unités utilisées pour l’i<strong>de</strong>ntificateur. Le tableau<br />

5.1 détaille cet encodage.<br />

Unités Bits Valeurs<br />

1 0XXX 1..7<br />

2 10XX XXXX 8..71<br />

3 110X XXXX XXXX 72..583<br />

4 1110 XXXX XXXX XXXX 584..4679<br />

5 1111 0XXX XXXX XXXX XXXX 4680...37447<br />

6 1111 10XX XXXX XXXX XXXX XXXX 37448..299591<br />

Tab. 5.1 – Encodage DLN.<br />

Le nombre <strong>de</strong> numéros <strong>de</strong> niveaux possible augmente exponentiellement selon le nombre<br />

d’unités utilisé. Avec cet algorithme, un i<strong>de</strong>ntificateur comme 1.58.70.6.547.4500 peut être encodé<br />

<strong>sur</strong> 52 bits, ce qui est plus efficace que l’encodage en nombres entiers <strong>de</strong> l’i<strong>de</strong>ntificateur vu au<br />

point 5.3.4 qui aurait pris 64 bits pour autant que le document ne soit pas trop grand pour être<br />

in<strong>de</strong>xé.<br />

En plus <strong>de</strong> supprimer la limite <strong>de</strong> taille du document <strong>XML</strong> in<strong>de</strong>xable, ce plan <strong>de</strong> numérotation<br />

permet d’insérer facilement <strong>de</strong>s nœuds dans l’arbre <strong>XML</strong>. En effet, pour éviter <strong>de</strong> <strong>de</strong>voir<br />

renuméroter les nœuds après chaque insertion, suppression ou mise à jour, Boehme et Rahm<br />

proposent l’idée <strong>de</strong> sous-niveaux. Entre <strong>de</strong>ux nœuds 1.1 et 1.2, un nouveau nœud peut être inséré<br />

en 1.1/1, où / est le séparateur <strong>de</strong> sous-niveaux. Le / ne commence pas un nouveau niveau.<br />

1.1 et 1.1/1 sont tous les <strong>de</strong>ux <strong>sur</strong> le même niveau <strong>de</strong> l’arbre. La figure 5.7 montre l’arbre logique<br />

après insertion <strong>de</strong> ce nœud. Dans l’encodage binaire, le séparateur <strong>de</strong> niveau . est représenté par<br />

un bit à 0 tandis que / par un bit à 1. Le tableau 5.2 montre quelques exemples d’i<strong>de</strong>ntificateurs<br />

DLN ainsi que leur encodage et leur taille en bits.<br />

Id. Encodage Nb. bits<br />

1.3 0001 0 0011 9<br />

1.80 0001 0 1100 0000 1001 17<br />

1.10000.1 0001 0 11110001010011001001 0 0001 30<br />

1.1/7 0001 0 0001 1 0111 14<br />

Tab. 5.2 – Encodage DLN, exemples.<br />

Avec cette technique d’i<strong>de</strong>ntificateurs <strong>de</strong> sous-niveau, on peut théoriquement insérer un<br />

nombre arbitraire <strong>de</strong> nouveaux nœuds à n’importe quelle position <strong>de</strong> l’arbre sans avoir besoin<br />

<strong>de</strong> renuméroter tous les nœuds. Bien sûr, il serait intéressant <strong>de</strong> renuméroter l’entièreté<br />

du document <strong>de</strong> temps en temps pour ne pas perdre du temps dans les calculs <strong>de</strong> relations<br />

structurelles. En effet, les i<strong>de</strong>ntificateurs grandissent très rapi<strong>de</strong>ment. Par exemple, si on insère<br />

consécutivement <strong>de</strong>s nœuds entre 1.1 et 1.2, leurs i<strong>de</strong>ntificateurs seront : 1.1/1 puis 1.1/0/1,<br />

1.1/0/0/1, 1.1/0/0/0/1, . . . Pour gérer cet effet <strong>de</strong> bord, eXist prévoit <strong>une</strong> défragmentation <strong>de</strong><br />

l’arbre après un certain nombre d’insertions.


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 55<br />

<br />

<br />

…<br />

<br />

<br />

…<br />

…<br />

<br />

<br />

…<br />

<br />

<br />

…<br />

<br />

<br />

1.0/1<br />

chapitre<br />

1.0/1.1<br />

section<br />

1.1.1<br />

section<br />

1.1<br />

chapitre<br />

1<br />

document<br />

1.1.2<br />

section<br />

1.1/1<br />

chapitre<br />

1.1/1.1<br />

section<br />

insertions<br />

1.2<br />

chapitre<br />

1.2.1<br />

section<br />

Fig. 5.7 – Insertions dans la numérotation dynamique par niveaux (DLN).<br />

Il est à noter que, bien qu’il soit trivial, l’algorithme <strong>de</strong> comparaison pour <strong>de</strong>ux i<strong>de</strong>ntificateurs<br />

DLN est plus lent que celui pour <strong>de</strong>ux i<strong>de</strong>ntificateurs entiers vu au point 5.3.4. En effet, beaucoup<br />

d’opérations sont nécessaires pour traduire la chaîne <strong>de</strong> bits représentant l’i<strong>de</strong>ntificateur. Il faut<br />

donc y faire attention et éviter les comparaisons inutiles. Par contre, ce plan <strong>de</strong> numérotation<br />

facilite gran<strong>de</strong>ment l’insertion <strong>de</strong> nœuds car il n’est pas nécessaire <strong>de</strong> réin<strong>de</strong>xer l’arbre <strong>XML</strong>.<br />

Cette métho<strong>de</strong> a été implémentée dans eXist pendant l’année 2006 et est disponible en version<br />

<strong>de</strong> test <strong>de</strong>puis juillet 2006. Cette version a été présentée à la conférence <strong>XML</strong>Prague 2006 par<br />

Wolfgang Meier. Ce travail a été sponsorisé par l’Université <strong>de</strong> Victoria.<br />

5.3.5 Traitement <strong>de</strong>s requêtes grâce aux in<strong>de</strong>xes<br />

Les structures d’in<strong>de</strong>xes vues précé<strong>de</strong>mment dans ce chapitre vont servir au moteur <strong>de</strong> requête<br />

<strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s pour traiter efficacement les requêtes. De nombreuses<br />

recherches ont été faites à ce sujet ces <strong>de</strong>rnières années.<br />

Nous avons vu qu’il était enfantin <strong>de</strong> retrouver un ensemble <strong>de</strong> nœuds selon leur chemin ou<br />

leur valeur à l’ai<strong>de</strong> <strong>de</strong>s multiples in<strong>de</strong>xes. Cependant, nous n’avons pas encore abordé la façon<br />

avec laquelle on peut facilement joindre ces différents ensembles <strong>de</strong> nœuds. Par exemple, trouver<br />

tous les articles à l’ai<strong>de</strong> <strong>de</strong> l’expression //article ou trouver tous les nœuds prix dont la valeur<br />

est inférieure à 1000 via l’expression //[prix


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 56<br />

Algorithme <strong>de</strong> jointure fusion à prédicats multiples<br />

Zhang et al. [50] ont exploré l’efficacité <strong>de</strong>s algorithmes <strong>de</strong> jointures traditionnels utilisés dans<br />

les systèmes relationnels appliqués au traitement <strong>de</strong> documents <strong>XML</strong>. Ils ont proposé un nouvel<br />

algorithme, l’algorithme <strong>de</strong> jointure à prédicats multiples (multi-predicate merge join algorithm)<br />

qui serait, selon eux, plus performant que les jointures standards <strong>de</strong>s systèmes relationnels, du<br />

moins pour les documents <strong>XML</strong>. Nous ne nous attar<strong>de</strong>rons pas <strong>sur</strong> cet algorithme car il ne<br />

concerne pas les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s.<br />

Algorithmes <strong>de</strong> fusion d’arbre et d’arbre pile<br />

Deux autres familles d’algorithmes <strong>de</strong> jointure structurelle ont été proposées par Srivatava et<br />

al. : la fusion d’arbre (tree-merge) et l’arbre pile (stack-tree). Les algorithmes <strong>de</strong> fusion d’arbres<br />

éten<strong>de</strong>nt les algorithmes traditionnels <strong>de</strong> jointure fusion tandis que les algorithmes d’arbres piles<br />

ont été spécialement optimisés pour les jointures <strong>de</strong> chemins, concept souvent utilisé pour traiter<br />

les requêtes <strong>sur</strong> du <strong>XML</strong>.<br />

Le principe <strong>de</strong> <strong>base</strong> <strong>de</strong> ce <strong>de</strong>rnier algorithme est <strong>de</strong> placer dans <strong>une</strong> pile les nœuds d’un<br />

document <strong>XML</strong> en le parcourant en profon<strong>de</strong>ur d’abord. Ainsi, les nœuds <strong>de</strong>scendants se trouveront<br />

plus haut dans la pile que les nœuds ancêtres. Srivatava et al. ont proposé un algorithme<br />

permettant d’utiliser ce principe sans parcourir l’arbre <strong>XML</strong> en entier, mais en parcourant uniquement<br />

les <strong>de</strong>ux listes en entrée. Les algorithmes précis ainsi qu’<strong>une</strong> évaluation <strong>de</strong> performance<br />

sont disponibles dans l’article [49].<br />

Algorithmes <strong>de</strong> jointures XISS<br />

Les algorithmes principaux <strong>de</strong> jointure <strong>de</strong> chemins basés <strong>sur</strong> le plan <strong>de</strong> numérotation XISS<br />

ont été proposés et testés par Li et Moon, créateurs du plan XISS [48]. Ces auteurs proposent<br />

<strong>de</strong>s algorithmes <strong>de</strong> jointure <strong>de</strong> chemins pour évaluer les requêtes basées <strong>sur</strong> <strong>de</strong>s expressions <strong>de</strong><br />

chemin.<br />

L’idée principale <strong>de</strong>s algorithmes <strong>de</strong> jointure <strong>de</strong> chemins proposés est qu’<strong>une</strong> expression <strong>de</strong><br />

chemin complexe peut être décomposée en <strong>une</strong> série d’expressions simples. Chaque expression<br />

simple produit un ensemble <strong>de</strong> résultats intermédiaires qui peuvent être utilisés plus tard dans<br />

le traitement <strong>de</strong> la requête. Les résultats <strong>de</strong>s expressions simples peuvent être combinés ou joints<br />

pour obtenir le résultat final d’<strong>une</strong> requête.<br />

Considérons la requête /comman<strong>de</strong>s//client[@id=58758]. Une expression <strong>de</strong> chemin peut<br />

être décomposée en <strong>une</strong> combinaison <strong>de</strong>s expressions basiques suivantes :<br />

1. Une sous-expression avec un seul élément ou un seul attribut<br />

2. Une sous-expression avec un élément et un attribut (client[@id=58758] dans notre requête<br />

d’exemple)<br />

3. Une sous-expression avec <strong>de</strong>ux éléments en relation ancêtre-<strong>de</strong>scendant (comman<strong>de</strong>s/client<br />

ou comman<strong>de</strong>s//client)


5.3 Bases <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s 57<br />

4. Une sous-expression représentant <strong>une</strong> fermeture <strong>de</strong> Kleene (+,∗) d’<strong>une</strong> autre sous-expression<br />

(comman<strong>de</strong>s* ou comman<strong>de</strong>+)<br />

5. Une sous-expression représentant <strong>une</strong> union <strong>de</strong> <strong>de</strong>ux autres sous-expressions<br />

Une sous-expression <strong>de</strong> type (1) peut être traitée par un parcours d’in<strong>de</strong>x. Une sous-expression<br />

<strong>de</strong> type (5) peut être traitée en fusionnant <strong>de</strong>ux résultats intermédiaires. Pour les trois autres<br />

types sous-expressions (2), (3) et (4), les auteurs proposent trois algorithmes <strong>de</strong> jointures <strong>de</strong><br />

chemins nommés respectivement EA-Join, EE-Join et KC-Join.<br />

L’algorithme EA-Join joint <strong>de</strong>ux résultats intermédiaires : <strong>une</strong> liste d’éléments et <strong>une</strong> liste<br />

d’attributs obtenues par <strong>une</strong> sous-expression <strong>de</strong> type (2). Chac<strong>une</strong> <strong>de</strong> ces listes est parcourue<br />

séquentiellement. Un attribut et un élément sont fusionnés s’ils viennent du même document et<br />

si l’élément est le parent <strong>de</strong> l’attribut.<br />

L’algorithme EE-Join joint également <strong>de</strong>ux résultats intermédiaires : <strong>de</strong>ux listes d’éléments<br />

obtenus par <strong>une</strong> sous-expression <strong>de</strong> type (3). Les <strong>de</strong>ux listes sont parcourues séquentiellement,<br />

comme dans l’algorithme EA-Join. Deux éléments sont fusionnés s’ils viennent du même document<br />

et s’ils ont <strong>une</strong> relation ancêtre-<strong>de</strong>scendant ou parent-enfant.<br />

L’algorithme KC-Join traite <strong>une</strong> expression <strong>de</strong> chemin qui représente zéro, <strong>une</strong> ou plusieurs<br />

occurrences d’<strong>une</strong> sous-expression. A chaque étape du traitement, l’algorithme KC-Join applique<br />

EE-Join <strong>sur</strong> le résultat obtenu à l’étape précé<strong>de</strong>nte jusqu’à ce qu’il n’y ait plus <strong>de</strong> résultat à<br />

produire.<br />

Selon les tests expérimentaux <strong>de</strong>s auteurs <strong>de</strong> ces algorithmes, ils sont très efficaces, aussi<br />

bien <strong>sur</strong> <strong>de</strong>s <strong>données</strong> fictives que <strong>sur</strong> <strong>de</strong>s <strong>données</strong> réelles. Cela est dû au fait que le plan <strong>de</strong><br />

numérotation XISS est très performant pour déterminer les relations ancêtres-<strong>de</strong>scendants. En<br />

effet, grâce à ce plan, on peut déterminer cette relation entre <strong>de</strong>ux nœuds instantanément. Par<br />

contre, il n’est pas évi<strong>de</strong>nt qu’il soit efficace pour d’autres types <strong>de</strong> requêtes incluant <strong>de</strong>s axes<br />

XPath différents qu’ancêtre-<strong>de</strong>scendant, comme frère-suivant, frère-précé<strong>de</strong>nt. eXist, la <strong>base</strong> <strong>de</strong><br />

donnée <strong>XML</strong> <strong>native</strong> que nous allons présenter dans les lignes suivantes, utilise un algorithme<br />

similaire.


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 58<br />

5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre<br />

5.4.1 Introduction<br />

Le projet eXist est <strong>une</strong> implémentation open source d’un système <strong>de</strong> gestion <strong>de</strong> <strong>base</strong> <strong>de</strong><br />

<strong>données</strong> <strong>XML</strong> <strong>native</strong>, interfaçable à l’ai<strong>de</strong> <strong>de</strong> XPath, <strong>de</strong> XQuery et <strong>de</strong> XUpdate. Le projet a<br />

été entamé en 2000 par Wolgang Meier, un développeur allemand. Il en est toujours développeur<br />

principal et s’est basé <strong>sur</strong> les travaux <strong>de</strong> Shin, Jang et Jin [55] qui proposaient un système<br />

efficace d’in<strong>de</strong>xation <strong>de</strong>s documents structurés. Ce fut tout d’abord <strong>une</strong> expérience d’implémentation<br />

d’<strong>une</strong> in<strong>de</strong>xation <strong>de</strong> documents <strong>XML</strong> à l’ai<strong>de</strong> d’un système relationnel. Aujourd’hui, eXist<br />

n’utilise plus <strong>de</strong> relationnel et fonctionne <strong>sur</strong> un système <strong>de</strong> stockage propre. La communauté<br />

autour d’eXist ne cessant <strong>de</strong> croître et les développeurs étant très actifs, eXist est <strong>de</strong>venu un<br />

SGDB <strong>XML</strong> natif complet. La <strong>base</strong> <strong>de</strong> <strong>données</strong> est complètement écrite en Java et peut être<br />

déployée <strong>de</strong> multiple façons, aussi bien comme un processus serveur que dans un moteur <strong>de</strong><br />

servlet ou encore directement intégré dans <strong>une</strong> application.<br />

eXist fournit un stockage sans schéma <strong>de</strong>s documents <strong>XML</strong> dans <strong>de</strong>s collections hiérarchiques.<br />

Une collection est un ensemble qui peut contenir d’autres collections ou <strong>de</strong>s documents <strong>XML</strong>.<br />

En utilisant <strong>une</strong> syntaxe étendue d’XPath et d’XQuery, les utilisateurs peuvent interroger différentes<br />

parties <strong>de</strong> la hiérarchie <strong>de</strong> collections, ou tous les documents contenus dans la <strong>base</strong><br />

<strong>de</strong> <strong>données</strong>. A défaut d’être léger, le moteur <strong>de</strong> requêtes d’eXist implémente un traitement <strong>de</strong><br />

requête efficace et basé <strong>sur</strong> les in<strong>de</strong>xes. Le plan d’in<strong>de</strong>xation permet <strong>une</strong> i<strong>de</strong>ntification rapi<strong>de</strong><br />

<strong>de</strong>s relations structurelles entre les nœuds, comme la relation parent-enfant, ancêtre-<strong>de</strong>scendant<br />

et frère-suivant, frère-précé<strong>de</strong>nt. Basé <strong>sur</strong> <strong>de</strong>s algorithmes <strong>de</strong> jointures <strong>de</strong> chemins, <strong>une</strong> large<br />

fourchette d’expressions <strong>de</strong> chemin est traitée en utilisant uniquement les informations d’in<strong>de</strong>x.<br />

L’accès aux nœuds courants, stockés dans le magasin central <strong>de</strong> documents <strong>XML</strong>, n’est pas<br />

nécessaire pour ce type d’expressions.<br />

La <strong>base</strong> <strong>de</strong> <strong>données</strong> convient bien aux applications manipulant <strong>de</strong>s petites ou larges collections<br />

<strong>de</strong> documents <strong>XML</strong> qui sont occasionnellement mises à jour. Le logiciel a été conçu <strong>de</strong> sorte<br />

qu’il supporte les documents orientés <strong>données</strong> ou présentation. Cependant, l’interrogation <strong>de</strong><br />

ces <strong>de</strong>rniers n’est pas très bien supporté par les langages <strong>de</strong> requêtes <strong>XML</strong> comme XPath.<br />

eXist fournit donc un certain nombre d’extensions au standard XPath et XQuery pour traiter<br />

efficacement <strong>de</strong>s requêtes <strong>de</strong> recherche textuelle, incluant entre autres la recherche par mot clé<br />

ou via <strong>de</strong>s expressions régulières.<br />

5.4.2 Architecture<br />

eXist est bel et bien un système <strong>de</strong> gestion <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> natif, conformément<br />

à notre définition vue au point 5.3.1. En effet, un modèle logique pour les documents <strong>XML</strong> est<br />

défini et le document <strong>XML</strong> est son unité <strong>de</strong> stockage fondamentale.<br />

Au départ, eXist reposait <strong>sur</strong> un SGDB relationnel pour le stockage <strong>de</strong>s <strong>données</strong>. Très vite,<br />

celui-ci fut abandonné et remplacé par un magasin <strong>de</strong> <strong>données</strong> maison. Pendant la pério<strong>de</strong>


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 59<br />

transition, l’utilisateur avait le choix d’utiliser soit l’un soit l’autre. Les documents <strong>XML</strong> sont<br />

stockés en respectant le modèle DOM du W3C.<br />

Les détails d’implémentations concernant le stockage <strong>de</strong>s <strong>données</strong> sont totalement séparés<br />

du cœur d’eXist. Tous les appels au système <strong>de</strong> stockage se font par <strong>de</strong>s « courtiers » (brokers).<br />

Un courtier peut être vu comme <strong>une</strong> interface entre le cœur d’eXist et les systèmes <strong>de</strong> stockages.<br />

Ces classes « courtiers » fournissent un set d’instructions basiques comme ajouter, supprimer ou<br />

récupérer <strong>de</strong>s documents ou <strong>de</strong>s fragments. De plus, elles possè<strong>de</strong>nt <strong>de</strong>s métho<strong>de</strong>s pour utiliser les<br />

in<strong>de</strong>xes, comme par exemple récupérer un ensemble <strong>de</strong> nœuds correspondant à un certain nom.<br />

Les moteurs <strong>de</strong> requête XPath et XQuery sont implémentés <strong>de</strong> la même manière, comme <strong>de</strong>s<br />

Introducing eXist No<strong>de</strong> I<strong>de</strong>ntification Schemes and In<strong>de</strong>xing XQuery Processing Outlook<br />

modules gravitant autour du cœur d’eXist. Nous remarquons ici un excellent découpage objet<br />

du logiciel et ce, dès le début, dans le respect <strong>de</strong>s principes du génie logiciel. Il <strong>de</strong>vrait donc<br />

être aisé Architecture <strong>de</strong> modifier ou d’ajouter Overview certaines parties comme un nouveau langage ou un nouveau<br />

système <strong>de</strong> stockage. Une illustration <strong>de</strong> l’architecture d’eXist est proposée à la figure 5.8.<br />

Système <strong>de</strong> stockage<br />

Fig. 5.8 – Architecture d’eXist c○Wolfgang Meier.<br />

eXist, au départ, utilisait uniquement un système relationnel. En effet, Wolfgang Meier voulait<br />

se concentrer <strong>sur</strong> la partie in<strong>de</strong>xation <strong>de</strong>s <strong>données</strong>. Les premières versions du logiciel ont servi<br />

à tester le système d’in<strong>de</strong>xation pour vérifier son efficacité et évaluer ses performances. Depuis<br />

la version 0.6 en 2002, le système relationnel a été remplacé par un système maison. Pendant<br />

la pério<strong>de</strong> <strong>de</strong> transition, l’utilisateur avait le choix entre les systèmes <strong>de</strong> stockage, via un fichier<br />

<strong>de</strong> configuration. Cette option a maintenant disparu, <strong>de</strong>puis que <strong>de</strong> nombreuses recherches aient<br />

été effectuées <strong>sur</strong> le stockage efficace d’<strong>XML</strong> [58, 59, 60, 50]. Le test <strong>de</strong> ces différentes métho<strong>de</strong>s<br />

a pu se faire facilement, grâce à l’architecture modulaire bien pensée d’eXist.


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 60<br />

Collections <strong>de</strong> documents<br />

A l’intérieur d’eXist, les documents sont gérés dans <strong>de</strong>s collections hiérarchiques, d’<strong>une</strong> manière<br />

comparable aux fichiers dans un système <strong>de</strong> fichier. Le magasin <strong>de</strong> documents <strong>XML</strong> est<br />

indépendant au schéma : les collections ne doivent pas être liées à <strong>de</strong>s schémas prédéfinis et le<br />

nombre <strong>de</strong> documents utilisés dans <strong>une</strong> collection n’est pas <strong>une</strong> contrainte. En effet, <strong>de</strong>s documents<br />

arbitraires peuvent être mélangés dans <strong>une</strong> même collection. De même, les documents ne<br />

doivent pas nécessairement avoir un <strong>XML</strong> Schéma ou <strong>une</strong> DTD propre. La seul contrainte est<br />

que le document soit bien formé, au sens d’<strong>XML</strong>. Bien sûr, si <strong>une</strong> DTD ou un <strong>XML</strong> Schéma est<br />

défini, le document <strong>XML</strong> doit être validé.<br />

Déploiement<br />

eXist offre plusieurs mo<strong>de</strong>s <strong>de</strong> déploiement. Le moteur <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> peut :<br />

⊲ s’exécuter comme un processus serveur, fournissant <strong>de</strong>s interfaces HTTP, RESP et <strong>XML</strong>-<br />

RPC pour l’accès distant.<br />

⊲ être intégré dans d’autres applications, qui auront un accès direct à la <strong>base</strong> <strong>de</strong> <strong>données</strong><br />

via l’API <strong>XML</strong>:DB<br />

⊲ s’exécuter dans un moteur <strong>de</strong> servlet comme Apache Tomcat. Les Servlets ou les Java<br />

Server Pages (JSP) s’exécutant dans la même contexte d’application pourront accé<strong>de</strong>r<br />

directement à la <strong>base</strong>. L’accès distant est as<strong>sur</strong>é par <strong>XML</strong>-RPC, SOAP, REST et Web-<br />

DAV.<br />

Il est donc très facile d’utiliser eXist dans un grand nombre d’applications. Par exemple,<br />

pour faire un service web, on choisira l’interface SOAP. Pour l’intégrer dans <strong>une</strong> application, on<br />

utilisera l’API <strong>XML</strong>:DB, etc. <strong>XML</strong>:DB est la métho<strong>de</strong> préférée pour accé<strong>de</strong>r à eXist <strong>de</strong>puis <strong>une</strong><br />

application Java. <strong>XML</strong>:DB est <strong>une</strong> initiative indépendante qui propose <strong>une</strong> interface comm<strong>une</strong><br />

pour l’accès aux <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s ou toute autre <strong>base</strong> <strong>de</strong> <strong>données</strong> supportant <strong>XML</strong>.<br />

Cela permet aux développeurs d’écrire <strong>de</strong>s applications portables, en travaillant avec différents<br />

produits implémentant l’interface <strong>XML</strong>:DB.<br />

5.4.3 In<strong>de</strong>xation<br />

Depuis juillet 2006, eXist est disponible en <strong>de</strong>ux versions. La première, la branche 1.0, utilise<br />

le plan <strong>de</strong> numérotation virtuelle par niveau. Beaucoup d’utilisateurs se plaignaient <strong>de</strong> ne pas<br />

pouvoir stocker certains documents <strong>XML</strong>, car ils étaient composés d’un nombre trop important<br />

<strong>de</strong> nœuds ou possédaient <strong>une</strong> structure trop complexe pour être in<strong>de</strong>xés avec ce plan <strong>de</strong> numérotation.<br />

Fin 2005, les développeurs d’eXist ont donc décidé d’implémenter le plan d’in<strong>de</strong>xation<br />

DLN <strong>de</strong> Boëhme et Rahm. Ce plan <strong>de</strong> numérotation permet d’in<strong>de</strong>xer n’importe quel document<br />

<strong>XML</strong>, quelle que soit sa taille et sa complexité. Il permet également l’insertion et la suppression<br />

d’éléments sans réin<strong>de</strong>xation complète <strong>de</strong> l’arbre. La branche 1.1 sortie en juillet 2006 utilise ce<br />

plan <strong>de</strong> numérotation <strong>de</strong>s nœuds et est disponible en version d’essai (release candidate) <strong>de</strong>puis<br />

peu. C’est maintenant la branche principale <strong>de</strong> développement.


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 61<br />

Organisation <strong>de</strong> l’in<strong>de</strong>x et <strong>de</strong>s <strong>données</strong><br />

Dans cette section, nous allons expliquer quelques détails d’implémentation concernant l’organisation<br />

<strong>de</strong> l’in<strong>de</strong>x et <strong>de</strong>s <strong>données</strong> et expliquer comment le plan <strong>de</strong> numérotation et les structures<br />

d’in<strong>de</strong>x sont utilisées dans le traitement <strong>de</strong>s requêtes.<br />

eXist utilise quatre fichiers d’in<strong>de</strong>x :<br />

⊲ collextions.dbx qui gère la hiérarchie <strong>de</strong> collections, à la manière d’un système <strong>de</strong><br />

fichiers UNIX.<br />

⊲ dom.dbx qui contient les nœuds <strong>de</strong>s documents <strong>XML</strong> proprement dits, associés à leur<br />

i<strong>de</strong>ntificateur unique. Ce fichier est paginé.<br />

⊲ elements.dbx qui in<strong>de</strong>xe les éléments et les attributs<br />

⊲ words.dbx qui gar<strong>de</strong> <strong>une</strong> trace <strong>de</strong>s mots et <strong>de</strong> leurs occurrences. Ce fichier est utilisé par<br />

les extensions <strong>de</strong> recherches textuelles d’eXist.<br />

Tous les in<strong>de</strong>xes d’eXist sont basés <strong>sur</strong> <strong>de</strong>s arbres B+ (B+trees). Nous en avons déjà parlé<br />

au point 5.3.4. Il est important <strong>de</strong> prendre en compte que tous les in<strong>de</strong>xes pour les éléments,<br />

les attributs et mots-clés sont organisés par collection et pas par document <strong>XML</strong>. Par exemple,<br />

toutes les occurrences d’un élément article dans <strong>une</strong> collection seront stockées comme <strong>une</strong><br />

seule entrée dans l’in<strong>de</strong>x <strong>de</strong>s éléments. Cela ai<strong>de</strong> à gar<strong>de</strong>r un petit nombre <strong>de</strong> pages d’arbres<br />

B+ et conduit à <strong>une</strong> meilleure performance pour les requêtes <strong>sur</strong> l’entièreté d’<strong>une</strong> collection. Les<br />

développeurs ont essayé dans le passé d’élaborer un in<strong>de</strong>x par document dans <strong>une</strong> collection.<br />

Cela a induit <strong>une</strong> diminution <strong>de</strong>s performances pour les collections contenant un grand nombre<br />

<strong>de</strong> petits documents.<br />

Stockage <strong>de</strong>s <strong>données</strong> Le magasin <strong>XML</strong> dom.dbx représente le composant central <strong>de</strong> l’architecture<br />

<strong>de</strong> stockage <strong>native</strong> d’eXist. Il consiste en un fichier paginé dans lequel tous les nœuds<br />

du document sont stockés, avec respect du modèle DOM du W3C. Le magasin <strong>de</strong> <strong>données</strong> est<br />

stocké à l’ai<strong>de</strong> d’un arbre B+ à plusieurs racines dans le même fichier et associe à chaque i<strong>de</strong>ntificateur<br />

<strong>de</strong> nœud unique son adresse <strong>de</strong> stockage dans la partie <strong>données</strong> du fichier dom.dbx.<br />

Une illustration <strong>de</strong> ce concept est disponible aux figures 5.9 et 5.10.<br />

Il est important <strong>de</strong> noter qu’il n’est pas nécessaire <strong>de</strong> gar<strong>de</strong>r <strong>une</strong> trace <strong>de</strong>s liens entre les<br />

nœuds, comme, par exemple, en utilisant un pointeur pour le frère suivant, le premier enfant et le<br />

parent. L’implémentation DOM dépend complètement du plan <strong>de</strong> numérotation pour déterminer<br />

les relations structurelles entre les nœuds. Par exemple, pour obtenir le parent d’un nœud,<br />

l’i<strong>de</strong>ntificateur du parent est calculé à partir <strong>de</strong> l’i<strong>de</strong>ntificateur du nœud et le nœud correspondant<br />

est accédé via <strong>une</strong> recherche dans l’in<strong>de</strong>x.<br />

Cependant, un accès séquentiel et ordonné aux <strong>données</strong> est nécessaire dans certains cas,<br />

comme pour transformer un document ou un fragment <strong>de</strong> sa représentation interne à sa représentation<br />

<strong>XML</strong> originale (cette technique est appelée sérialisation). Pour y parvenir, les nœuds<br />

sont stockés dans l’ordre du document <strong>XML</strong> original, et situés physiquement dans <strong>de</strong>s pages <strong>de</strong><br />

<strong>données</strong> consécutives.


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 62<br />

Fig. 4. <strong>XML</strong> Data Store Organization<br />

Multi-root B+-Tree<br />

Document d 1<br />

No<strong>de</strong>-id<br />

...<br />

Address<br />

...<br />

Introducing eXist<br />

Document d 2 No<strong>de</strong> I<strong>de</strong>ntification Schemes and In<strong>de</strong>xing XQuery Processing Outlook<br />

No<strong>de</strong>-id<br />

Address<br />

Data pages<br />

...<br />

Document Storage<br />

...<br />

No<strong>de</strong> n 1 No<strong>de</strong> n 2 ...<br />

DOM no<strong>de</strong>s<br />

Fig. 5.9 – Structure du fichier dom.dbx dans eXist c○Wolfgang Meier.<br />

Please note again that it is not necessary to keep track of links between no<strong>de</strong>s, e.g.<br />

by using pointers to the next sibling, first child or parent. The DOM implementation<br />

completely relies on the numbering scheme to <strong>de</strong>termine no<strong>de</strong> relationships. For example,<br />

to get the parent of a no<strong>de</strong>, the parent’s unique i<strong>de</strong>ntifier is calculated from the<br />

no<strong>de</strong>'s i<strong>de</strong>ntifier and the corresponding no<strong>de</strong> is retrieved via an in<strong>de</strong>x lookup.<br />

However, or<strong>de</strong>red sequential access to the data is <strong>de</strong>sirable in many cases, e.g. to<br />

serialize a document or fragment from the internal data mo<strong>de</strong>l back into it's <strong>XML</strong> representation.<br />

To achieve this, no<strong>de</strong>s are stored in document or<strong>de</strong>r, physically located<br />

in subsequent data pages.<br />

Thus only a single initial in<strong>de</strong>x lookup is required to serialize a document or fragment.<br />

eXist's serializer will generate a stream of SAX [17] events by sequentially<br />

walking no<strong>de</strong>s in document or<strong>de</strong>r, beginning at the fragment's root no<strong>de</strong>. Any <strong>XML</strong><br />

tool implementing SAX may be used to post-process the generated stream.<br />

Fig. 5. In<strong>de</strong>x Organization for Elements and Attributes<br />

<br />

B+-Tree keys<br />

doc-id no<strong>de</strong>-id no<strong>de</strong>-id ...<br />

doc-id<br />

B+-Tree value: array of no<strong>de</strong>-ids seperated<br />

by doc-id<br />

Fig. 5.10 – Architecture <strong>de</strong> stockage d’eXist c○Wolfgang Meier.<br />

Pour passer <strong>de</strong> la représentation interne à la représentation <strong>XML</strong>, <strong>une</strong> seule recherche dans<br />

l’in<strong>de</strong>x est nécessaire. Pour ce faire, le transformateur d’eXist génère un flux d’événements SAX<br />

en parcourant séquentiellement les nœuds dans l’ordre du document, en commençant par le<br />

nœud racine. Ainsi, tous les outils <strong>XML</strong> implémentant SAX peuvent être utilisés pour le posttraitement<br />

<strong>de</strong> ce flux.<br />

...


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 63<br />

In<strong>de</strong>xes structurels<br />

Collections. Le fichier d’in<strong>de</strong>x collections.dbx gère la hiérarchie <strong>de</strong> collection et associe<br />

les noms <strong>de</strong> collections aux objets <strong>de</strong> la collection. Les <strong>de</strong>scriptions <strong>de</strong> documents sont stockées<br />

avec les objets <strong>de</strong> la collection. Un i<strong>de</strong>ntificateur unique est assigné à chaque collection et à<br />

chaque document durant l’in<strong>de</strong>xation.<br />

Eléments et attributs. Les noms d’éléments et d’attributs sont associés à leur i<strong>de</strong>ntificateur<br />

unique dans le fichier elements.dbx, représenté à la figure 5.11. Pour gagner <strong>de</strong> l’espace <strong>de</strong><br />

stockage, les noms <strong>de</strong>s nœuds ne sont pas utilisés directement comme clés. En effet, on associe<br />

les noms <strong>de</strong>s attributs et <strong>de</strong>s éléments avec <strong>de</strong>s clés entières dans <strong>une</strong> table <strong>de</strong> noms. Chaque entrée<br />

<strong>de</strong> l’in<strong>de</strong>x consiste en <strong>une</strong> clé et un tableau contenant <strong>une</strong> liste ordonnée <strong>de</strong>s i<strong>de</strong>ntificateurs<br />

<strong>de</strong> documents et <strong>de</strong> nœuds. Ceux-ci se réfèrent aux éléments et attributs correspondants aux<br />

noms représentés par chaque clé. Pour répertorier, par exemple, tous les clients d’<strong>une</strong> collection<br />

<strong>de</strong> comman<strong>de</strong>s, le moteur <strong>de</strong> requête se limitera à <strong>une</strong> seule recherche dans l’in<strong>de</strong>x et trouvera<br />

l’ensemble complet <strong>de</strong>s i<strong>de</strong>ntificateurs <strong>de</strong> nœuds pointant vers ces éléments clients.<br />

Introducing eXist No<strong>de</strong> I<strong>de</strong>ntification Schemes and In<strong>de</strong>xing XQuery Processing Outlook<br />

In<strong>de</strong>x Usage and Structural Joins<br />

Structural In<strong>de</strong>x<br />

Fig. 5.11 – Structure du fichier elements.dbx d’eXist c○Wolfgang Meier.<br />

Maps element and attribute QNames to a list of docId,<br />

no<strong>de</strong>Id<br />

In<strong>de</strong>xes basés <strong>sur</strong> les valeurs <strong>de</strong>s nœuds<br />

Created by <strong>de</strong>fault for every element or attribute in a<br />

document<br />

In<strong>de</strong>x inversé. Le fichier words.dbx correspond à un in<strong>de</strong>x inversé. C’est un in<strong>de</strong>x basé<br />

<strong>sur</strong> les valeurs, par opposition aux in<strong>de</strong>xes structurels. Ce type d’in<strong>de</strong>x existe dans la plupart<br />

<strong>de</strong>s systèmes <strong>de</strong> gestion <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong>. L’in<strong>de</strong>x inversé est utilisé spécifiquement pour<br />

associer un mot à l’ensemble <strong>de</strong>s documents dans lesquels il a été trouvé et à la position exacte<br />

dans laquelle il apparaît dans ces documents. L’in<strong>de</strong>x inversé d’eXist diffère <strong>de</strong>s in<strong>de</strong>xes inversés<br />

classiques car, au lieu <strong>de</strong> stocker la position <strong>de</strong>s mots, il associe les mots aux i<strong>de</strong>ntificateurs<br />

uniques <strong>de</strong> nœuds. Par défaut, eXist in<strong>de</strong>xe tous les contenus <strong>de</strong>s nœuds ainsi que les valeurs <strong>de</strong>s<br />

attributs en les découpant en mots clés. Le fichier words.dbx suit la même structure que celle<br />

du fichier elements.dbx, c’est-à-dire qu’il utilise <strong>une</strong> clé associée à un tableau contenant les


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 64<br />

i<strong>de</strong>ntificateurs <strong>de</strong>s nœuds. Bien sûr, il est possible <strong>de</strong> désactiver cet in<strong>de</strong>x inversé, ou d’exclure<br />

certaines parties d’un document donné.<br />

In<strong>de</strong>x <strong>de</strong> portée. Un troisième type d’in<strong>de</strong>x est disponible dans eXist, l’in<strong>de</strong>x <strong>de</strong> portée<br />

(range in<strong>de</strong>x). Il s’agit d’un in<strong>de</strong>x basé <strong>sur</strong> les valeurs. Cet in<strong>de</strong>x est spécifique aux types <strong>de</strong><br />

<strong>données</strong> <strong>de</strong>s valeurs <strong>de</strong>s nœuds du document. Ces in<strong>de</strong>xes fournissent un raccourci à la <strong>base</strong><br />

<strong>de</strong> <strong>données</strong> afin <strong>de</strong> sélectionner les nœuds directement selon <strong>de</strong> leurs valeurs. Au contraire <strong>de</strong>s<br />

in<strong>de</strong>xes structurels et inversés, l’in<strong>de</strong>x <strong>de</strong> portée peut, et doit, être créé et configuré par l’utilisateur.<br />

Dans ce sens, il est similaire aux in<strong>de</strong>xes utilisés dans les <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles,<br />

qui doivent aussi être spécifiés par l’administrateur <strong>de</strong> la <strong>base</strong>. eXist, par défaut, n’utilise pas<br />

cet in<strong>de</strong>x car il est incapable <strong>de</strong> déterminer le type <strong>de</strong>s valeurs <strong>de</strong>s nœuds <strong>de</strong> l’arbre <strong>XML</strong>. Il<br />

le pourrait à l’ai<strong>de</strong> d’un <strong>XML</strong> Schéma mais cette fonctionnalité n’est pas encore implémentée.<br />

De plus, il pourrait ne pas être efficace d’in<strong>de</strong>xer tous les champs <strong>de</strong> la <strong>base</strong>. Cependant, si <strong>de</strong>s<br />

in<strong>de</strong>xes <strong>de</strong> portée sont utilisés, ils sont créés par eXist lors du chargement du document et sont<br />

actualisés automatiquement lors <strong>de</strong> ses mises à jour.<br />

Les in<strong>de</strong>xes <strong>de</strong> portée sont utilisés au besoin lors <strong>de</strong>s comparaisons explicitement <strong>de</strong>mandées<br />

via les opérateurs et fonctions XPath standards, si, bien sûr, ces in<strong>de</strong>xes sont définis par l’utilisateur.<br />

Par défaut, si un tel in<strong>de</strong>x n’est pas défini, eXist procè<strong>de</strong> à <strong>une</strong> inspection en force brute<br />

(brute-force) du fichier dom.dbx. Il s’agit ici donc d’un point important si l’on compte gérer <strong>une</strong><br />

<strong>base</strong> <strong>de</strong> <strong>données</strong> importante avec eXist et que l’on a besoin <strong>de</strong> performance.<br />

Pour comprendre comment fonctionnent ces in<strong>de</strong>xes <strong>de</strong> portée, considérons le fragment <strong>XML</strong><br />

suivant :<br />

< articles ><br />

< article id="1"><br />

Lampe <strong>de</strong> Bureau <br />

299.99 <br />

<br />

< article id="2"><br />

Lampe <strong>de</strong> Chevet <br />

199.99 <br />

<br />

<br />

Dans cet exemple, les éléments prix en euros sont exprimés en nombre à virgule flottante.<br />

Les nombres flottants correspon<strong>de</strong>nt au type <strong>de</strong> donnée XSD xs:double. En utilisant ce type<br />

pour définir un in<strong>de</strong>x <strong>de</strong> portée, nous pouvons améliorer l’efficacité <strong>de</strong>s recherches <strong>de</strong> valeur <strong>de</strong>s<br />

éléments prix. Durant l’in<strong>de</strong>xation, eXist va considérer que toutes les valeurs <strong>de</strong>s éléments prix<br />

sont <strong>de</strong>s nombres réels et va ajouter à l’in<strong>de</strong>x les valeurs correspondantes. Si toutefois certaines<br />

valeurs <strong>de</strong>s éléments prix ne correspondaient pas à <strong>de</strong>s nombres réels, ils seraient ignorés lors<br />

<strong>de</strong> l’in<strong>de</strong>xation. Cet in<strong>de</strong>x <strong>de</strong> portée peut être utilisé dans n’importe quelle expression XPath<br />

qui compare la valeur d’un élément prix à <strong>une</strong> valeur numérique en virgule flottante, comme<br />

par exemple dans l’expression suivante :<br />

// article [ prix > xs: double (100.0) ]


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 65<br />

Pour les types <strong>de</strong> <strong>données</strong> hors <strong>de</strong>s chaînes <strong>de</strong> caractères, l’in<strong>de</strong>x <strong>de</strong> portée fournit au moteur<br />

<strong>de</strong> requête d’eXist <strong>une</strong> métho<strong>de</strong> plus efficace <strong>de</strong> conversion <strong>de</strong> <strong>données</strong> : au lieu <strong>de</strong> récupérer la<br />

valeur <strong>de</strong> chaque élément sélectionné et <strong>de</strong> la transformer en nombre réel afin <strong>de</strong> la comparer,<br />

eXist peut évaluer l’expression en utilisant l’in<strong>de</strong>x <strong>de</strong> portée par un simple parcours.<br />

Les avantages <strong>de</strong> ce type d’in<strong>de</strong>x peuvent également s’appliquer aux chaînes <strong>de</strong> caractères.<br />

Quand aucun in<strong>de</strong>x <strong>de</strong> portée n’est défini, eXist emploie la recherche textuelle pour retrouver<br />

les nœuds correspondants. Il est alors nécessaire qu’eXist parcoure les résultats obtenus par<br />

recherche textuelle pour en éliminer ceux qui ne correspon<strong>de</strong>nt pas à la requête. En utilisant<br />

l’in<strong>de</strong>x <strong>de</strong> portée, ce parcours supplémentaire n’est pas nécessaire. En plus, les in<strong>de</strong>xes <strong>de</strong> portée<br />

peuvent être utilisés pour <strong>de</strong>s comparaisons d’égalité, <strong>de</strong>s comparaisons plus petits / plus grands<br />

et <strong>de</strong>s comparaisons basées <strong>sur</strong> <strong>de</strong>s expressions régulières.<br />

Pour illustrer cette <strong>de</strong>rnière fonctionnalité, reprenons l’exemple précé<strong>de</strong>nt <strong>de</strong> la page 64. Si<br />

nous définissons un in<strong>de</strong>x <strong>de</strong> portée <strong>sur</strong> le type xs :string pour les éléments nom, <strong>une</strong> requête<br />

pour sélectionner toutes les lampes pourrait s’écrire <strong>de</strong> la façon suivante :<br />

// article [fn: contains (nom ,’[ Ll]ampe ’)]<br />

Un autre avantage <strong>de</strong> ce type d’in<strong>de</strong>x pour les chaînes <strong>de</strong> caractères est qu’il peut être défini<br />

pour les éléments au contenu mixte. Par exemple, prenons en compte l’élément suivant :<br />

< synonyme > ecran <br />

moniteur <br />

Dans ce cas, nous pouvons interroger eXist en utilisant <strong>une</strong> expression régulière s’appliquant <strong>sur</strong><br />

l’élément synonyme en entier. Par exemple :<br />

//[ fn: matches ( synonyme ,’ ecran .* ’)]<br />

En général, trois conditions sont à respecter afin d’optimiser la recherche en utilisant un<br />

in<strong>de</strong>x <strong>de</strong> portée :<br />

1. L’in<strong>de</strong>x <strong>de</strong> portée doit être défini <strong>sur</strong> tous les éléments <strong>sur</strong> lesquels porte la requête.<br />

2. Le type <strong>de</strong> donnée à in<strong>de</strong>xer doit correspondre au type <strong>de</strong> donnée testé.<br />

3. L’argument <strong>de</strong> droite dans la comparaison ne doit pas dépendre du contexte courant.<br />

Les détails concernant la configuration <strong>de</strong> ces in<strong>de</strong>xes sortent du cadre <strong>de</strong> ce mémoire. Ils<br />

sont disponibles dans la documentation disponible <strong>sur</strong> le site d’eXist 4 .<br />

5.4.4 Traitement <strong>de</strong>s requêtes<br />

eXist va utiliser activement ses structures d’in<strong>de</strong>xes pour traiter les requêtes XPath et<br />

XQuery. En effet, à l’ai<strong>de</strong> <strong>de</strong> ces in<strong>de</strong>xes, eXist est capable d’accé<strong>de</strong>r aux différents nœuds par<br />

leur i<strong>de</strong>ntificateur unique, <strong>de</strong> récupérer un ensemble d’i<strong>de</strong>ntificateurs <strong>de</strong> nœuds correspondant à<br />

un certain nom d’élément ou à <strong>de</strong>s mots clés. D’un point <strong>de</strong> vue implémentation, les courtiers<br />

ont <strong>de</strong>s métho<strong>de</strong>s pour chac<strong>une</strong> <strong>de</strong> ces opérations simples.<br />

4 http ://exist.sourceforge.net


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 66<br />

Dans ce chapitre, nous allons voir comment eXist utilise ses in<strong>de</strong>xes pour traiter efficacement<br />

les requêtes XPath et XQuery. Il est à noter qu’eXist n’inclut le support d’XQuery que <strong>de</strong>puis<br />

peu, au contraire d’XPath qui est implémenté <strong>de</strong>puis le début. C’est ici un point important car<br />

nous allons voir qu’il est souvent préférable d’utiliser un maximum d’expressions XPath dans<br />

les expressions XQuery. Il est donc important <strong>de</strong> comprendre comment eXist fonctionne pour<br />

pouvoir optimiser les requêtes.<br />

Algorithme <strong>de</strong> jointure <strong>de</strong> chemins<br />

En utilisant les fonctionnalités fournies par le plan d’in<strong>de</strong>xation, le moteur <strong>de</strong> requête d’eXist<br />

est capable d’utiliser <strong>de</strong>s algorithmes rapi<strong>de</strong>s <strong>de</strong> jointure <strong>de</strong> chemins pour traiter efficacement<br />

les expressions <strong>de</strong> chemin. Un certain nombre <strong>de</strong> tels algorithmes ont été proposés récemment.<br />

Celui utilisé dans eXist est basé <strong>sur</strong> l’algorithme proposé par Li et Moon [48] dont nous avons<br />

déjà parlé au point 5.3.5.<br />

Le processeur <strong>de</strong> requête d’eXist va d’abord décomposer l’expression <strong>de</strong> chemin donnée en<br />

<strong>une</strong> série d’étapes simples. Considérons l’expression XPath suivante :<br />

/ comman<strong>de</strong> // client [ Nom =" Dupond "]<br />

Cette expression est décomposée en 3 sous-expressions :<br />

1. comman<strong>de</strong>//client<br />

2. client[Nom]<br />

3. Nom="Dupond"<br />

Notons l’ordre <strong>de</strong>s sous-expressions : celles nécessitant un accès éventuel au magasin <strong>de</strong> <strong>données</strong><br />

sont mises en fin <strong>de</strong> chaîne. En effet, sans in<strong>de</strong>x <strong>de</strong> portée configuré correctement, la troisième<br />

sous-expression impliquera un parcours du magasin <strong>de</strong> <strong>données</strong>, stocké <strong>sur</strong> disque, avec toutes les<br />

conséquences que cela peut avoir en terme <strong>de</strong> performances. L’évaluation <strong>de</strong> cette sous-expression<br />

est différée pour pouvoir filtrer les nœuds à récupérer dans le magasin <strong>de</strong> <strong>données</strong> afin <strong>de</strong> les<br />

comparer, <strong>de</strong> sorte qu’il y ait le moins <strong>de</strong> nœuds possibles à aller chercher <strong>sur</strong> disque.<br />

Les positions exactes <strong>de</strong>s éléments comman<strong>de</strong>, client et nom sont fournis par le fichier d’in<strong>de</strong>x<br />

elements.dbx. Pour traiter la première sous-expression, le moteur <strong>de</strong> requêtes va charger les<br />

éléments racines (comman<strong>de</strong>) pour tous les documents <strong>de</strong> l’ensemble d’entrée. Ensuite, l’ensemble<br />

<strong>de</strong>s éléments client est récupéré par un parcours d’in<strong>de</strong>x classique. Nous possédons maintenant<br />

<strong>de</strong>ux ensembles <strong>de</strong> nœuds contenant <strong>de</strong>s ancêtres et <strong>de</strong>scendants potentiels pour chaque document<br />

en question. Chaque ensemble <strong>de</strong> nœuds consiste en <strong>une</strong> liste ordonnée <strong>de</strong> paires contenant<br />

l’i<strong>de</strong>ntificateur du document et l’i<strong>de</strong>ntificateur du nœud. Ces ensembles sont implémentés par<br />

<strong>de</strong>s tableaux Java.<br />

Pour trouver toutes les relations ancêtre-<strong>de</strong>scendant <strong>de</strong> ces ensembles <strong>de</strong> nœuds, eXist utilise<br />

un algorithme <strong>de</strong> jointure <strong>de</strong> chemins similaire à celui présenté par Li et Moon dans [48].<br />

Cependant, le plan <strong>de</strong> numérotation dans eXist n’est pas le même que celui pour lequel a été<br />

développé l’algorithme <strong>de</strong> jointure <strong>de</strong> chemins XISS.


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 67<br />

Selon son principe <strong>de</strong> <strong>base</strong>, l’algorithme prend en entrée <strong>de</strong>ux ensembles <strong>de</strong> nœuds ordonnés :<br />

le premier contient les ancêtres potentiels, le second les <strong>de</strong>scendants potentiels. Chaque nœud<br />

<strong>de</strong>s <strong>de</strong>ux listes est décrit par <strong>une</strong> paire contenant l’i<strong>de</strong>ntificateur du document et du nœud.<br />

L’algorithme remplace récursivement tous les i<strong>de</strong>ntificateurs <strong>de</strong> nœuds dans l’ensemble <strong>de</strong>s <strong>de</strong>scendants<br />

par l’i<strong>de</strong>ntificateur <strong>de</strong> leur nœud parent. A chaque étape, on compare les paires <strong>de</strong><br />

nœuds. Si <strong>une</strong> paire <strong>de</strong> nœuds avec le même i<strong>de</strong>ntificateur <strong>de</strong> document et le même i<strong>de</strong>ntificateur<br />

<strong>de</strong> nœud est trouvée, alors le nœud ancêtre et son <strong>de</strong>scendant original sont donnés en sortie.<br />

L’algorithme s’achève quand il n’y a plus <strong>de</strong> parents pour les nœuds contenus dans l’ensemble<br />

<strong>de</strong>s nœuds <strong>de</strong>scendants. Des détails <strong>sur</strong> cet algorithmes sont disponibles dans [61]. Le résultat<br />

renvoyé par l’algorithme va <strong>de</strong>venir un <strong>de</strong>s ensembles <strong>de</strong> nœuds en entrée pour la sous-expression<br />

suivante dans la liste. On va donc appeller <strong>une</strong> nouvelle fois l’algorithme avec le résultat obtenu<br />

et le résultat <strong>de</strong> la secon<strong>de</strong> sous-expression et procé<strong>de</strong>r <strong>de</strong> la même manière tant que la liste <strong>de</strong><br />

sous-expressions n’est pas vi<strong>de</strong>.<br />

Pour évaluer les sous-expressions comman<strong>de</strong>//client et client[Nom], eXist n’a pas besoin<br />

d’accès aux nœuds <strong>XML</strong> stockés dans le magasin <strong>de</strong> <strong>données</strong>. Les <strong>de</strong>ux sous-expressions sont<br />

entièrement traitées en se basant <strong>sur</strong> les i<strong>de</strong>ntificateurs uniques fournis par les fichiers d’in<strong>de</strong>x.<br />

Par contre, pour la troisième sous-expression, Nom="Dupond", eXist va <strong>de</strong>voir récupérer tous les<br />

nœuds correspondants dans le magasin <strong>de</strong> <strong>données</strong> pour comparer leur valeur avec la chaîne <strong>de</strong><br />

caractère « Dupond ». Ce comportement, très lourd et gourmand en ressources, peut être évité<br />

en utilisant correctement les in<strong>de</strong>xes <strong>de</strong> portée. Une autre solution serait d’utiliser la recherche<br />

textuelle, via l’in<strong>de</strong>x inversé, pour optimiser ce type <strong>de</strong> sous-expressions. Pour ce faire, il faut<br />

utiliser les opérateurs prévus pour utiliser cet in<strong>de</strong>x inversé. Ceux-ci ne sont pas standardisés<br />

dans la norme XPath/XQuery. Ces opérateurs sont décrits à la page 68.<br />

Optimisation <strong>de</strong>s requêtes<br />

Cette découpe d’expression en sous-expression dans un ordre optimal n’est pas sans conséquence.<br />

Par exemple, eXist préfère <strong>de</strong>s expressions XPath plutôt que leur équivalent FLWR<br />

utilisant <strong>une</strong> clause where. En effet, l’expression for force le moteur <strong>de</strong> requête à itérer étape<br />

par étape <strong>sur</strong> la séquence d’entrée et à évaluer la clause where à chaque étape. Par exemple,<br />

prenons l’expression FLWR suivante :<br />

for $i in // comman<strong>de</strong><br />

where $i/ client / @type =’ salarie ’ or $i/ client / @type =’ in<strong>de</strong>pendant ’<br />

or $i/ client / @type =’ etudiant ’<br />

return $i<br />

Cette expression peut se réécrire très facilement et plus lisiblement en utilisant l’expression<br />

XPath suivante :<br />

// comman<strong>de</strong> / client [ @type = (’ salarie ’,’ in<strong>de</strong>pendant ’,’ etudiant ’)]<br />

eXist a aussi tendance à calculer les relations entre les nœuds en partant du bas plutôt qu’en<br />

partant du haut <strong>de</strong> l’arbre. Les requêtes utilisant les axes parent ou ancêtre sont rapi<strong>de</strong>s et<br />

il est souvent préférable d’explorer le contexte d’un nœud donné en remontant l’axe ancêtre


5.4 eXist, <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong> libre 68<br />

plutôt qu’en traversant l’arbre <strong>de</strong>puis sa racine. Par exemple, la requête suivante utilise <strong>une</strong><br />

approche en amont (top-down) pour afficher le contexte <strong>de</strong> chaque article dans <strong>une</strong> requête <strong>sur</strong><br />

les comman<strong>de</strong>s :<br />

for $comman<strong>de</strong> in // comman<strong>de</strong><br />

for $article in $comman<strong>de</strong> // article / nom [ contains (. ," Lampe ")]<br />

return<br />

<br />

{ $comman<strong>de</strong> / @id / text () } <br />

{ $article }<br />

<br />

Cela semble être <strong>une</strong> façon naturelle d’écrire <strong>une</strong> telle requête mais cela force eXist à évaluer<br />

$comman<strong>de</strong>//article/nom[contains(.,"Lampe")] pour chaque comman<strong>de</strong>. Le moteur <strong>de</strong> requête<br />

va essayer d’optimiser un peu cela mais cependant, <strong>une</strong> meilleure performance peut être<br />

obtenue en reformulant la requête <strong>de</strong> façon à utiliser l’axe ancêtre <strong>de</strong> la façon suivante :<br />

for $article in // comman<strong>de</strong> // article / nom [ contains (. ," Lampe ")]<br />

return<br />

<br />

{ $article / ancestor :: @id / text () }<br />

{ $article }<br />

<br />

Extensions à XPath<br />

La spécification XPath ne définit qu’un ensemble limité <strong>de</strong> fonctions pour rechercher <strong>une</strong><br />

chaîne <strong>de</strong> caractères dans le contenu d’un nœud. Cela peut être gênant si l’on veut traiter <strong>de</strong>s<br />

documents <strong>XML</strong> contenant beaucoup <strong>de</strong> texte comme les documents <strong>XML</strong> orientés présentation.<br />

Pour rechercher <strong>de</strong>s chapitres à propos <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> en respectant la norme XPath,<br />

il faudrait écrire <strong>une</strong> expression du type <strong>de</strong> la suivante (cet exemple est tiré du site web d’eXist) :<br />

// chapitre [ contains (. , <strong>XML</strong> ) and contains (. , data<strong>base</strong>s )]<br />

L’exécution <strong>de</strong> cette requête peut être assez lente car le moteur XPath va scanner entièrement<br />

le contenu <strong>de</strong>s nœuds chapitre et <strong>de</strong> leurs <strong>de</strong>scendants. De plus, il est possible que le mot<br />

data<strong>base</strong> soit écrit avec <strong>une</strong> majuscule en début <strong>de</strong> phrase, <strong>de</strong> même si ce mot est utilisé au<br />

singulier. Dans ces cas, l’expression précé<strong>de</strong>nte n’est pas suffisante.<br />

Pour résoudre ce problème, eXist fournit <strong>de</strong>s opérateurs et <strong>de</strong>s fonctions pour accé<strong>de</strong>r efficacement<br />

au contenu textuel <strong>de</strong>s nœuds, en utilisant l’in<strong>de</strong>x inversé dont nous avons parlé à la<br />

page 63. Par exemple, eXist permet d’écrire la requête précé<strong>de</strong>nte <strong>de</strong> la façon suivante :<br />

// chapitre [ near (.,’ <strong>XML</strong> data<strong>base</strong> ? ’ ,50)]<br />

Cette expression va renvoyer tous les chapitres contenant les <strong>de</strong>ux mots <strong>XML</strong> et data<strong>base</strong> et dont<br />

la distance entre ces <strong>de</strong>ux mots est inférieure à 50 mots. De plus, le caractère ? dans data<strong>base</strong> ?<br />

permet <strong>de</strong> trouver les occurrences du mot qu’il soit au pluriel ou au singulier. Il est également


5.5 Conclusions 69<br />

intéressant <strong>de</strong> constater que ces recherches ne sont pas sensibles à la casse. Cela résout donc<br />

entièrement le problème soulevé plus haut. Pour conclure <strong>sur</strong> cet exemple, comme la requête est<br />

basée <strong>sur</strong> les in<strong>de</strong>xes, celle-ci va s’exécuter plus rapi<strong>de</strong>ment que son équivalent XPath standard.<br />

eXist fournit <strong>de</strong>ux opérateurs supplémentaires <strong>de</strong> comparaison afin d’améliorer la recherche<br />

textuelle dans <strong>de</strong>s documents <strong>XML</strong>. Ces <strong>de</strong>ux opérateurs sont &= et |=. Le premier opérateur<br />

permet <strong>de</strong> retrouver les nœuds contenant tous les mots d’<strong>une</strong> chaîne <strong>de</strong> caractères tandis que le<br />

second permet <strong>de</strong> déterminer les nœuds contenant au moins un mot d’<strong>une</strong> chaîne <strong>de</strong> caractères.<br />

Ces <strong>de</strong>ux opérateurs utilisent bien sûr l’in<strong>de</strong>x inversé pour améliorer l’efficacité <strong>de</strong>s requêtes.<br />

De plus, cette recherche n’est pas sensible à la casse. Tous ces opérateurs et extensions sont<br />

utilisables également avec <strong>de</strong>s expressions régulières.<br />

5.5 Conclusions<br />

Dans ce chapitre, nous avons analysé les différents types <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong> permettant <strong>de</strong><br />

gérer <strong>de</strong>s documents <strong>XML</strong> en détaillant principalement les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s, leurs<br />

techniques d’in<strong>de</strong>xation et les algorithmes associés. Enfin, nous avons présenté eXist, <strong>une</strong> <strong>base</strong><br />

<strong>de</strong> donnée <strong>XML</strong> <strong>native</strong> libre très prometteuse.<br />

Dans le chapitre suivant, nous allons étudier la manière d’utiliser ces systèmes <strong>XML</strong> natifs<br />

dans le domaine <strong>de</strong>s entrepôts <strong>de</strong> <strong>données</strong> et tout particulièrement <strong>de</strong> l’analyse. Nous pensons<br />

que le format <strong>XML</strong> est plus adapté pour représenter le mon<strong>de</strong> réel que le format relationnel car<br />

sa structure est beaucoup plus souple. Dès lors, pourquoi ne pas imaginer un système d’ai<strong>de</strong> à<br />

la décision basé <strong>sur</strong> <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>, <strong>base</strong> <strong>de</strong> <strong>données</strong> spécifiquement étudiée<br />

pour gérer du contenu <strong>XML</strong>. C’est ce que nous allons analyser dans les chapitres suivants.


Chapitre 6<br />

Les entrepôts <strong>de</strong> <strong>données</strong> <strong>XML</strong> natifs<br />

Dans ce chapitre, nous allons analyser les différentes étu<strong>de</strong>s traitant du langage <strong>XML</strong> dans<br />

le domaine <strong>de</strong>s entrepôts <strong>de</strong> <strong>données</strong>. Nous étudierons ensuite les différents besoins d’un système<br />

d’analyse <strong>de</strong> <strong>données</strong> entièrement en <strong>XML</strong> <strong>de</strong>s points <strong>de</strong> vue modélisation, in<strong>de</strong>xation et langage.<br />

Nous nous concentrerons principalement <strong>sur</strong> ce <strong>de</strong>rnier point, à l’ai<strong>de</strong> <strong>de</strong> XQuery.<br />

Contenu<br />

6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />

6.2 Systèmes d’analyse (<strong>OLAP</strong>) . . . . . . . . . . . . . . . . . . . . . . . . 70<br />

6.3 Besoins d’un système <strong>OLAP</strong> basé <strong>sur</strong> <strong>XML</strong> . . . . . . . . . . . . . . 74<br />

6.4 Le test TPC-H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />

6.5 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83<br />

6.1 Introduction<br />

<strong>XML</strong> est un format <strong>de</strong> plus en plus utilisé pour le stockage et la transmission d’informations.<br />

Grâce à ses qualités en matière <strong>de</strong> flexibilité pour modéliser <strong>de</strong>s <strong>données</strong>, on peut s’attendre<br />

à ce que ce format soit encore plus utilisé dans le futur. Depuis que <strong>XML</strong> est <strong>de</strong>venu le langage<br />

<strong>de</strong> choix pour représenter les <strong>données</strong>, le besoin <strong>de</strong> pouvoir analyser ces <strong>données</strong> augmente<br />

constamment. Il convient donc <strong>de</strong> disposer d’outils adéquats pour stocker et interroger ces informations<br />

<strong>XML</strong>. Le stockage <strong>de</strong> ces <strong>données</strong> est le rôle d’un entrepôt <strong>de</strong> <strong>données</strong> et l’interrogation<br />

<strong>de</strong> celles-ci revient à <strong>de</strong>s outils d’analyse <strong>OLAP</strong> et <strong>de</strong> data-mining. Cependant, peu d’étu<strong>de</strong>s ont<br />

été réalisées <strong>sur</strong> le sujet. Dans ce chapitre, nous allons en présenter quelques <strong>une</strong>s. Nous tenterons<br />

également d’i<strong>de</strong>ntifier les outils nécessaires à un système d’entrepôt <strong>de</strong> <strong>données</strong> entièrement en<br />

<strong>XML</strong>. Par la suite, nous nous focaliserons principalement <strong>sur</strong> les systèmes d’analyse <strong>OLAP</strong>.<br />

6.2 Systèmes d’analyse (<strong>OLAP</strong>)<br />

Pour commencer, notons qu’il y a <strong>de</strong>ux manières d’utiliser <strong>XML</strong> dans les systèmes d’analyse.<br />

La première consiste à utiliser <strong>XML</strong> pour représenter les <strong>données</strong> sources et/ou les résultats<br />

70


6.2 Systèmes d’analyse (<strong>OLAP</strong>) 71<br />

<strong>de</strong>s requêtes. Tout le traitement <strong>de</strong>s requêtes se fait à l’ai<strong>de</strong> d’outils <strong>OLAP</strong> existants, basés <strong>sur</strong><br />

<strong>de</strong>s structures relationnelles ou multidimensionnelles. La secon<strong>de</strong> approche utilise <strong>XML</strong> aussi<br />

bien pour la représentation <strong>de</strong>s <strong>données</strong> que pour leur traitement. Nous détaillerons ici ces <strong>de</strong>ux<br />

approches, en nous concentrant <strong>sur</strong> la <strong>de</strong>uxième, et présenterons les outils et étu<strong>de</strong>s existants.<br />

6.2.1 Sources et résultats en <strong>XML</strong><br />

<strong>XML</strong> peut être utilisé pour représenter les <strong>données</strong> sources d’un système d’analyse. Dans<br />

cette approche, les informations intéressantes <strong>de</strong>s documents <strong>XML</strong> sont extraites vers un moteur<br />

<strong>OLAP</strong> existant via un langage <strong>de</strong> traitement pour <strong>XML</strong> comme XSLT ou XQuery. L’analyse<br />

<strong>de</strong>s <strong>données</strong> se fait à l’ai<strong>de</strong> d’un moteur <strong>OLAP</strong> classique, basé <strong>sur</strong> <strong>de</strong>s structures relationnelles<br />

ou multidimensionnelles comme SQL Server <strong>de</strong> Microsoft.<br />

Fédération <strong>de</strong> <strong>données</strong><br />

Les <strong>données</strong> sources d’un système d’analyse peuvent ne pas être uniquement <strong>de</strong>s documents<br />

<strong>XML</strong> mais également <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> relationnelles classiques. En général, les sources <strong>de</strong><br />

<strong>données</strong> sont hétérogènes. Il convient donc <strong>de</strong> fé<strong>de</strong>rer ces différentes sources <strong>de</strong> <strong>données</strong> afin <strong>de</strong><br />

pouvoir les analyser uniformément.<br />

Des travaux à ce sujet ont été effectuées par Pe<strong>de</strong>rsen et al. dans [62, 63]. Les auteurs proposent<br />

<strong>une</strong> approche pour fédérer <strong>de</strong>s sources <strong>de</strong> <strong>données</strong> <strong>XML</strong> avec <strong>de</strong>s cubes <strong>OLAP</strong> existants.<br />

Ils proposent également <strong>une</strong> architecture permettant d’interroger différentes sources <strong>de</strong> <strong>données</strong><br />

<strong>de</strong> manière transparente, <strong>une</strong> extension à SQL permettant d’utiliser <strong>de</strong>s expressions XPath<br />

(SQL/XM) ainsi qu’<strong>une</strong> évaluation <strong>de</strong> performances.<br />

Echange <strong>de</strong> <strong>données</strong><br />

<strong>XML</strong> peut également servir <strong>de</strong> format d’échange entre les différents composants d’un système<br />

d’analyse. Plusieurs standards ont été définis dans ce but comme XCube [64] et Microsoft <strong>XML</strong>A<br />

[65] (<strong>XML</strong> for Analysis).<br />

Le projet XCube [64] propose <strong>une</strong> représentation <strong>XML</strong> dans le but d’échanger, <strong>sur</strong> un réseau,<br />

<strong>de</strong>s informations d’analyse comme <strong>de</strong>s cubes <strong>de</strong> <strong>données</strong> (XCubeFact), <strong>de</strong>s hiérarchies <strong>de</strong><br />

dimensions (XCubeDimension) et leurs schémas (XCubeSchema). Des mécanismes sont également<br />

fournis afin d’envoyer <strong>de</strong>s requêtes et recevoir <strong>de</strong>s résultats dans le but <strong>de</strong> créer un système<br />

d’analyse indépendamment <strong>de</strong> l’entrepôt <strong>de</strong> <strong>données</strong>. Les modèles définis par XCube sont très<br />

souples. En effet, il est possible <strong>de</strong> modéliser toutes sortes <strong>de</strong> hiérarchies <strong>de</strong> dimensions. En<br />

conclusion XCube peut servir comme format d’échange entre entrepôts <strong>de</strong> <strong>données</strong> et outils<br />

d’analyse dans <strong>une</strong> architecture client-serveur.<br />

<strong>XML</strong>A [65] est <strong>une</strong> spécification élaborée par Hyperion, Microsoft, SAS et SAP afin <strong>de</strong><br />

standardiser l’accès aux moteurs <strong>OLAP</strong> par le biais <strong>de</strong> services Web basés <strong>sur</strong> <strong>XML</strong> comme<br />

SOAP. <strong>XML</strong>A est donc <strong>une</strong> API qui fournit <strong>de</strong>s métho<strong>de</strong>s afin d’interroger <strong>de</strong>s entrepôts <strong>de</strong><br />

<strong>données</strong> et d’analyser <strong>de</strong> façon transparente ces <strong>données</strong> à l’ai<strong>de</strong> d’outils <strong>OLAP</strong>. De ce fait, cette<br />

spécification est très similaire à celle proposée par le projet XCube.


6.2 Systèmes d’analyse (<strong>OLAP</strong>) 72<br />

6.2.2 Systèmes natifs <strong>XML</strong><br />

Cette approche utilise <strong>XML</strong> aussi bien pour la représentation <strong>de</strong>s <strong>données</strong> que pour leur traitement.<br />

Les <strong>données</strong> sont représentées par <strong>de</strong>s arbres <strong>XML</strong> dans le moteur <strong>OLAP</strong> et sont traitées<br />

à l’ai<strong>de</strong> <strong>de</strong> langages d’interrogation pour <strong>XML</strong> comme XQuery. Cette approche n’a pas encore<br />

été largement étudiée. En effet, très peu d’étu<strong>de</strong>s <strong>sur</strong> le sujet ont été menées. Une <strong>de</strong> ces étu<strong>de</strong>s,<br />

menée par Bordawekar et al. <strong>de</strong> chez IBM mi-2005 [39], montre que le modèle multidimensionnel<br />

<strong>OLAP</strong> n’est pas adapté à l’analyse <strong>de</strong>s documents <strong>XML</strong> et propose donc <strong>une</strong> approche pour<br />

analyser <strong>de</strong>s documents <strong>XML</strong> en utilisant le modèle <strong>de</strong> <strong>données</strong> <strong>XML</strong>. Les différences principales<br />

entre les <strong>données</strong> <strong>XML</strong> et les <strong>données</strong> structurées classiques sont les suivantes :<br />

salaire<br />

division<br />

département département<br />

département groupe<br />

groupe groupe<br />

employé employé employé<br />

date <strong>de</strong><br />

naissance<br />

salaire<br />

date <strong>de</strong><br />

naissance<br />

salaire<br />

date <strong>de</strong><br />

naissance<br />

Fig. 6.1 – Exemple <strong>de</strong> modélisation <strong>XML</strong> pour un outil <strong>OLAP</strong>.<br />

Dimension<br />

Faits<br />

Me<strong>sur</strong>es<br />

⊲ Tout d’abord, les documents <strong>XML</strong> contiennent <strong>une</strong> sémantique intrinsèque <strong>de</strong> par leur<br />

structure d’arbre. En effet, les différents axes dans les <strong>données</strong> <strong>XML</strong> peuvent représenter<br />

soit <strong>une</strong> relation <strong>de</strong> contenance (HAS-A), soit <strong>une</strong> relation <strong>de</strong> sous-classe (IS-A).<br />

Les nœuds d’un arbre <strong>XML</strong> peuvent être vus comme <strong>de</strong>s membres d’<strong>une</strong> dimension, dimension<br />

déterminée par leurs éléments parents. Les feuilles <strong>de</strong> l’arbre peuvent être vues<br />

comme <strong>de</strong>s me<strong>sur</strong>es. Une illustration <strong>de</strong> ce modèle est présenté à la figure 6.1. Avec cette<br />

modélisation, les éléments <strong>XML</strong> représentant les niveaux <strong>de</strong> granularité peuvent contenir


6.2 Systèmes d’analyse (<strong>OLAP</strong>) 73<br />

<strong>de</strong>s attributs, qui sont en fait <strong>de</strong>s me<strong>sur</strong>es ou <strong>de</strong>s pré-agrégations. Dans notre exemple,<br />

les éléments groupe pourraient contenir <strong>de</strong>s me<strong>sur</strong>es tels que leur budget ou <strong>de</strong>s calculs<br />

d’agrégats comme la somme <strong>de</strong>s salaires <strong>de</strong> leur personnel.<br />

⊲ Les <strong>données</strong> <strong>XML</strong> ne respectent pas nécessairement un schéma rigi<strong>de</strong> comme les <strong>données</strong><br />

relationnelles et peuvent contenir <strong>une</strong> structure plus ou moins irrégulière. C’est pour<br />

cela qu’on parle souvent <strong>de</strong> documents semi-structurés : les documents respectent <strong>une</strong><br />

certaine structure mais cette structure est assez souple. Par exemple, un document <strong>XML</strong><br />

peut contenir <strong>de</strong>s hiérarchies récursives (figure 6.1) ou <strong>de</strong>s hiérarchies contenant différents<br />

membres. De plus, comme un document <strong>XML</strong> a un ordre, les différentes me<strong>sur</strong>es qu’il<br />

contient peuvent être sémantiquement reliées entre elles via cette relation d’ordre.<br />

⊲ Les documents <strong>XML</strong> peuvent se parcourir suivant différents axes, comme les axes XPath<br />

dont nous avons parlé dans le chapitre 4 <strong>sur</strong> les langages d’interrogation <strong>XML</strong>. Un nœud<br />

d’un arbre <strong>XML</strong> peut être accédé par <strong>de</strong> multiples chemins au contraire d’<strong>une</strong> case d’un<br />

hyper-cube dans un système <strong>OLAP</strong>.<br />

⊲ Les documents <strong>XML</strong> peuvent contenir <strong>de</strong>s <strong>données</strong> non-numériques, comme par exemple<br />

<strong>de</strong>s génomes, ce qu’il n’est pas possible <strong>de</strong> gérer avec la modélisation <strong>OLAP</strong> cubique<br />

traditionnelle.<br />

En prenant en compte ces différences <strong>de</strong> modèle <strong>de</strong> <strong>données</strong>, on peut voir apparaître <strong>de</strong>s<br />

différences dans les types d’interrogations que l’on aimerait pouvoir exécuter <strong>sur</strong> <strong>de</strong> telles <strong>données</strong><br />

<strong>XML</strong>. Bordawekar et al. dans [39] en ont i<strong>de</strong>ntifié certaines à propos du type <strong>de</strong> requêtes et du<br />

type <strong>de</strong> traitement :<br />

⊲ Premièrement, l’ordre d’un document <strong>XML</strong> est important. Il a <strong>une</strong> sémantique. Les requêtes<br />

doivent donc pouvoir exploiter cet ordre. Par exemple, si nous avons un document<br />

<strong>XML</strong> médical qui décrit différentes procédures <strong>de</strong> soins détaillées avec <strong>une</strong> liste ordonnée<br />

d’opérations à effectuer <strong>sur</strong> un patient, il serait intéressant <strong>de</strong> pouvoir interroger la <strong>base</strong><br />

<strong>de</strong> <strong>données</strong> <strong>de</strong> façon à trouver les traitements dans lesquels <strong>une</strong> première incision est faite<br />

au patient avant <strong>de</strong> l’anesthésier.<br />

⊲ Deuxièmement, l’on peut vouloir grouper <strong>de</strong>s éléments <strong>XML</strong> non seulement selon la<br />

valeur <strong>de</strong> certains <strong>de</strong> leurs attributs comme dans les systèmes classiques mais aussi selon<br />

leur chemin, exprimé par exemple par <strong>une</strong> expression XPath. Par exemple, <strong>sur</strong> la <strong>base</strong><br />

illustrée à la figure 6.1, si l’on veut grouper les employés par département, on aimerait<br />

pouvoir utiliser l’expression <strong>de</strong> chemin //<strong>de</strong>partement comme clé <strong>de</strong> groupement.<br />

⊲ Il est également nécessaire <strong>de</strong> pouvoir faire <strong>de</strong>s requêtes <strong>sur</strong> <strong>de</strong>s <strong>données</strong> non-numériques<br />

comme <strong>de</strong>s chaînes d’ADN ou <strong>de</strong>s vidéos MPEG-7.<br />

⊲ De par leur structure hiérarchique, les opérations <strong>de</strong> projection <strong>de</strong>s cubes <strong>de</strong> <strong>données</strong><br />

peuvent se faire simplement en éliminant les sous-arbres correspondant aux dimensions<br />

non choisies dans la projection, à l’ai<strong>de</strong> <strong>de</strong> l’opérateur XPath // par exemple.<br />

⊲ Prévoir <strong>de</strong>s tendances futures est <strong>une</strong> opération comm<strong>une</strong> dans les systèmes <strong>OLAP</strong> traditionnels.<br />

Cela consiste à modifier certaines me<strong>sur</strong>es et à étudier les impacts <strong>de</strong> ces<br />

changements <strong>sur</strong> toutes les <strong>données</strong>. La structure d’arbre d’un document <strong>XML</strong> permet<br />

<strong>de</strong> faire aisément <strong>une</strong> analyse structurelle, en modifiant simplement la structure <strong>de</strong> l’arbre.


6.3 Besoins d’un système <strong>OLAP</strong> basé <strong>sur</strong> <strong>XML</strong> 74<br />

Par exemple, si l’on veut analyser l’impact qu’aurait <strong>une</strong> réorganisation <strong>de</strong>s départements<br />

et <strong>de</strong>s groupes, il suffit <strong>de</strong> déplacer les éléments groupes dans d’autres éléments départements<br />

et <strong>de</strong> comparer les résultats <strong>de</strong>s requêtes <strong>sur</strong> cette nouvelle structure. Dans les<br />

systèmes <strong>OLAP</strong> traditionnels, ces analyses structurelles sont compliquées car elles nécessitent<br />

un changement dans le schéma <strong>de</strong> la <strong>base</strong> <strong>de</strong> <strong>données</strong>, ce qui est <strong>une</strong> opération<br />

ardue.<br />

Pour toutes ces raisons, les systèmes <strong>OLAP</strong> traditionnels ne conviennent pas entièrement<br />

à l’analyse <strong>de</strong> <strong>données</strong> <strong>XML</strong>. Des étu<strong>de</strong>s doivent donc être faites dans ce domaine pour créer<br />

un système <strong>OLAP</strong> permettant <strong>de</strong> gérer correctement ce type <strong>de</strong> <strong>données</strong> en prenant en compte<br />

les points soulevés ci-<strong>de</strong>ssus. Il s’agit d’i<strong>de</strong>ntifier les manquements <strong>de</strong>s outils <strong>XML</strong> comme les<br />

langages et <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>native</strong>s afin <strong>de</strong> pouvoir les utiliser pour faire <strong>de</strong> l’analyse <strong>de</strong> <strong>données</strong><br />

<strong>XML</strong>. Il faudra adapter les langages existants, trouver <strong>de</strong>s techniques pour gérer d’immenses<br />

documents <strong>XML</strong> (<strong>de</strong> l’ordre du Tera-octet), déterminer <strong>de</strong>s interfaces utilisateurs pour visualiser<br />

ces <strong>données</strong> hiérarchiques semi-structurées, etc. Ceci est un sujet très novateur. Le nombre<br />

d’étu<strong>de</strong>s <strong>sur</strong> le sujet est très limité et aucun outil existant ne permet <strong>de</strong> faire <strong>de</strong> l’analyse<br />

performante <strong>sur</strong> <strong>de</strong>s <strong>données</strong> <strong>XML</strong>.<br />

6.3 Besoins d’un système <strong>OLAP</strong> basé <strong>sur</strong> <strong>XML</strong><br />

Dans cette section, nous allons prendre en compte les différents points soulevés dans la section<br />

précé<strong>de</strong>nte à propos <strong>de</strong>s systèmes <strong>OLAP</strong> <strong>XML</strong> natifs et essayer d’i<strong>de</strong>ntifier les caractéristiques<br />

nécessaires à un tel système. Au besoin, nous exposerons brièvement <strong>de</strong>s pistes <strong>de</strong> solutions. Nous<br />

commencerons par parler <strong>de</strong>s aspects modélisation et in<strong>de</strong>xation, en présentant le problème et<br />

en proposant <strong>de</strong>s débuts <strong>de</strong> solutions. Ensuite, nous nous attar<strong>de</strong>rons plus longuement <strong>sur</strong> les<br />

problèmes <strong>de</strong> langage en analysant la faisabilité d’utiliser XQuery pour <strong>de</strong>s requêtes d’analyse.<br />

6.3.1 Modélisation<br />

D’un point <strong>de</strong> vue modélisation, il est intéressant d’utiliser la structure d’arbre intrinsèque<br />

aux documents <strong>XML</strong> pour représenter les hiérarchies <strong>de</strong> dimension. Un modèle comme celui<br />

présenté à la figure 6.1 paraît approprié. Cependant, ce modèle tel qu’il est présenté ne permet<br />

<strong>de</strong> gérer qu’<strong>une</strong> hiérarchie <strong>de</strong> dimension. Dans les systèmes <strong>OLAP</strong>, on s’attend à pouvoir gérer<br />

plusieurs dimensions comme les dimensions temporelles ou géographiques. Il faudrait donc<br />

adapter ce modèle pour pouvoir gérer plusieurs dimensions.<br />

Dans le modèle <strong>de</strong> Bordawekar et al. (figure 6.1), les dimensions, les faits et les me<strong>sur</strong>es<br />

sont contenus dans le même document, ce qui empêche la gestion <strong>de</strong> plusieurs dimensions. Nous<br />

proposons donc <strong>de</strong> séparer les dimensions et les faits, un peu à l’image d’un schéma en étoile. Nous<br />

aurions donc n arbres <strong>XML</strong> représentant chacun <strong>une</strong> dimension parmi les n et un document <strong>XML</strong><br />

comprenant les faits et me<strong>sur</strong>es. Les feuilles <strong>de</strong>s arbres <strong>de</strong> dimensions contiendraient <strong>une</strong> liste <strong>de</strong><br />

références aux faits associés. Ainsi, les <strong>données</strong> seraient déjà groupées par leur plus fins niveaux<br />

<strong>de</strong> granularité <strong>de</strong> leurs dimensions. On peut comparer cette modélisation à un hyper-cube <strong>OLAP</strong>


6.3 Besoins d’un système <strong>OLAP</strong> basé <strong>sur</strong> <strong>XML</strong> 75<br />

semestre1<br />

2006<br />

dimension<br />

temporelle<br />

semestre2<br />

mars novembre octobre<br />

Flandre<br />

Belgique<br />

Anvers<br />

Namur<br />

Wallonie<br />

dimension<br />

géographique<br />

Liège<br />

Fig. 6.2 – Exemple <strong>de</strong> modélisation pour un cube <strong>OLAP</strong> en <strong>XML</strong>.<br />

classique. Les unités <strong>de</strong>s différentes arêtes correspondraient aux valeurs <strong>de</strong> ces plus fins niveaux<br />

<strong>de</strong> granularité, chaque arête représenterait <strong>une</strong> dimension et les cases représentants les me<strong>sur</strong>es<br />

<strong>de</strong>s faits correspon<strong>de</strong>raient à ses coor<strong>données</strong>. Ces cases seraient obtenues par l’intersection <strong>de</strong>s<br />

listes <strong>de</strong> références aux faits en fonction <strong>de</strong> leur dimension. Les requêtes <strong>sur</strong> un hyper-cube<br />

<strong>OLAP</strong> sont principalement <strong>de</strong>s projections <strong>de</strong>s faits <strong>sur</strong> un ou plusieurs axes <strong>de</strong> dimensions.<br />

Il s’agit donc d’extraire <strong>de</strong>s tranches du cube. Dans notre modèle, si nous voulions réaliser<br />

<strong>une</strong> projection du cube <strong>sur</strong> les axes géographique et temporel, il suffirait <strong>de</strong> faire l’intersection<br />

<strong>de</strong>s listes <strong>de</strong> références contenues dans les feuilles <strong>de</strong>s arbres <strong>de</strong> dimensions. Pour illustrer ce<br />

concept, nous avons représenté ce modèle dans la figure 6.2 et un exemple <strong>de</strong> co<strong>de</strong> XQuery<br />

simplifié permettant <strong>de</strong> réaliser cette projection en figure 6.3.<br />

for $region in // geographique // region<br />

for $mois in // temporelle // mois<br />

let $bons_faits := ( $region // faits intersect $mois // faits )<br />

return<br />

<br />

{ $region }<br />

{ $mois }<br />

{ count ( $bons_faits )}<br />

<br />

Fig. 6.3 – Exemple <strong>de</strong> projection <strong>sur</strong> le modèle <strong>de</strong> la figure 6.2.<br />

Nous n’entrerons pas dans les détails <strong>de</strong> ce sujet car nous avons voulu nous focaliser principalement<br />

<strong>sur</strong> l’utilisation d’XQuery à <strong>de</strong>s fins d’analyse.<br />

faits


6.3 Besoins d’un système <strong>OLAP</strong> basé <strong>sur</strong> <strong>XML</strong> 76<br />

6.3.2 In<strong>de</strong>xation<br />

Les requêtes <strong>sur</strong> un moteur <strong>OLAP</strong> sont principalement multidimensionnelles. On a besoin<br />

<strong>de</strong> pouvoir rapi<strong>de</strong>ment accé<strong>de</strong>r à un ensemble <strong>de</strong> faits qui respectent un nombre variable <strong>de</strong><br />

conditions. Les expressions XPath du type <strong>de</strong> celles illustrées à la figure 6.4 doivent pouvoir<br />

s’exécuter très rapi<strong>de</strong>ment. Il convient donc d’avoir <strong>de</strong>s structures d’in<strong>de</strong>x multidimensionnelles<br />

performantes dans ces différents cas. Ces in<strong>de</strong>xes permettent <strong>de</strong> sélectionner rapi<strong>de</strong>ment les<br />

éléments dont les clés ont <strong>une</strong> valeur exacte mais également ceux dont les clés sont comprises<br />

dans un intervalle donné. Idéalement, il faudrait qu’un seul parcours d’in<strong>de</strong>x soit nécessaire<br />

pour évaluer ce genre d’expressions. Des structures ayant <strong>de</strong>s propriétés similaires aux arbres B<br />

<strong>de</strong>vraient permettre d’effectuer ce genre d’opérations rapi<strong>de</strong>ment.<br />

// objet [ dimension1 = 23 and dimension2 = 47 and dimension3 = 98]<br />

// objet [ dimension1 > 10 and dimension1 < 25 and ...]<br />

Fig. 6.4 – Exemple d’expression XPath multidimensionnelle.<br />

Il serait donc utile d’analyser les structures multidimensionnelles existantes comme les arbres<br />

R [66], variante multidimensionnelle <strong>de</strong>s arbres B présentés précé<strong>de</strong>mment au point 46. En<br />

effet, <strong>de</strong> nombreuses structures multidimensionnelles ont été étudiées abondamment ces <strong>de</strong>rnières<br />

années et il conviendrait donc d’évaluer leur performance dans notre cas précis et au besoin les<br />

adapter aux spécifications du domaine comme, par exemple, les expressions <strong>de</strong> chemin XPath.<br />

En l’occurence, ces structures d’in<strong>de</strong>x doivent être suffisamment efficaces en terme <strong>de</strong> recherche<br />

et également en terme <strong>de</strong> place. En effet, les in<strong>de</strong>xes, pour être efficaces, doivent être<br />

copiés en mémoire vive afin d’accélerer leur accès. Il ne faut pas qu’ils prennent trop <strong>de</strong> place<br />

sinon les performances seraient nettement diminuées et l’on perdrait l’avantage <strong>de</strong> l’in<strong>de</strong>xation.<br />

Ces structures doivent pouvoir supporter un nombre petit comme élevé <strong>de</strong> dimensions car on<br />

ne peut prévoir le nombre <strong>de</strong> dimensions à gérer. Il conviendrait donc <strong>de</strong> trouver <strong>de</strong>s structures<br />

dont la taille et la complexité d’accès ne soient pas trop dépendantes du nombre <strong>de</strong> dimensions.<br />

Comme pour la modélisation, ce sujet sort un peu du cadre <strong>de</strong> ce mémoire. En effet, nous<br />

avons voulu nous concentrer <strong>sur</strong> la faisabilité d’utiliser le langage XQuery pour écrire <strong>de</strong>s requêtes<br />

d’analyses.<br />

6.3.3 Langage<br />

Comme nous l’avons vu dans l’introduction, il existe plusieurs langages d’interrogation <strong>de</strong><br />

<strong>données</strong> <strong>XML</strong>. XQuery nous paraît être le plus prometteur, se définissant comme le SQL pour<br />

<strong>XML</strong>. Afin <strong>de</strong> se rendre compte <strong>de</strong> la faisabilité d’utiliser ce langage pour <strong>de</strong>s requêtes d’analyse<br />

<strong>sur</strong> <strong>de</strong>s documents <strong>XML</strong>, nous nous sommes mis à la recherche d’exemples d’entrepôts existants.<br />

Ne trouvant pas un tel exemple complet, nous avions décidé <strong>de</strong> créer un scénario d’entrepôt <strong>de</strong><br />

<strong>données</strong> pour un opérateur téléphonique. Nous avons créé un schéma <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> en étoile<br />

ainsi que différentes requêtes types d’analyse. Pendant nos recherches, nous avons découvert qu’il


6.4 Le test TPC-H 77<br />

existait <strong>de</strong>s scénarios d’évaluation <strong>de</strong> performances pour <strong>de</strong>s entrepôts, notamment le test TPC-<br />

H. Nous avons donc décidé <strong>de</strong> nous <strong>base</strong>r <strong>sur</strong> ce test afin d’évaluer s’il était raisonnable d’utiliser<br />

XQuery dans notre cas particulier. Pour arriver à ces fins, nous avons retenu le moteur <strong>de</strong> <strong>base</strong><br />

<strong>de</strong> <strong>données</strong> <strong>XML</strong> natif eXist, qui implémente XQuery <strong>de</strong> façon complète. La section suivante est<br />

entièrement consacrée à ce test et aux conclusions que l’on peut en tirer.<br />

6.4 Le test TPC-H<br />

TPC, Transaction Processing Performance Council, est un organisme sans but lucratif qui<br />

édite <strong>de</strong>s scénarios d’évaluation <strong>de</strong> performance <strong>de</strong>stiné aux systèmes <strong>de</strong> gestion <strong>de</strong> <strong>base</strong> <strong>de</strong><br />

<strong>données</strong>. Son objectif est <strong>de</strong> fournir <strong>de</strong>s <strong>données</strong> d’évaluation objectives à l’industrie. TPC est<br />

composé <strong>de</strong> membres venant <strong>de</strong> l’industrie informatique parmi lesquels Microsoft, Oracle, Intel,<br />

Sun, HP, . . . TPC propose plusieurs types <strong>de</strong> scénarios en fonction du type <strong>de</strong> <strong>base</strong>s <strong>de</strong> <strong>données</strong>.<br />

TPC-App est un test pour les serveurs d’applications et les services Web, TPC-C pour les<br />

systèmes transactionnels classiques et TPC-H pour les systèmes d’ai<strong>de</strong> à la décision.<br />

TPC Benchmark H (TPC-H) [67] est <strong>une</strong> évaluation <strong>de</strong>s performances pour un système d’ai<strong>de</strong><br />

à la décision. Elle comprend <strong>une</strong> série <strong>de</strong> 22 requêtes orientées business, requêtes typiquement<br />

exécutées <strong>sur</strong> <strong>de</strong>s entrepôts <strong>de</strong> <strong>données</strong>. Les <strong>données</strong> à analyser sont obtenues à l’ai<strong>de</strong> d’un<br />

générateur fourni. Pour vali<strong>de</strong>r les requêtes, les résultats attendus sont fournis. Ce test a pour<br />

but <strong>de</strong> comparer les performances <strong>de</strong>s systèmes décisionnels. Il a été exécuté <strong>sur</strong> <strong>de</strong>s systèmes<br />

comme SQL Server, IDB DB2 et Oracle, cela pour différentes sortes <strong>de</strong> serveurs et d’architectures.<br />

Nous avons décidé d’utiliser ces requêtes afin d’évaluer leur faisabilité pour un entrepôt<br />

<strong>XML</strong>. Le but n’est pas <strong>de</strong> comparer les performances d’<strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> par rapport<br />

aux systèmes relationnels commerciaux mais <strong>de</strong> profiter <strong>de</strong> la pertinence <strong>de</strong> ces requêtes dans<br />

le domaine <strong>de</strong>s entrepôts <strong>de</strong> <strong>données</strong>, et tout particulièrement vérifier que le langage XQuery<br />

permet d’écrire facilement ce genre <strong>de</strong> requêtes.<br />

6.4.1 Traduction <strong>de</strong>s <strong>données</strong> sources<br />

Dans cette optique, nous avons commencé par traduire les <strong>données</strong> relationnelles fournies en<br />

documents <strong>XML</strong>. Le schéma logique <strong>de</strong>s tables <strong>de</strong> <strong>données</strong> relationnelles fournies par TPC-H est<br />

illustré à la figure 6.5. Il s’agit d’<strong>une</strong> modélisation en flocons <strong>de</strong> neige articulée autour <strong>de</strong>s tables<br />

<strong>de</strong> faits LINEITEMS et ORDERS, modélisation dont nous avons déjà parlé lors <strong>de</strong> l’introduction<br />

<strong>sur</strong> les entrepôts <strong>de</strong> <strong>données</strong>, au chapitre 2. Pour faire simple, nous avons traduit ces tables<br />

<strong>de</strong> la manière suivante : chaque table sera représentée par un document <strong>XML</strong>. Ce document<br />

contiendra toutes les lignes <strong>de</strong> la table traduites en éléments <strong>XML</strong>. Cette traduction est très<br />

simple et peut donc être réalisée à l’ai<strong>de</strong> d’un script, ce que nous avons fait. Par exemple, pour<br />

la table REGION <strong>de</strong> la figure 6.5, la traduction <strong>XML</strong> est présentée à la figure 6.6.


6.4 Le test TPC-H 78<br />

PART (P_)<br />

SF*200,000<br />

PARTKEY<br />

NAME<br />

MFGR<br />

BRAND<br />

TYPE<br />

SIZE<br />

CONTAINER<br />

RETAILPRICE<br />

COMMENT<br />

SUPPLIER (S_)<br />

SF*10,000<br />

SUPPKEY<br />

NAME<br />

ADDRESS<br />

NATIONKEY<br />

PHONE<br />

ACCTBAL<br />

COMMENT<br />

PARTSUPP (PS_)<br />

SF*800,000<br />

PARTKEY<br />

SUPPKEY<br />

AVAILQTY<br />

SUPPLYCOST<br />

COMMENT<br />

CUSTOMER (C_)<br />

SF*150,000<br />

CUSTKEY<br />

NAME<br />

ADDRESS<br />

NATIONKEY<br />

PHONE<br />

ACCTBAL<br />

MKTSEGMENT<br />

COMMENT<br />

NATION (N_)<br />

25<br />

NATIONKEY<br />

NAME<br />

REGIONKEY<br />

COMMENT<br />

< regions ><br />

<br />

Europe <br />

< comment >None <br />

<br />

(...)<br />

<br />

LINEITEM (L_)<br />

SF*6,000,000<br />

ORDERKEY<br />

PARTKEY<br />

SUPPKEY<br />

LINENUMBER<br />

QUANTITY<br />

EXTENDEDPRICE<br />

DISCOUNT<br />

TAX<br />

RETURNFLAG<br />

LINESTATUS<br />

SHIPDATE<br />

COMMITDATE<br />

RECEIPTDATE<br />

SHIPINSTRUCT<br />

SHIPMODE<br />

COMMENT<br />

REGION (R_)<br />

5<br />

REGIONKEY<br />

NAME<br />

COMMENT<br />

ORDERS (O_)<br />

SF*1,500,000<br />

ORDERKEY<br />

CUSTKEY<br />

ORDERSTATUS<br />

TOTALPRICE<br />

ORDERDATE<br />

ORDER-<br />

PRIORITY<br />

CLERK<br />

Fig. 6.5 – Schéma logique <strong>de</strong> la <strong>base</strong> TPC-H c○TPC.<br />

SHIP-<br />

PRIORITY<br />

COMMENT<br />

Fig. 6.6 – Fragment <strong>de</strong> traduction <strong>XML</strong> <strong>de</strong>s <strong>données</strong> sources du test TPC-H.<br />

6.4.2 Traduction <strong>de</strong>s requêtes<br />

Une fois ces <strong>données</strong> traduites et intégrées dans eXist, nous nous sommes lancés dans la<br />

traduction <strong>de</strong>s requêtes fournies par TPC-H. Ces requêtes sont écrites en SQL standard. Nous<br />

avons donc dû les traduire en XQuery. Comme ces requêtes sont très longues et prennent donc<br />

beaucoup <strong>de</strong> place, nous avons décidé <strong>de</strong> n’en présenter que quelques <strong>une</strong>s, jugées intéressantes.


6.4 Le test TPC-H 79<br />

Requête simple<br />

Pour commencer, observons la requête numéro 6 du test TPC-H. Il s’agit d’<strong>une</strong> simple requête<br />

SQL qui a pour but <strong>de</strong> quantifier la somme <strong>de</strong> revenus supplémentaires qu’<strong>une</strong> entreprise pourrait<br />

gagner en éliminant certaines réductions <strong>de</strong> prix <strong>sur</strong> un intervalle d’un an. Cette requête peut<br />

ai<strong>de</strong>r <strong>une</strong> entreprise à trouver <strong>de</strong>s sources <strong>de</strong> revenus. La figure 6.7 présente cette requête en<br />

SQL telle que fournie par TPC-H et la figure 6.8 sa traduction en XQuery <strong>sur</strong> les <strong>données</strong> <strong>XML</strong><br />

telles que nous les avons définies.<br />

SELECT sum ( l_exten<strong>de</strong>dprice * l_discount ) as revenue<br />

FROM lineitem<br />

WHERE l_shipdate >= date ’1994 -01 -01 ’<br />

AND l_shipdate < date ’1994 -01 -01 ’ + interval ’1’ year<br />

AND l_discount between 0.06 - 0.01 and 0.06 + 0.01<br />

AND l_quantity < 24;<br />

Fig. 6.7 – Requête 6 du test TPC-H en SQL.<br />

let $lineitem := document (" lineitem . xml ")/ lineitems / lineitem<br />

[xs: date (./ shipdate ) >= xs: date ("1994 -01 -01")<br />

and xs: date (./ shipdate ) < (xs: date ("1994 -01 -01") + xdt :<br />

yearMonthDuration (" P1Y "))<br />

and xs: double (./ discount ) >= xs: double (0.06) - xs: double (0.01)<br />

and xs: double (./ discount )


6.4 Le test TPC-H 80<br />

telle que fournie par TPC-H et la figure 6.10 sa traduction en XQuery <strong>sur</strong> notre <strong>base</strong> <strong>de</strong> <strong>données</strong><br />

<strong>XML</strong>.<br />

SELECT l_or<strong>de</strong>rkey ,<br />

sum ( l_exten<strong>de</strong>dprice *(1 - l_discount )) as revenue ,<br />

o_or<strong>de</strong>rdate ,<br />

o_shippriority<br />

FROM customer , or<strong>de</strong>rs , lineitem<br />

WHERE c_mktsegment = ’[ SEGMENT ]’<br />

AND c_custkey = o_custkey<br />

AND l_or<strong>de</strong>rkey = o_or<strong>de</strong>rkey<br />

AND o_or<strong>de</strong>rdate < date ’[ DATE ]’<br />

AND l_shipdate > date ’[ DATE ]’<br />

GROUP BY l_or<strong>de</strong>rkey , o_or<strong>de</strong>rdate , o_shippriority<br />

ORDER BY revenue <strong>de</strong>sc , o_or<strong>de</strong>rdate ;<br />

Fig. 6.9 – Requête 3 du test TPC-H en SQL.<br />

for $o_or<strong>de</strong>rdate in distinct - values ( document (" or<strong>de</strong>r . xml ") // or<strong>de</strong>r [<br />

or<strong>de</strong>rdate lt xs: date ("[ DATE ]") ]/ or<strong>de</strong>rdate )<br />

for $o_shippriority in distinct - values ( document (" or<strong>de</strong>r . xml ") // or<strong>de</strong>r /<br />

shippriority )<br />

for $l_or<strong>de</strong>rkey in distinct - values ( document (" lineitem . xml ") // lineitem /<br />

or<strong>de</strong>rkey )<br />

let $or<strong>de</strong>r := document (" or<strong>de</strong>r . xml ") // or<strong>de</strong>r [ @id = $l_or<strong>de</strong>rkey<br />

and or<strong>de</strong>rdate eq $o_or<strong>de</strong>rdate<br />

and shippriority eq $o_shippriority ]<br />

let $lineitems := document (" lineitem . xml ") // lineitem [ or<strong>de</strong>rkey = $or<strong>de</strong>r /<br />

@id ]<br />

let $customer := document (" customer . xml ") // customer [ @id = $or<strong>de</strong>r / custkey<br />

]<br />

let $revenue := sum ( $lineitems ( exten<strong>de</strong>dprice *(1 - discount )))<br />

where fn: exists ( $or<strong>de</strong>r )<br />

and $customer / mktsegment = "[ SEGMENT ]"<br />

and $lineitems / shipdate gt xs: date ("[ DATE ]")<br />

or<strong>de</strong>r by revenue <strong>de</strong>scending , $o_or<strong>de</strong>rdate<br />

return<br />

<br />

{ $l_or<strong>de</strong>rkey }<br />

{ $revenue }<br />

{ $o_or<strong>de</strong>rdate }<br />

< o_shippriority >{ $o_shippriority } <br />

<br />

Fig. 6.10 – Requête 3 du test TPC-H en XQuery.<br />

La traduction <strong>de</strong> cette requête est beaucoup plus compliquée que celle <strong>de</strong> la requête 6


6.4 Le test TPC-H 81<br />

précé<strong>de</strong>mment traduite. Il s’agit d’<strong>une</strong> triple boucle, chac<strong>une</strong> itérant <strong>sur</strong> les valeurs distinctes<br />

(distinct-values()) <strong>de</strong>s clés <strong>de</strong> groupement. A l’intérieur <strong>de</strong> ces boucles, nous sélectionnons les<br />

éléments correspondant aux valeurs actuelles <strong>de</strong>s clés <strong>de</strong> groupement et respectant les conditions<br />

telles que le segment du client et la date <strong>de</strong> la comman<strong>de</strong>. Il est à noter que dans la clause where,<br />

nous <strong>de</strong>vons tester l’existence d’un tel groupe pour que les résultats soient similaires à ceux <strong>de</strong><br />

la requête en SQL. En effet, l’opérateur GROUP BY en SQL ne renvoie pas les groupes vi<strong>de</strong>s, il<br />

faut donc utiliser la fonction XQuery exists() afin <strong>de</strong> s’as<strong>sur</strong>er que les éventuels groupes vi<strong>de</strong>s<br />

ne se retrouvent pas dans les résultats. Par contre, <strong>une</strong> clause ORDER BY est disponible dans les<br />

<strong>de</strong>ux langages et leur fonctionnement est similaire. Il n’y a donc pas <strong>de</strong> problème <strong>de</strong> ce côté là.<br />

Nous pouvons remarquer ici que cette traduction n’est pas simple. En effet, il faut écrire la<br />

requête XQuery dans le sens opposé <strong>de</strong> celle en SQL. En SQL, on utilise l’opérateur GROUP BY<br />

à la fin <strong>de</strong> la requête. Celui-ci agit comme un filtre, qui va grouper les tuples renvoyés par la<br />

clause WHERE en post-traitement. En XQuery, il n’existe pas d’opérateur <strong>de</strong> groupement. Il faut<br />

donc cycler <strong>sur</strong> les différentes valeurs <strong>de</strong>s clés <strong>de</strong> groupement et à chaque cycle, sélectionner les<br />

éléments <strong>XML</strong> correspondants à ces clés. Le groupement doit donc être pensé au début <strong>de</strong> la<br />

requête, à l’ai<strong>de</strong> <strong>de</strong>s clauses for. Nous verrons dans le chapitre suivant que ce type <strong>de</strong> groupement<br />

a un effet désastreux <strong>sur</strong> les performances, comparé à un groupement en post-traitement comme<br />

en SQL. Le chapitre suivant est entièrement consacré aux groupements à l’ai<strong>de</strong> d’XQuery. Nous y<br />

proposerons un opérateur GROUP BY pour XQuery ainsi qu’un algorithme permettant d’effectuer<br />

ce groupement en post-traitement.<br />

<strong>Requêtes</strong> imbriquées<br />

La requête numéro 4 du test TPC-H permet <strong>de</strong> déterminer si le système <strong>de</strong> priorité <strong>de</strong>s<br />

comman<strong>de</strong>s d’<strong>une</strong> entreprise fonctionne et donne <strong>une</strong> évaluation <strong>de</strong> la satisfaction <strong>de</strong>s clients.<br />

Cette requête sélectionne les comman<strong>de</strong>s pour lesquels au moins un article n’a pas été livré en<br />

temps et en heure au client, cela <strong>sur</strong> <strong>une</strong> pério<strong>de</strong> d’un trimestre. Les résultats renvoyés sont <strong>une</strong><br />

liste du nombre <strong>de</strong> ces comman<strong>de</strong>s par niveau <strong>de</strong> priorité. Il s’agit d’<strong>une</strong> requête <strong>de</strong> groupement<br />

dans laquelle <strong>une</strong> autre requête est imbriquée. La requête imbriquée permet <strong>de</strong> détecter les<br />

lignes <strong>de</strong>s comman<strong>de</strong>s dont les produits n’ont pas été livrés à temps et donc <strong>de</strong> sélectionner les<br />

comman<strong>de</strong>s associées à ces lignes. La figure 6.11 présente cette requête en SQL telle que fournie<br />

par TPC-H et la figure 6.12 sa traduction en XQuery <strong>sur</strong> notre <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong>.<br />

De nouveau, il s’agit d’un groupement et donc, en XQuery, il faut cycler <strong>sur</strong> les différentes<br />

valeurs <strong>de</strong>s clés <strong>de</strong> groupement. Dans chaque cycle, nous sélectionnons les comman<strong>de</strong>s qui satisfont<br />

les conditions temporelles ainsi que la valeur <strong>de</strong> la clé <strong>de</strong> groupement. Pour ces comman<strong>de</strong>s,<br />

nous sélectionnons les lignes qui correspon<strong>de</strong>nt aux produits qui n’ont pas été livrés à temps.<br />

Nous filtrons ensuite les comman<strong>de</strong>s ainsi sélectionnées pour ne gar<strong>de</strong>r que celles dont au moins<br />

un produit a été livré en retard. Tout cette sélection se fait dans <strong>une</strong> requête imbriquée (remarquez<br />

les { }). Une fois <strong>de</strong> plus, la traduction en XQuery ne ressemble pas directement à la<br />

requête originale en SQL mais nous pouvons remarquer que l’imbrication <strong>de</strong> requêtes ne pose<br />

pas <strong>de</strong> problème en XQuery. Il faut se rendre compte que SQL et XQuery sont <strong>de</strong>s langages assez<br />

différents bien qu’ils possè<strong>de</strong>nt <strong>de</strong>s caractéristiques similaires comme le découpage en plusieurs


6.4 Le test TPC-H 82<br />

SELECT o_or<strong>de</strong>rpriority , count (*) as or<strong>de</strong>r_count<br />

FROM or<strong>de</strong>rs<br />

WHERE o_or<strong>de</strong>rdate >= date ’[ DATE ]’<br />

AND o_or<strong>de</strong>rdate < date ’[ DATE ]’ + interval ’3’ month<br />

AND exists (<br />

SELECT *<br />

FROM lineitem<br />

WHERE l_or<strong>de</strong>rkey = o_or<strong>de</strong>rkey<br />

AND l_commitdate < l_receiptdate<br />

)<br />

GROUP BY o_or<strong>de</strong>rpriority<br />

ORDER BY o_or<strong>de</strong>rpriority<br />

Fig. 6.11 – Requête 4 du test TPC-H en SQL.<br />

for $o_or<strong>de</strong>rpriority in distinct - values ( document (" or<strong>de</strong>r . xml ") // or<strong>de</strong>r /<br />

or<strong>de</strong>rpriority )<br />

let $or<strong>de</strong>rs := {<br />

for $or<strong>de</strong>r in document (" or<strong>de</strong>r . xml ") // or<strong>de</strong>r [ priority eq<br />

$o_or<strong>de</strong>rpriority<br />

and or<strong>de</strong>rdate ge xs: date ("[ DATE ]")<br />

and or<strong>de</strong>rdate lt op:add - dayTimeDuration -from - date (<br />

xs: date ("[ DATE ]") ,xs: dateTimeDuration (" P90D "))]<br />

let $lineitems := document (" lineitem . xml ") // lineitem [ or<strong>de</strong>rkey eq<br />

$or<strong>de</strong>r / @id<br />

and commitdate lt receiptdate ]<br />

where exists ( $lineitems )<br />

return { $or<strong>de</strong>r }<br />

}<br />

where exists ( $or<strong>de</strong>rs )<br />

or<strong>de</strong>r by $o_or<strong>de</strong>rpriority<br />

return<br />

<br />

< o_or<strong>de</strong>rpriority >{ $o_or<strong>de</strong>rpriority } <br />

{ count ( $or<strong>de</strong>rs )}<br />

<br />

Fig. 6.12 – Requête 4 du test TPC-H en XQuery.<br />

clauses. En effet, nous ne gérons pas ici <strong>de</strong>s ensembles <strong>de</strong> lignes venant d’un tableau, mais plutôt<br />

<strong>de</strong>s ensembles d’éléments <strong>XML</strong> plus ou moins structurés en provenance d’un arbre. Une réflexion<br />

est donc souvent nécessaire pour traduire <strong>une</strong> requête SQL en XQuery ou l’inverse. Cependant,<br />

ces <strong>de</strong>ux langages sont assez simples à comprendre et les requêtes ne sont pas plus difficiles à<br />

écrire dans un langage que dans l’autre. Les requêtes <strong>de</strong> groupement forcent toutefois à retourner<br />

totalement la requête et donc la façon <strong>de</strong> procé<strong>de</strong>r pour parvenir aux mêmes résultats.


6.5 Conclusions 83<br />

6.5 Conclusions<br />

En conclusion, nous pouvons constater qu’il manque à XQuery au moins un mécanisme<br />

approprié <strong>de</strong>stiné à effectuer <strong>de</strong>s groupements <strong>de</strong> <strong>données</strong> par valeurs. Le chapitre suivant y est<br />

entièrement consacré.<br />

Hormis ce point, bien que les requêtes ne soient pas aisées à traduire <strong>de</strong> par la nature différente<br />

<strong>de</strong>s <strong>données</strong> qu’elles traitent et <strong>de</strong> par leurs syntaxes hétérogènes, nous ne voyons pas d’autre<br />

manquement grave à la syntaxe <strong>de</strong> XQuery pour rédiger <strong>de</strong>s requêtes d’analyse <strong>sur</strong> un entrepôt<br />

<strong>de</strong> <strong>données</strong>. Des améliorations <strong>de</strong>vront être faites en termes d’in<strong>de</strong>xation multidimensionnelle et<br />

d’optimisation <strong>de</strong>s requêtes afin d’atteindre <strong>de</strong>s performances acceptables. Cependant, il semble<br />

que le pouvoir d’expression <strong>de</strong> XQuery, contrairement à sa syntaxe, soit largement suffisant pour<br />

notre problème.<br />

Dans le chapitre suivant, nous allons faire <strong>une</strong> analyse <strong>de</strong>s performances que l’on pourrait<br />

gagner grâce à un opérateur <strong>de</strong> groupement dans XQuery.


Chapitre 7<br />

Les groupements en XQuery<br />

Dans le chapitre précé<strong>de</strong>nt, nous avons analysé la manière dont XQuery peut être utilisé à <strong>de</strong>s<br />

fins d’analyse. Les requêtes d’analyse se basant essentiellement <strong>sur</strong> <strong>de</strong>s groupements <strong>de</strong> <strong>données</strong><br />

par valeurs, dans ce chapitre, nous nous attar<strong>de</strong>rons particulièrement <strong>sur</strong> ceux-ci. XQuery ne<br />

possè<strong>de</strong> pas d’opérateur spécifique <strong>de</strong> groupement au contraire <strong>de</strong> SQL. Les groupements sont<br />

possibles en XQuery à l’ai<strong>de</strong> d’<strong>une</strong> combinaison <strong>de</strong> fonctions mais celle-ci entraîne un nombre<br />

important d’itérations. Nous allons donc proposer un opérateur <strong>de</strong> groupement pour XQuery et<br />

faire <strong>une</strong> analyse <strong>de</strong>s gains <strong>de</strong> performance obtenus.<br />

Contenu<br />

7.1 Base <strong>de</strong> <strong>données</strong> source . . . . . . . . . . . . . . . . . . . . . . . . . . . 84<br />

7.2 <strong>Requêtes</strong> d’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86<br />

7.3 Groupements en XQuery . . . . . . . . . . . . . . . . . . . . . . . . . . 88<br />

7.4 Scénario d’évaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91<br />

7.5 Analyse <strong>de</strong>s résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96<br />

7.6 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97<br />

7.1 Base <strong>de</strong> <strong>données</strong> source<br />

Considérons <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> composée d’un seul fichier plat comman<strong>de</strong>s.xml représenté<br />

partiellement <strong>sur</strong> la figure 7.1. Considérons également son équivalent relationnel présenté<br />

à la figure 7.2. Dans la suite <strong>de</strong> ce chapitre, nous nous référerons à ces exemples.<br />

Une comman<strong>de</strong> a comme dimensions le client, le magasin, la date, le ven<strong>de</strong>ur et les articles<br />

vendus. Les me<strong>sur</strong>es sont le prixTTC et le statut <strong>de</strong> la comman<strong>de</strong>. Les différents niveaux<br />

<strong>de</strong> granularité <strong>de</strong> la dimension géographique (magasin) sont endroit, co<strong>de</strong>Postal, ville, pays<br />

et continent. Nous supposons que les hiérarchies <strong>de</strong> dimensions sont symétriques (un co<strong>de</strong>Postal<br />

est inclus dans <strong>une</strong> seule ville, <strong>une</strong> ville dans un seul pays et ainsi <strong>de</strong> suite). Les autres<br />

dimensions sont organisées d’<strong>une</strong> manière similaire.<br />

84


7.1 Base <strong>de</strong> <strong>données</strong> source 85<br />

< comman<strong>de</strong>s ><br />

< comman<strong>de</strong> id="1"><br />

<br />

Verhaegen Boris <br />

< endroit >Rue <strong>de</strong>s Metaux , 11 <br />

Bruxelles <br />

< co<strong>de</strong>Postal >1040 <br />

Belgique <br />

< continent >UE <br />

Etudiant <br />

<br />

< magasin id="1"><br />

Magasin Central <br />

< endroit > Chaussee <strong>de</strong> Wavre , 23 <br />

Bruxelles <br />

< co<strong>de</strong>Postal >1050 <br />

Belgique <br />

< continent >UE <br />

Grossiste <br />

<br />

2006 05 01 <br />

< ven<strong>de</strong>ur id=" 5985 "><br />

Dupond <br />

Pierre <br />

3<br />

<br />

< prixTTC unit =" EUR ">724 ,19 <br />

<br />

<br />

< article id=" 256 "><br />

Lampe <strong>de</strong> bureau <br />

< famille > Eclairage <br />

< categorie > Materiel <strong>de</strong> bureau <br />

59 ,85 <br />

21 <br />

<br />

< quantite >10 <br />

<br />

<br />

paye <br />

<br />

(...)<br />

<br />

Fig. 7.1 – Exemple <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> plate.


7.2 <strong>Requêtes</strong> d’analyse 86<br />

La modélisation <strong>de</strong> la <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>XML</strong> n’est pas optimale en terme <strong>de</strong> taille. En effet,<br />

pour éviter la redondance, les éléments client, magasin, ven<strong>de</strong>ur et article <strong>de</strong>vraient se<br />

trouver dans d’autres fichiers <strong>XML</strong>. Cependant, nous utiliserons cette modélisation pour simplifier<br />

les requêtes XQuery en éliminant les jointures et ainsi mettre en évi<strong>de</strong>nce la nécessité <strong>de</strong><br />

l’opérateur group by.<br />

Comman<strong>de</strong>s<br />

id client id magasin id date ven<strong>de</strong>ur id prixTTC statut<br />

Localisations<br />

id endroit ville co<strong>de</strong> postal continent<br />

Clients<br />

id nom location id type<br />

Magasins<br />

id nom location id classe<br />

Articles<br />

id nom famille categorie prixHT TVA<br />

Lignes<br />

id comman<strong>de</strong> id article id quantité<br />

Ven<strong>de</strong>urs<br />

id nom prenom niveau<br />

Fig. 7.2 – Version relationnelle <strong>de</strong> la <strong>base</strong> <strong>de</strong> <strong>données</strong> d’exemple.<br />

7.2 <strong>Requêtes</strong> d’analyse<br />

Les requêtes <strong>OLAP</strong> classiques groupent <strong>de</strong>s résultats suivant différents critères. Par exemple,<br />

dans notre entrepôt défini ci-<strong>de</strong>ssus, nous aimerions pouvoir obtenir le chiffre d’affaire en 2005<br />

par ville <strong>de</strong> Belgique ainsi que par type <strong>de</strong> client. Le type d’un client pourrait être, par exemple,<br />

étudiant, employé, profession libérale ou sans emploi.<br />

7.2.1 Opérateur GROUP BY en SQL<br />

En SQL standard, <strong>une</strong> telle requête s’écrirait classiquement comme <strong>sur</strong> la figure 7.3. Notons<br />

l’utilisation du mot clé GROUP BY qui, comme son nom l’indique, groupe les <strong>données</strong> jointes en<br />

calculant la fonction d’agrégation SUM(). Les résultats obtenus sont illustrés <strong>sur</strong> le tableau 7.1.<br />

Extensions<br />

Il existe <strong>de</strong>s extensions à l’opérateur GROUP BY disponibles dans les systèmes d’analyse :<br />

ROLLUP et CUBE [68]. La fonction ROLLUP permet <strong>de</strong> créer <strong>de</strong>s sous-totaux triés à chaque niveau<br />

d’un agrégat, jusqu’au total. Pour ce faire, elle commence par calculer les agrégats spécifiés dans


7.2 <strong>Requêtes</strong> d’analyse 87<br />

SELECT LO.ville , CL.type , SUM ( prix )<br />

FROM comman<strong>de</strong>s CO , clients CL , locations LO<br />

WHERE CO. date >= date (" 2005 -01 -01 ")<br />

and CO. date = date (" 2005 -01 -01 ")<br />

and CO. date


7.3 Groupements en XQuery 88<br />

Ville Type SUM(prix)<br />

Bruxelles Etudiant 2600<br />

Bruxelles Employé 7800<br />

Bruxelles NULL 10400<br />

Liège Etudiant 1500<br />

Liège Employé 5400<br />

Liège Sans Emploi 700<br />

Liège NULL 7600<br />

NULL NULL 18000<br />

Tab. 7.2 – Résultats <strong>de</strong> la requête <strong>de</strong> la figure 7.4 (ROLLUP).<br />

Ville Type SUM(prix)<br />

Bruxelles Etudiant 2600<br />

Bruxelles Employé 7800<br />

Bruxelles NULL 10400<br />

Liège Etudiant 1500<br />

Liège Employé 5400<br />

Liège Sans Emploi 700<br />

Liège NULL 7600<br />

NULL Etudiant 4100<br />

NULL Employé 13200<br />

NULL Sans Emploi 700<br />

NULL NULL 18000<br />

Tab. 7.3 – Résultats <strong>de</strong> la requête <strong>de</strong> la figure 7.3 étendue avec CUBE.<br />

7.3 Groupements en XQuery<br />

Avant d’aller plus loin, il est important <strong>de</strong> noter qu’il existe différents types <strong>de</strong> groupements<br />

dans le domaine <strong>de</strong>s documents <strong>XML</strong> : le groupement par valeur et le groupement positionnel.<br />

Le but du groupement par valeur est <strong>de</strong> regrouper <strong>de</strong>s <strong>données</strong> en fonction <strong>de</strong> la valeur d’<strong>une</strong> ou<br />

plusieurs <strong>de</strong> ses dimensions (appelées clés <strong>de</strong> groupement). Nous prenons le terme valeur dans<br />

le sens défini par la spécification <strong>XML</strong>, c’est à dire les valeurs atomiques d’un attribut ou d’un<br />

élément <strong>XML</strong>. Le groupement par valeur sert donc par exemple à regrouper <strong>une</strong> collection <strong>de</strong><br />

livres par auteur et par année. Ce groupement, pour XQuery, a fait l’objet <strong>de</strong> plusieurs recherches<br />

scientifiques, que nous présenterons un peu plus loin dans ce même chapitre, à la page 90.<br />

Par ailleurs, si nous voulons, par exemple, grouper un document XHTML contenant <strong>une</strong><br />

suite d’éléments H2, P, P, P, H2, P, P en <strong>de</strong>ux sections comprenant chac<strong>une</strong> un élément H2<br />

et les éléments P qui le suivent jusqu’au prochain élément H2. Il s’agit ici d’un groupement<br />

positionnel. Ce type <strong>de</strong> groupement est possible en XQuery mais <strong>de</strong>man<strong>de</strong> l’écriture <strong>de</strong> fonctions<br />

récursives et <strong>de</strong> requêtes trop compliquées pour un utilisateur classique d’XQuery. Michael Kay,<br />

le développeur <strong>de</strong> SAXON a i<strong>de</strong>ntifié les cas d’utilisations d’un tel groupement et proposé très<br />

récemment <strong>une</strong> syntaxe ad-hoc dans [69].


7.3 Groupements en XQuery 89<br />

Ces <strong>de</strong>ux types <strong>de</strong> groupement sont très différents et ne peuvent donc pas être traités <strong>de</strong><br />

la même manière. Nous allons nous focaliser <strong>sur</strong> le groupement par valeur, très utile pour les<br />

requêtes d’analyse dans les entrepôts <strong>de</strong> <strong>données</strong>, contrairement au groupement positionnel. Il<br />

nous semblait toutefois important <strong>de</strong> présenter les <strong>de</strong>ux types <strong>de</strong> groupement afin d’éviter la<br />

confusion.<br />

Le langage XQuery ne possè<strong>de</strong> pas <strong>de</strong> mécanisme particulier, comme un mot clé GROUP BY,<br />

afin d’effectuer <strong>de</strong>s groupements <strong>de</strong> <strong>données</strong> par valeur. Pour obtenir un résultat équivalent à<br />

la requête SQL <strong>de</strong> la figure 7.3, nous <strong>de</strong>vons donc écrire <strong>une</strong> requête à l’image <strong>de</strong> la figure<br />

7.5. Il s’agit d’<strong>une</strong> double boucle <strong>sur</strong> les valeurs différentes <strong>de</strong>s clés <strong>de</strong> groupement (distinctvalues()<br />

1 ) dans lesquels on opère <strong>une</strong> jointure propre 2 et le calcul <strong>de</strong> la fonction d’agrégat. La<br />

jointure propre est nécessaire car la fonction distinct-values(expression XPath) ne renvoie<br />

que les valeurs <strong>de</strong>s éléments sélectionnés par l’expression XPath et pas les nœuds eux-mêmes.<br />

Cela suppose, sans optimisation, autant <strong>de</strong> passes <strong>sur</strong> les <strong>données</strong> ou <strong>sur</strong> les in<strong>de</strong>xes qu’il y a <strong>de</strong><br />

groupes. De plus, ce co<strong>de</strong> est difficile à lire et à optimiser.<br />

for $ville in distinct - values (// comman<strong>de</strong> / magasin [ pays =" Belgique "]/ ville )<br />

for $type in distinct - values (// comman<strong>de</strong> / client / type )<br />

let $comman<strong>de</strong>s := // comman<strong>de</strong> [ magasin / ville = $ville<br />

and client / type = $type ]<br />

where exists ( $comman<strong>de</strong>s )<br />

return<br />

<br />

{ $ville }<br />

{ $type }<br />

{ sum ( $comman<strong>de</strong>s / prixTTC )}<br />

<br />

Fig. 7.5 – Requête <strong>de</strong> groupement en XQuery standard.<br />

for $comman<strong>de</strong> in // comman<strong>de</strong><br />

let $ville := $comman<strong>de</strong> / magasin / ville<br />

let $type := $comman<strong>de</strong> / client / type<br />

group by $ville , $type<br />

return<br />

<br />

{ $ville }<br />

{ $type }<br />

{ sum ( $comman<strong>de</strong> / prix )}<br />

<br />

Fig. 7.6 – Requête <strong>de</strong> groupement en XQuery à l’ai<strong>de</strong> du mot clé group by.<br />

1 fonction XQuery qui renvoie <strong>une</strong> collection composée <strong>de</strong>s différentes valeurs <strong>de</strong>mandées. On perd donc le lien<br />

avec les éléments <strong>XML</strong>.<br />

2 self-join, jointure d’un fichier avec lui même.


7.3 Groupements en XQuery 90<br />

< results ><br />

<br />

Bruxelles <br />

Etudiant <br />

2600 <br />

<br />

(...)<br />

<br />

Fig. 7.7 – Résultats <strong>de</strong>s requêtes <strong>de</strong>s figures 7.5 et 7.6.<br />

Le fait <strong>de</strong> <strong>de</strong>voir faire <strong>une</strong> itération par groupe (figure 7.5) n’est bien sûr pas la manière<br />

la plus optimale d’obtenir un tel résultat. La complexité <strong>de</strong> cet algorithme en terme <strong>de</strong> grand<br />

O est donc d’O(n m ) – m étant le nombre <strong>de</strong> groupes et O(n) la complexité d’un accès à la<br />

<strong>base</strong> <strong>de</strong> <strong>données</strong>. Cette complexité peut certainement être réduite à O(log(n)) si les in<strong>de</strong>xes sont<br />

utilisés. Quoi qu’il en soit, cette complexité quadratique n’est pas admissible pour <strong>une</strong> gran<strong>de</strong><br />

quantité <strong>de</strong> <strong>données</strong>. De plus, un optimiseur <strong>de</strong> requête aurait <strong>de</strong>s difficultés à détecter que cette<br />

combinaison <strong>de</strong> jointures propres associées aux métho<strong>de</strong>s distinct-values() et exists() est<br />

en fait <strong>une</strong> requête <strong>de</strong> groupement et donc ne pourra pas l’optimiser.<br />

Intuitivement, <strong>une</strong> seule passe <strong>sur</strong> les <strong>données</strong> <strong>de</strong>vrait suffire pour effectuer un tel groupement.<br />

Malheureusement, l’emploi <strong>de</strong> boucles for imbriquées avec XQuery suppose un nombre<br />

important <strong>de</strong> parcours d’in<strong>de</strong>x ou <strong>de</strong> <strong>données</strong>. Un opérateur group by serait donc bienvenu, ce<br />

qui permettrait <strong>de</strong> réécrire <strong>une</strong> requête <strong>de</strong> groupement à l’ai<strong>de</strong> d’<strong>une</strong> seule boucle for <strong>sur</strong> les<br />

<strong>données</strong>. Par exemple, si un tel opérateur était présent, la requête <strong>de</strong> la figure 7.5 pourrait se<br />

traduire <strong>de</strong> la manière présentée en figure 7.6. Il s’agit d’un cycle <strong>sur</strong> toutes les comman<strong>de</strong>s<br />

dans lequel on instancie les clés <strong>de</strong> groupement $ville et $type. Les comman<strong>de</strong>s sont groupées<br />

avant la clause return qui ne renvoie les résultats qu’<strong>une</strong> fois les groupes entièrement constitués.<br />

Intuitivement, cette requête, sans optimisation toujours, <strong>de</strong>vrait parcourir <strong>une</strong> seule fois les comman<strong>de</strong>s<br />

(ou l’in<strong>de</strong>x <strong>de</strong> la collection) et les grouper par ville et par type. Les mêmes performances<br />

<strong>de</strong>vraient être également observées pour les extensions spécifiques à l’analyse comme ROLLUP et<br />

CUBE, car il ne s’agit que <strong>de</strong> petits calculs supplémentaires <strong>une</strong> fois les groupes constitués. Cet<br />

opérateur ajouté <strong>de</strong>vrait donc permettre d’accélérer gran<strong>de</strong>ment les requêtes d’analyse. Pour<br />

être complet, un fragment <strong>de</strong>s résultats obtenus par ces <strong>de</strong>ux requêtes est illustré à la figure 7.7.<br />

Un tel opérateur a déjà été proposé par Beyer et al. [38] et par Borkar [40]. Une autre étu<strong>de</strong> à<br />

ce sujet a été menée par Deutsch et al. [43]. Ils proposent également un opérateur <strong>de</strong> groupement<br />

pour XQuery ainsi qu’un ensemble <strong>de</strong> règles permettant <strong>de</strong> traduire les requêtes utilisant la<br />

fonction distinct-values() en <strong>une</strong> forme minimisée et optimisée. Cette minimisation n’est<br />

possible que si un tel opérateur est implémenté dans XQuery. Ces règles peuvent être réutilisées,<br />

par exemple, à <strong>de</strong>s fins d’optimisations interne.<br />

Il y a quelques petites différences sans réelle importance entre ces différentes propositions<br />

d’opérateurs. Dans certains cas, le mot clé group by se place après la clause return et, dans


7.4 Scénario d’évaluation 91<br />

d’autres, il se place juste avant la clause or<strong>de</strong>r. Une autre différence rési<strong>de</strong> dans la syntaxe <strong>de</strong><br />

cet opérateur. Nous avons choisi la forme la plus simple à <strong>de</strong>s fins pédagogiques, comme utilisée<br />

à la figure 7.6, c’est à dire que l’opérateur <strong>de</strong> groupement se place entre la clause where et or<strong>de</strong>r.<br />

Son fonctionnement schématique est illustré à la figure 7.8.<br />

for $c in //comman<strong>de</strong><br />

let $ville := //comman<strong>de</strong>/magasin/ville<br />

let $type := //comman<strong>de</strong>/client/type<br />

($c = C1 , $ville = Bruxelles, $type = étudiant)<br />

($c = C2 , $ville = Bruxelles, $type = etudiant)<br />

($c = C3 , $ville = Bruxelles, $type = employé)<br />

...<br />

group by $ville,$type<br />

($c = C1,C2 , $ville = Bruxelles, $type = étudiant)<br />

($c = C3 , $ville = Bruxelles, $type = employé)<br />

...<br />

return<br />

<br />

{$ville}<br />

{$type}<br />

{sum($c/prixTTC)}<br />

<br />

for et let<br />

where<br />

group by<br />

or<strong>de</strong>r by<br />

return<br />

Liste <strong>de</strong> tuples et variables<br />

Tuples et variables filtrés<br />

Tuples groupés<br />

Tuples ordonnés<br />

Résultats <strong>XML</strong> (arbre <strong>de</strong> tuples)<br />

Fig. 7.8 – Schéma <strong>de</strong> fonctionnement <strong>de</strong> l’opérateur group by.<br />

Il est bien entendu que cet opérateur n’ajoute rien au pouvoir d’expressivité du langage,<br />

comme l’ont démontré Deutsch et al. [43]. Cependant, nous pensons que cet ajout permettrait<br />

d’écrire <strong>de</strong>s requêtes <strong>de</strong> groupement beaucoup plus facilement. En effet, il semble plus logique<br />

d’utiliser explicitement un opérateur <strong>de</strong> groupement plutôt que <strong>de</strong> <strong>de</strong>voir cycler <strong>sur</strong> les valeurs<br />

distinctes <strong>de</strong>s clés <strong>de</strong> groupement. En plus d’être plus faciles à écrire, les requêtes seraient plus<br />

aisées à lire et donc à maintenir.<br />

Il nous paraît pertinent que le groupe <strong>de</strong> travail du W3C à propos d’XQuery puisse en<br />

tenir compte lors <strong>de</strong> l’élaboration <strong>de</strong> sa prochaine version. Il serait en effet dommage <strong>de</strong> voir<br />

apparaître <strong>une</strong> série d’implémentations propriétaires différentes <strong>de</strong> cet opérateur. Cela pourrait<br />

semer la confusion parmi les utilisateurs d’XQuery, certaines requêtes ne fonctionnant pas d’<strong>une</strong><br />

implémentation à l’autre.<br />

7.4 Scénario d’évaluation<br />

A notre connaissance, il n’existe pas encore d’implémentation <strong>de</strong> XQuery possédant ce mot<br />

clé group by. Nous allons donc faire <strong>une</strong> évaluation <strong>de</strong>s performances que l’on pourrait gagner


7.4 Scénario d’évaluation 92<br />

Métho<strong>de</strong> A<br />

eXist <strong>XML</strong> DB<br />

Résultats<br />

(<strong>XML</strong> + temps)<br />

Requête <strong>de</strong> groupement en<br />

XQuery officiel<br />

<strong>XML</strong> docs<br />

Comparaison<br />

Fig. 7.9 – Diagramme du scénario d’évaluation.<br />

Traduction<br />

Simulation<br />

du group by<br />

(Script)<br />

Résultats<br />

(<strong>XML</strong> + temps)<br />

Métho<strong>de</strong> B<br />

en implémentant un tel mot clé dans XQuery. La figure 7.9 représente la manière dont nous<br />

comptons évaluer les performances.<br />

7.4.1 Métho<strong>de</strong>s d’évaluation<br />

Sur la gauche <strong>de</strong> la figure 7.9, est représentée la métho<strong>de</strong> à suivre pour tester <strong>de</strong>s requêtes<br />

<strong>de</strong> groupement en XQuery officiel, sans mot clé group by. On exécute la requête classiquement<br />

en utilisant <strong>une</strong> combinaison <strong>de</strong>s métho<strong>de</strong>s distincts-values(), exists() et <strong>de</strong>s jointures<br />

propres comme conformément à l’exemple vu en figure 7.6.<br />

La métho<strong>de</strong> à suivre pour simuler le mot clé group by est schématisée <strong>sur</strong> la droite <strong>de</strong> la<br />

figure 7.9. Nous allons procé<strong>de</strong>r en <strong>de</strong>ux étapes. Tout d’abord, nous traduirons la requête afin que<br />

l’on puisse l’exécuter à l’ai<strong>de</strong> du script <strong>de</strong> groupement. L’algorithme <strong>de</strong> groupement n’effectuera<br />

qu’<strong>une</strong> passe <strong>sur</strong> les <strong>données</strong> et créera les groupes dynamiquement lorsque le premier tuple<br />

correspondant sera lu. Il calculera également la fonction d’agrégation <strong>de</strong> la même manière. Un


7.4 Scénario d’évaluation 93<br />

pour tout tuple dans les resultats intermediaires {<br />

groupe = ( tuple . ville , tuple . type )<br />

si ( groupe existe ) {<br />

groupe . somme += tuple . prix<br />

}<br />

sinon {<br />

creer groupe<br />

groupe . somme = tuple . prix<br />

}<br />

}<br />

Fig. 7.10 – Algorithme <strong>de</strong> groupement (2 clés) en pseudo-co<strong>de</strong> pour <strong>une</strong> somme.<br />

exemple du fonctionnement <strong>de</strong> l’algorithme pour <strong>une</strong> fonction d’agrégation sum() et pour <strong>de</strong>s<br />

groupes à <strong>de</strong>ux clés est présenté <strong>sur</strong> la figure 7.10. Il est <strong>de</strong> complexité O(n), n étant le nombre<br />

d’éléments à grouper, ce qui est évi<strong>de</strong>mment plus acceptable pour <strong>une</strong> masse importante <strong>de</strong><br />

<strong>données</strong>.<br />

Cet algorithme est aisément extensible pour les fonctions rollup et cube. L’extension nécessaire<br />

à notre algorithme est triviale : il s’agit <strong>de</strong> parcourir les groupes en post-traitement et<br />

d’y insérer les résultats agrégés <strong>de</strong> la même manière qu’en relationnel[68]. Cette extension est <strong>de</strong><br />

complexité O(m), où m est le nombre <strong>de</strong> groupes. Comme m sera généralement beaucoup plus<br />

petit que n, cette extension ne change rien à la complexité <strong>de</strong> notre algorithme <strong>de</strong> groupement.<br />

Il va sans dire que les résultats générés par les <strong>de</strong>ux métho<strong>de</strong>s <strong>de</strong>vront être i<strong>de</strong>ntiques afin<br />

<strong>de</strong> vali<strong>de</strong>r le test et <strong>de</strong> comparer les performances <strong>de</strong>s <strong>de</strong>ux métho<strong>de</strong>s.<br />

7.4.2 Génération <strong>de</strong> l’échantillon<br />

Nous avons généré <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> simple dans le style <strong>de</strong> celle vue au tout début <strong>de</strong><br />

ce chapitre. Les tuples ont été calculés <strong>de</strong> telle manière que chaque valeur <strong>de</strong> paramètre soit<br />

équiprobable. Ainsi, chaque valeur correspond plus ou moins à un même nombre <strong>de</strong> tuples. Par<br />

exemple, il y aura statistiquement le même nombre <strong>de</strong> comman<strong>de</strong> dans chaque comm<strong>une</strong>. Nous<br />

espérons ainsi tester le pire cas <strong>de</strong> groupement : celui où il n’y aurait pas <strong>de</strong> groupe vi<strong>de</strong> et où<br />

chaque groupe contiendrait à peu près le même nombre d’éléments.<br />

Ce fichier <strong>XML</strong> est généré à l’ai<strong>de</strong> d’un script Python qui prend en argument le nombre<br />

d’éléments comman<strong>de</strong> à produire. Les valeurs <strong>de</strong>s paramètres sont résumées dans le tableau 7.4.<br />

Ces valeurs sont distribuées équiprobablement à l’ai<strong>de</strong> d’un générateur <strong>de</strong> nombres aléatoires<br />

fourni. Il est à noter qu’auc<strong>une</strong> supposition n’est faite quand à la proximité d’un client et d’un<br />

magasin : un client européen peut avoir fait tous ses achats en Asie par exemple. Les résultats<br />

<strong>de</strong>s requêtes ne représenteront donc pas <strong>une</strong> situation similaire à la réalité.


7.4 Scénario d’évaluation 94<br />

Nombre <strong>de</strong> comman<strong>de</strong>s n<br />

Nombre <strong>de</strong> magasins 100<br />

Nombre <strong>de</strong> clients 1000<br />

Nombre <strong>de</strong> ven<strong>de</strong>urs 200<br />

Nombre d’articles 10000<br />

Nombre <strong>de</strong> valeurs pour 4<br />

Nombre <strong>de</strong> valeurs pour 2<br />

Date minimale 01-01-1996<br />

Date maximale 01-01-2006<br />

Nombre <strong>de</strong> valeurs pour 5<br />

Nombre <strong>de</strong> par 50<br />

Nombre <strong>de</strong> par 100<br />

Nombre <strong>de</strong> par 20<br />

Nombre d’ par 10<br />

Prix minimal d’un article 10<br />

Prix maximal d’un article 1000<br />

Quantité minimale d’un article par comman<strong>de</strong> 1<br />

Quantité maximale d’un article par comman<strong>de</strong> 10<br />

Nombre <strong>de</strong> valeurs pour 5<br />

Nombre <strong>de</strong> par 10<br />

Nombre <strong>de</strong> valeurs pour 5<br />

Nombre <strong>de</strong> valeurs pour 3<br />

Tab. 7.4 – Paramètres <strong>de</strong> l’échantillon.<br />

Processeur AMD64 3000+ 1800Mhz<br />

Mémoire vive 1024Mo<br />

Système d’exploitation Linux 2.6<br />

Machine Java Sun j2re 1.5<br />

eXist Version <strong>de</strong> développement SVN rev3915 (07-2006)<br />

7.4.3 Conditions du test<br />

Tab. 7.5 – Spécifications <strong>de</strong> la station <strong>de</strong> test.<br />

Le test a été effectué <strong>sur</strong> <strong>une</strong> station <strong>de</strong> travail dont les caractéristiques sont présentées <strong>sur</strong><br />

le tableau 7.5. Nous utiliserons le logiciel eXist qui est <strong>une</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> <strong>native</strong> <strong>XML</strong> en Java.<br />

eXist est à nos yeux l’implémentation libre la plus complète du langage XQuery.<br />

7.4.4 Me<strong>sur</strong>es<br />

Afin <strong>de</strong> comparer les <strong>de</strong>ux métho<strong>de</strong>s illustrées <strong>sur</strong> la figure 7.9, la première sans group by<br />

et la secon<strong>de</strong> avec, nous disposons <strong>de</strong>s me<strong>sur</strong>es suivantes :


7.4 Scénario d’évaluation 95<br />

⊲ le temps d’exécution<br />

⊲ le nombre <strong>de</strong> groupes résultants<br />

⊲ le nombre d’éléments à grouper<br />

⊲ le nombre <strong>de</strong> clés du groupement<br />

7.4.5 Paramètres<br />

Les paramètres <strong>sur</strong> lesquels nous pouvons jouer sont le nombre d’éléments <strong>de</strong> la <strong>base</strong> <strong>de</strong><br />

<strong>données</strong>, le nombre <strong>de</strong> groupes résultants (par exemple, <strong>une</strong> requête <strong>de</strong> groupement <strong>sur</strong> les<br />

comm<strong>une</strong>s <strong>de</strong> Bruxelles nous donnerait 19 groupes) et le nombre <strong>de</strong> clés <strong>de</strong> groupement (par<br />

exemple, <strong>une</strong> clé si on groupe par ville, <strong>de</strong>ux si on groupe par ville et par statut, . . . ).<br />

En ce qui concerne le nombre <strong>de</strong> comman<strong>de</strong>s, nous avons utilisé les valeurs suivantes : 100,<br />

10K, 100K. Nous voulions également faire le test <strong>sur</strong> <strong>de</strong>s échantillons plus grands (1M et 10M)<br />

mais, dans ce cas, eXist n’avait pas assez <strong>de</strong> mémoire à sa disposition et la machine copiait sans<br />

cesse <strong>de</strong>s <strong>données</strong> entre la mémoire virtuelle et la mémoire vive. Nous avons donc abandonné<br />

notre expérience <strong>sur</strong> ces échantillons trop importants <strong>de</strong> peur <strong>de</strong> fausser les résultats. eXist est<br />

selon nous fiable mais il ne peut encore gérer <strong>de</strong> larges collections <strong>de</strong> <strong>données</strong> en économisant la<br />

mémoire vive.<br />

Les nombres <strong>de</strong> groupes obtenus dépen<strong>de</strong>nt directement <strong>de</strong>s requêtes effectuées <strong>sur</strong> l’échantillon.<br />

Les valeurs choisies sont les suivantes : 2, 5, 6, 10, 15, 24, 50 et 100. Le nombre <strong>de</strong><br />

clés groupement dépen<strong>de</strong>nt également <strong>de</strong>s requêtes. Nous nous sommes limités aux valeurs suivantes<br />

: 1, 2 et 3. Ces valeurs sont suffisantes pour montrer le gain <strong>de</strong> performance obtenu grâce<br />

au groupement séquentiel.<br />

7.4.6 <strong>Requêtes</strong> effectuées<br />

Numéro Clé(s) Groupes<br />

R1 client/classe 2<br />

R2 magasin/continent 5<br />

R3 article/categorie 10<br />

R11 article/famille 50<br />

R4 magasin/classe et ven<strong>de</strong>ur/niveau 6<br />

R5 magasin/classe et magasin/continent 10<br />

R6 client/type et ven<strong>de</strong>ur/niveau 15<br />

R7 article/categorie et magasin/continent 50<br />

R8 magasin/classe, ven<strong>de</strong>ur/niveau et statut 24<br />

R9 magasin/classe, magasin/continent et client/type 50<br />

R10 magasin/classe, magasin/continent et magasin/classe 100<br />

Tab. 7.6 – <strong>Requêtes</strong> <strong>de</strong> l’évaluation.


7.5 Analyse <strong>de</strong>s résultats 96<br />

Pour mener à bien ce test <strong>de</strong> performance, nous avons utilisé les onze requêtes illustrées dans<br />

le tableau 7.6. Ces requêtes sont directement inspirées <strong>de</strong> celle <strong>de</strong> la figure 7.5 pour leur version<br />

XQuery officielle. Celles-ci ont été exécutées <strong>sur</strong> nos collections à l’ai<strong>de</strong> d’eXist. Pour simuler le<br />

fonctionnement d’un opérateur group by, nous avons écrit un script Python utilisant l’API SAX<br />

respectant l’algorithme précé<strong>de</strong>mment présenté à la figure 7.10. Ce script prend en argument le<br />

fichier <strong>XML</strong> à grouper ainsi que les clés <strong>de</strong> groupement. Il renvoie un fichier <strong>XML</strong> contenant les<br />

résultats <strong>de</strong> ce groupement. Ce résultat a ensuite été comparé avec les résultats obtenus pour la<br />

requête XQuery correspondante exécutée avec eXist.<br />

7.5 Analyse <strong>de</strong>s résultats<br />

Temps (ms)<br />

7000<br />

6000<br />

5000<br />

4000<br />

3000<br />

2000<br />

1000<br />

10k, eXist<br />

10k, script<br />

0<br />

0 10 20 30 40 50 60 70 80 90 100<br />

Nombre <strong>de</strong> groupes<br />

(a) 1000 éléments<br />

Temps (ms)<br />

800000<br />

700000<br />

600000<br />

500000<br />

400000<br />

300000<br />

200000<br />

100000<br />

Temps (ms)<br />

70000<br />

60000<br />

50000<br />

40000<br />

30000<br />

20000<br />

10000<br />

10k, eXist<br />

10k, script<br />

0<br />

0 10 20 30 40 50 60 70 80 90 100<br />

Nombre <strong>de</strong> groupes<br />

(c) 100K éléments<br />

10k, eXist<br />

10k, script<br />

0<br />

0 10 20 30 40 50 60 70 80 90 100<br />

Nombre <strong>de</strong> groupes<br />

(b) 10K éléments<br />

Fig. 7.11 – Temps d’exécution <strong>de</strong>s requêtes en fonction du nombre <strong>de</strong> groupes (respectivement<br />

pour R1, R2, R4, R5, R6, R8, R9 et R10).<br />

Comme nous l’escomptions, notre métho<strong>de</strong> <strong>de</strong> groupement présentée au point 7.4.1 est bien<br />

plus performante que celle utilisant la syntaxe officielle d’XQuery et exécutée à l’ai<strong>de</strong> d’eXist. Sur<br />

la figure 7.11, nous pouvons constater que le temps pris par notre métho<strong>de</strong> groupement croit très<br />

lentement en fonction du nombre <strong>de</strong> groupes résultants, contrairement à l’autre procédé. Cela<br />

n’a rien d’étonnant, la durée <strong>de</strong> notre groupement étant directement proportionnelle à la taille<br />

<strong>de</strong>s <strong>données</strong> à traiter. En effet, comme nous l’avons déjà précisé au point 7.4.1, sa complexité<br />

est <strong>de</strong> O(n).


7.6 Conclusions 97<br />

Temps (ms)<br />

800000<br />

700000<br />

600000<br />

500000<br />

400000<br />

300000<br />

200000<br />

100000<br />

0<br />

20 30 40 50 60 70 80 90 100<br />

Nombre <strong>de</strong> groupes résultants<br />

1k, eXist<br />

1k, script<br />

Fig. 7.12 – Temps d’exécution <strong>de</strong>s <strong>de</strong>ux métho<strong>de</strong>s en fonction du nombre <strong>de</strong> groupes pour <strong>de</strong>s<br />

groupements à 3 clés (R8, R9 et R10 respectivement).<br />

Par comparaison, le temps utilisé par la métho<strong>de</strong> basée <strong>sur</strong> la syntaxe officielle paraît dépendre,<br />

en plus <strong>de</strong> la taille <strong>de</strong>s donnes, du nombre <strong>de</strong> groupes ainsi que du nombre clés <strong>de</strong><br />

groupement comme l’on peut le constater <strong>sur</strong> les figure 7.12 et 7.13.<br />

Les <strong>de</strong>ux figures 7.14 et 7.15 montrent le rapport entre les temps d’exécution <strong>de</strong>s <strong>de</strong>ux<br />

métho<strong>de</strong>s. T (eXist) est le temps en milli-secon<strong>de</strong>s mis par eXist pour exécuter les requêtes <strong>de</strong><br />

la métho<strong>de</strong> A et T (script) est celui utilisé par notre algorithme <strong>de</strong> groupement pour les mêmes<br />

requêtes. Le rapport utilisé en ordonnée est T (eXist) <strong>sur</strong> T (script). Nous pouvons constater<br />

que, sauf pour un très petit nombre <strong>de</strong> groupes (2 et 5 dans notre test), le gain obtenu via notre<br />

métho<strong>de</strong> est supérieure à 1 et ne cesse <strong>de</strong> croître en fonction du nombre <strong>de</strong> groupes ainsi que du<br />

nombre <strong>de</strong> clés <strong>de</strong> groupement. Le fait que notre rapport est inférieur à 1 pour un petit nombre<br />

<strong>de</strong> groupes rési<strong>de</strong> certainement dans le fait qu’eXist in<strong>de</strong>xe les <strong>données</strong> et peut donc accé<strong>de</strong>r<br />

très rapi<strong>de</strong>ment aux nœuds correspondant à un groupe. Malheureusement, <strong>de</strong> par le fait que le<br />

langage XQuery officiel impose un grand nombre d’itérations afin <strong>de</strong> grouper <strong>de</strong>s <strong>données</strong>, le<br />

temps gagné grâce à l’in<strong>de</strong>xation n’a pas beaucoup d’effets <strong>sur</strong> les performances quand un grand<br />

nombre <strong>de</strong> groupes résultants sont à traiter.<br />

7.6 Conclusions<br />

Pour conclure, il apparaît évi<strong>de</strong>nt que si nous voulions utiliser XQuery à <strong>de</strong>s fins d’analyse <strong>sur</strong><br />

un importante <strong>base</strong> <strong>de</strong> <strong>données</strong>, un opérateur <strong>de</strong> groupement s’avérerait indispensable. Il est en<br />

effet peu concevable qu’un groupement s’exécute avec <strong>une</strong> complexité quadratique, <strong>sur</strong>tout pour<br />

<strong>de</strong> larges collections d’informations typiques aux entrepôts <strong>de</strong> <strong>données</strong>. Comme nous l’avons vu


7.6 Conclusions 98<br />

Temps (ms)<br />

400000<br />

350000<br />

300000<br />

250000<br />

200000<br />

150000<br />

100000<br />

50000<br />

0<br />

1 1.5 2 2.5 3<br />

Nombre <strong>de</strong> clés <strong>de</strong> groupement<br />

1k, eXist<br />

1k, Script<br />

Fig. 7.13 – Temps d’exécution <strong>de</strong>s <strong>de</strong>ux métho<strong>de</strong>s en fonction du nombre <strong>de</strong> clés <strong>de</strong> groupement<br />

pour 50 groupes résultants (respectivement R11, R7 et R9).<br />

en début <strong>de</strong> ce chapitre, d’autres aspects doivent encore être approfondis comme l’in<strong>de</strong>xation et<br />

la modélisation afin <strong>de</strong> construire un système d’analyse entièrement basé <strong>sur</strong> <strong>XML</strong>.


7.6 Conclusions 99<br />

T(eXist)/T(script)<br />

18<br />

16<br />

14<br />

12<br />

10<br />

8<br />

6<br />

4<br />

2<br />

0<br />

1K comman<strong>de</strong>s<br />

10K comman<strong>de</strong>s<br />

100K comman<strong>de</strong>s<br />

2 5 6 10 15 24 50 100<br />

Nombre <strong>de</strong> groupes résultants<br />

Fig. 7.14 – Rapport du temps d’exécution <strong>de</strong>s <strong>de</strong>ux métho<strong>de</strong>s en fonction du nombre <strong>de</strong> groupes<br />

(respectivement pour R1, R2, R4, R5, R6, R8, R9 et R10).<br />

T(eXist)/T(script)<br />

9<br />

8<br />

7<br />

6<br />

5<br />

4<br />

3<br />

2<br />

1<br />

1K comman<strong>de</strong>s<br />

10K comman<strong>de</strong>s<br />

100K comman<strong>de</strong>s<br />

1 2 3<br />

Nombre <strong>de</strong> clés <strong>de</strong> groupement<br />

Fig. 7.15 – Rapport du temps d’exécution <strong>de</strong>s <strong>de</strong>ux métho<strong>de</strong>s en fonction du nombre <strong>de</strong> clés <strong>de</strong><br />

groupement (50 groupes) (respectivement R11, R7 et R9).


Chapitre 8<br />

Conclusions et travaux futurs<br />

8.1 Conclusions<br />

Le format <strong>XML</strong>, <strong>de</strong> par sa simplicité et sa flexibilité, est <strong>de</strong>venu aujourd’hui le format <strong>de</strong> choix<br />

pour représenter <strong>de</strong>s <strong>données</strong> structurées ou semi-structurées. De nombreux langages permettent<br />

d’interroger du contenu <strong>XML</strong> et différents logiciels existent pour gérer ces documents.<br />

Depuis quelques années, <strong>de</strong> plus en plus d’entreprises centralisent leurs informations dans<br />

<strong>de</strong>s entrepôts <strong>de</strong> <strong>données</strong> afin <strong>de</strong> les analyser et d’en dégager <strong>de</strong>s tendances. Cependant, bien<br />

que <strong>XML</strong> soit très utilisé, il n’existe pas <strong>de</strong> système d’entrepôt <strong>de</strong> <strong>données</strong> entièrement en <strong>XML</strong><br />

et seules quelques étu<strong>de</strong>s scientifiques sont parues <strong>sur</strong> le sujet. Dans ce mémoire, nous avons<br />

décidé d’analyser la faisabilité d’un entrepôt <strong>de</strong> <strong>données</strong>, basé entièrement <strong>sur</strong> <strong>XML</strong>.<br />

Nous avons d’abord dû nous familiariser avec les entrepôts <strong>de</strong> <strong>données</strong> et les technologies<br />

<strong>XML</strong> dans le domaine <strong>de</strong>s <strong>base</strong>s <strong>de</strong> <strong>données</strong> : les différentes modélisations, les langages d’interrogation<br />

et les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>native</strong>s <strong>XML</strong>. Tout ceci étant très récent et novateur, nous y<br />

avons consacré <strong>une</strong> bonne partie <strong>de</strong> ce travail, en nous concentrant <strong>sur</strong> les aspects modélisation<br />

et in<strong>de</strong>xation <strong>de</strong>s <strong>données</strong> <strong>XML</strong> dans les <strong>base</strong>s <strong>de</strong> <strong>données</strong>. Nous avons également analysé en profon<strong>de</strong>ur<br />

le logiciel libre eXist, un système <strong>de</strong> gestion <strong>de</strong> <strong>base</strong> <strong>de</strong> <strong>données</strong> natif <strong>XML</strong> implémentant<br />

XQuery, qui nous paraît prometteur.<br />

Ensuite, nous avons étudié les différents articles publiées à propos <strong>de</strong> <strong>XML</strong> dans le domaine<br />

<strong>de</strong>s entrepôts <strong>de</strong> <strong>données</strong> et <strong>de</strong>s systèmes d’analyse <strong>OLAP</strong>. Lorsque cela était nécessaire, nous<br />

avons émis <strong>de</strong>s propositions comme <strong>une</strong> modélisation adéquate <strong>de</strong> documents <strong>XML</strong> pour un<br />

système <strong>OLAP</strong> et <strong>de</strong>s idées d’in<strong>de</strong>xation multidimensionnelle.<br />

Nous avons également détecté un manquement dans la syntaxe <strong>de</strong> XQuery. Celui-ci ne possè<strong>de</strong><br />

pas d’opérateur <strong>de</strong> groupement par valeur, contrairement à SQL. Les groupements sont<br />

<strong>de</strong>s opérations très utilisées dans le domaine <strong>de</strong>s entrepôts <strong>de</strong> <strong>données</strong> et <strong>de</strong> l’analyse. En effet,<br />

les requêtes au sein <strong>de</strong> tels systèmes sont principalement <strong>de</strong>s groupements <strong>de</strong> faits selon <strong>une</strong> ou<br />

plusieurs dimensions.<br />

Nous avons dès lors décidé d’analyser le gain <strong>de</strong> performance que l’on pourrait obtenir en<br />

implémentant un tel opérateur dans XQuery. Les résultats sont très favorables à cette innovation.<br />

100


8.2 Travaux Futurs 101<br />

Cet opérateur n’ajoute rien au pouvoir d’expression <strong>de</strong> XQuery mais permet à la fois d’écrire<br />

plus facilement ces requêtes <strong>de</strong> groupement et <strong>sur</strong>tout <strong>de</strong> gagner du temps <strong>de</strong> calcul lors <strong>de</strong> leur<br />

exécution.<br />

Il paraît donc évi<strong>de</strong>nt qu’en cas d’utilisation <strong>de</strong> XQuery à <strong>de</strong>s fins d’analyse <strong>sur</strong> <strong>une</strong> large<br />

<strong>base</strong> <strong>de</strong> <strong>données</strong>, un opérateur <strong>de</strong> groupement est indispensable. En effet, il permet d’optimiser le<br />

traitement <strong>de</strong>s requêtes <strong>de</strong> groupement. Cette optimisation est d’<strong>une</strong> gran<strong>de</strong> importance quand<br />

on considère les masses considérables d’informations constituant un entrepôt <strong>de</strong> <strong>données</strong>. Dans ce<br />

but, nous pouvons recomman<strong>de</strong>r qu’<strong>une</strong> version ultérieure <strong>de</strong>s spécifications XQuery ajoute à sa<br />

syntaxe <strong>une</strong> telle clause. Cela éviterait que <strong>de</strong> multiples implémentations maison apparaissent <strong>sur</strong><br />

la marché et détruisent, <strong>de</strong> ce fait, <strong>une</strong> bonne partie <strong>de</strong>s bénéfices apportées par la standardisation<br />

<strong>de</strong>s langages.<br />

8.2 Travaux Futurs<br />

Le sujet dans lequel nous nous sommes lancés dans cette étu<strong>de</strong> est très novateur et peu<br />

exploré. De nombreux aspects pourraient encore être analysés lors <strong>de</strong> recherches, <strong>de</strong> mémoires<br />

voir <strong>de</strong> thèses <strong>de</strong> doctorats. Ces aspects sont, entre autres, les suivants :<br />

⊲ In<strong>de</strong>xation : De nombreuses structures d’in<strong>de</strong>xes multidimensionnels existent comme<br />

les arbres UB [70] et les arbres R [66]. Il conviendrait donc d’étudier leur application<br />

dans le cas spécifique <strong>de</strong>s documents <strong>XML</strong>.<br />

⊲ Modélisation : Dans ce mémoire, nous avons proposé <strong>une</strong> idée <strong>de</strong> modélisation multidimensionnelle<br />

pour un outil <strong>OLAP</strong>. Il serait intéressant <strong>de</strong> trouver d’autres modélisations<br />

en se basant peut être <strong>sur</strong> les techniques existantes dans les moteurs <strong>OLAP</strong> classiques<br />

et en les adaptant au cas spécifique <strong>de</strong> <strong>XML</strong>. Une évaluation comparative <strong>de</strong> ces modélisations<br />

pourrait être faite. La modélisation est fortement liée à l’in<strong>de</strong>xation. En effet,<br />

pour réaliser un plan d’in<strong>de</strong>xation efficace, la structure générale <strong>de</strong>s <strong>données</strong> à in<strong>de</strong>xer<br />

est importante à connaître.<br />

⊲ Stockage : Les systèmes d’ai<strong>de</strong> à la décision gèrent habituellement <strong>une</strong> masse énorme <strong>de</strong><br />

<strong>données</strong>. Pour l’instant, les <strong>base</strong>s <strong>de</strong> <strong>données</strong> <strong>XML</strong> <strong>native</strong>s matérialisent les documents<br />

<strong>XML</strong> entiers en mémoire vive, ce qui est clairement inadapté. Il faut donc trouver <strong>de</strong>s<br />

techniques <strong>de</strong> stockage et <strong>de</strong> récupération qui soient adaptées à <strong>de</strong> très grands documents<br />

⊲ Visualisation : Les systèmes d’analyse <strong>OLAP</strong> ne sont habituellement pas utilisés par<br />

<strong>de</strong>s informaticiens, mais plutôt par <strong>de</strong>s analystes financiers ou <strong>de</strong>s déci<strong>de</strong>urs. L’aspect<br />

visualisation est donc très important. De plus, la structure souple <strong>de</strong>s documents <strong>XML</strong><br />

est très différente <strong>de</strong> celle <strong>de</strong>s cubes <strong>OLAP</strong> classiques. Il s’agirait donc <strong>de</strong> trouver <strong>de</strong>s<br />

moyens d’affichage <strong>de</strong> gros ensembles <strong>de</strong> <strong>données</strong> hiérarchisées en temps réel, tout en<br />

économisant <strong>de</strong> la mémoire vive.


BIBLIOGRAPHIE 102<br />

Bibliographie<br />

[1] B. Inmon. Building the Data Warehouse. John Wiley, 1992.<br />

[2] R. Kimball. The Data Warehouse Toolkit. John Wiley, 1996.<br />

[3] E. Malinowski and E. Zimányi. Hierarchies in a multidimensional mo<strong>de</strong>l : From conceptual<br />

mo<strong>de</strong>ling to logical representation. Data & Knowledge Engineering, 2006. Unpublished<br />

paper. Paper available from http://co<strong>de</strong>.ulb.ac.be/dbfiles/media256.pdf.<br />

[4] R. Kimball. The Data Warehouse ETL Toolkit. John Wiley, 2004.<br />

[5] E.F. Codd, S.B. Codd, and C.T. Salley. Providing <strong>OLAP</strong> (on-line analytical processing) to<br />

user-analysts : An IT mandate. Technical report, Arborsoft, 1993. White paper available<br />

from http://www.arborsoft.com/papers/.<br />

[6] N. Pendse and R. Creeth. The <strong>OLAP</strong> Report. Business Intelligence Incorporated, 1998.<br />

[7] T. Bray, J. Paoli, and C. Michael. Extensible Markup Language (<strong>XML</strong>) Version 1.0. W3C<br />

Recommandation, 1998.<br />

[8] C. Goldfarb. Information processing : text and office systems : Standard Generalized Markup<br />

Language (SGML). ANSI, 1985.<br />

[9] C. F. Goldfarb. A Generalized Approach to Document Markup. In Proceedings of the<br />

SIGOA STM, pages 68–73, 1981.<br />

[10] T. Berners-Lee and D. Connolly. Hypertext Markup Language (HTML). RFC 1866, 1995.<br />

[11] S. St. Laurent. Insi<strong>de</strong> <strong>XML</strong> DTDs. McGraw Hill, 1999.<br />

[12] D. Fallsi<strong>de</strong>. <strong>XML</strong> Schema. W3C Recommendation, 2001.<br />

[13] E. van <strong>de</strong>r Vlist. <strong>XML</strong> Schema. O’Reilly & Associates, Inc., 2002.<br />

[14] J. Clark. RELAX NG Specification. OASIS Committee Specification, 2001.<br />

[15] D. Megginson. SAX 2.0 : The Simple API for <strong>XML</strong>. Web page, 2000. http://www.<br />

megginson.com/SAX/in<strong>de</strong>x.html.<br />

[16] E. Wil<strong>de</strong>. The Extensible <strong>XML</strong> Information Set. Technical report, Computer Engineering<br />

and Networks Laboratory, 2003.<br />

[17] L. Wood, V. Apparao, and S. Byrne. Document Object Mo<strong>de</strong>l (DOM). W3C Recommandation,<br />

1998.<br />

[18] M. Fernán<strong>de</strong>z, A. Malhotra, J. Marsh, M. Nagy, and N. Walsh. XQuery 1.0 and XPath 2.0<br />

Data Mo<strong>de</strong>l (XDM). W3C Candidate Recommendation, 2006.


BIBLIOGRAPHIE 103<br />

[19] J. Clark and S. DeRose. <strong>XML</strong> Path Language (XPath) Version 1.0. W3C Recommendation,<br />

1999.<br />

[20] J. Clark. <strong>XML</strong> Transformations (XSLT) Version 1.0. W3C Recommendation, 1999.<br />

[21] V. Benzaken, G. Castagna, and A. Frisch. CDuce : An <strong>XML</strong>-centric general-purpose language.<br />

In Proceedings of the ICFP, pages 51–63, 2003.<br />

[22] D. Chamberlin, D. Florescu, J. Robie, J. Siméon, and M. Stefanescu. XQuery 1.0 : A Query<br />

Language for <strong>XML</strong>. W3C Candidate Recommendation, 2006.<br />

[23] S. Abiteboul, D. Quass, J. McHugh, J. Widom, and J. Wiener. The Lorel Query Language<br />

for Semistructured Data. In International Journal on Digital Libraries, pages 68–88, 1997.<br />

[24] J. Melton and S. Buxton. Querying <strong>XML</strong> - XQuery, XPath, and SQL/<strong>XML</strong> in Context.<br />

Morgan Kaufmann, 2006.<br />

[25] M. Fernán<strong>de</strong>z, J. Siméon, P. Wadler, S. Cluet, A. Deutsch, D. Florescu, A. Levy, D. Maier,<br />

J. McHugh, J. Robie, D. Suciu, and J. Widom. <strong>XML</strong> Query Languages : Experiences and<br />

Exemplars. 1999. Paper available from http://www-db.research.belllabs.com/user/<br />

simeon/xquery.ps.<br />

[26] J. Robie, D. Chamberlin, M. Marchiori, and P. Fankhauser. <strong>XML</strong> Query (XQuery) Requirements.<br />

W3C Working Draft, 2005.<br />

[27] J. Robie, D. Chamberlin, and D. Florescu. Quilt : An <strong>XML</strong> Query Language. In Proceedings<br />

of <strong>XML</strong> Europe 2000, 2000.<br />

[28] J. Robie, J. Lapp, and D. Schach. <strong>XML</strong> Query Language (XQL). W3C Proposal, 1998.<br />

[29] A. Deutsch, M. Fernan<strong>de</strong>z, and D. Florescu. <strong>XML</strong>-QL : A Query Language For <strong>XML</strong>. W3C<br />

Proposal, 1998.<br />

[30] A. M. Alashqur, S. Y. W. Su, and H. Lam. OQL : A Query Language for Manipulating<br />

Object-oriented Data<strong>base</strong>s. In Proceedings of the ICVLDB, pages 433–442, 1989.<br />

[31] E. Zimányi. Cours <strong>de</strong> Base <strong>de</strong> Données (ULB INFO-364). Web page, 2005. http://cs.<br />

ulb.ac.be/cours/info364.<br />

[32] Mark Logic Corporation. MarkLogic Server : Introduction to XQuery, 2005.<br />

[33] D. Chamberlin and J. Robie. XQuery Update Facility Requirements. W3C Working Draft,<br />

2005.<br />

[34] S. Buxton and M. Rys. XQuery and XPath Full-Text Requirements. W3C Working Draft,<br />

2003.<br />

[35] J. Melton and S. Muralidhar. <strong>XML</strong> Syntax for XQuery 1.0 (XQueryX). W3C Candidate<br />

Recommendation, 2006.<br />

[36] K. Beyer, R. Cochrane, L. Colby, F. Ozcan, and H. Pirahesh. XQuery for Analytics :<br />

Challenges and Requirements. In Proceedings of the XIME-P, pages 3–8, 2004.<br />

[37] A. Laux and L. Martin. XUpdate <strong>XML</strong> Update Language. <strong>XML</strong> :DB Working Draft, 2000.<br />

[38] K. Beyer, D. Chamberlin, L. Colby, F. Ozcan, H. Pirahesh, and Y. Xu. Extending XQuery<br />

for Analytics. In Proceedings of the ICMD, pages 503–514, 2005.


BIBLIOGRAPHIE 104<br />

[39] R. Bordawekar and C. Lang. Analytical Processing of <strong>XML</strong> Documents : Opportunities<br />

and Challenges. In Proceedings of the SIGMD, pages 27–32, 2005.<br />

[40] V. Borkar and M. Carey. Extending XQuery for Grouping, Duplicate Elimination, and<br />

Outer Joins. In Proceedings of <strong>XML</strong> 2004, 2005.<br />

[41] E. Lenz. Xquery : Reinventing the wheel ? Web page, 2001. http://www.xmlportfolio.<br />

com/xquery.html.<br />

[42] D. Chamberlin, P. Fankhauser, D. Florescu, M. Marchiori, and J. Robie. <strong>XML</strong> Query Use<br />

Cases. W3C Working Draft, 2006.<br />

[43] A. Deutsch, Y. Papakonstantinou, and Y. Xu. Minimization and group-by <strong>de</strong>tection for<br />

nested xqueries. In Proceedings of the ICDI, pages 839–854, 2004.<br />

[44] T. Pankowski. <strong>XML</strong>-SQL : An <strong>XML</strong> Query Language Based on SQL and Path Tables. In<br />

Proceedings of the EDBT, pages 184–209, 2002.<br />

[45] H. Schöning. Tamino - A DBMS Designed for <strong>XML</strong>. In Proceedings of the ICDE, pages<br />

149–154, 2001.<br />

[46] M. Olson, K. Bostic, and M. Seltzer. Berkeley DB. In Proceedings of the FREENIX Track,<br />

pages 183–192, 1999.<br />

[47] R. Bourret. <strong>XML</strong> and Data<strong>base</strong>s. Web page, 2006. http://www.rpbourret.com/xml/<br />

<strong>XML</strong>AndData<strong>base</strong>s.htm.<br />

[48] Q. Li and B. Moon. In<strong>de</strong>xing and Querying <strong>XML</strong> Data for Regular Path Expressions. In<br />

Proceedings of the ICVLDB, pages 361–370, 2001.<br />

[49] S. Al-Khalifa, H. V. Jagadish, J. M. Patel, Y. Wu, N. Koudas, and D. Srivastava. Structural<br />

joins : A primitive for efficient <strong>XML</strong> query pattern matching. In Proceedings of the ICDE,<br />

pages 141–152, 2002.<br />

[50] C. Zhang, J. Naughton, D. DeWitt, Q. Luo, and G. Lohman. On Supporting Containment<br />

Queries in Relational Data<strong>base</strong> Management Systems. In Proceedings of the ICMD, pages<br />

425–436, 2001.<br />

[51] R. Bayer and E. M. McCreight. Binary B-trees for virtual memory. In Proceedings of the<br />

ACM SIGFIDET Workshop, pages 219–235, 1971.<br />

[52] R. Bayer and E. M. McCreight. Organization and Maintenance of Large Or<strong>de</strong>red In<strong>de</strong>xes.<br />

In Proceedings of the ACM SIGFIDET Workshop, pages 107–141, 1972.<br />

[53] S. Chien, V. J. Tsotras, C. Zaniolo, and D. Zhang. Efficient Complex Query Support for<br />

Multiversion <strong>XML</strong> Documents. In Proceedings of the EDBT, pages 161–178, 2002.<br />

[54] Y. Kyu Lee, S. Yoo, and K. Yoon. In<strong>de</strong>x Structures for Structured Documents. In Proceedings<br />

of the ICDL, pages 91–99, 1996.<br />

[55] D. Shin, H. Jang, and H. Jin. BUS : An Effective In<strong>de</strong>xing and Retrieval Scheme in<br />

Structured Documents. In Proceedings of the ICDL, pages 235–243, 1998.<br />

[56] P. F. Dietz. Maintaining Or<strong>de</strong>r in a Linked List. In Proceedings of the STOC, pages 122–127,<br />

1982.<br />

[57] T. Böhme and E. Rahm. Supporting Efficient Streaming and Insertion of <strong>XML</strong> Data in<br />

RDBMS. In Proceedings of the DIWeb, 2004.


BIBLIOGRAPHIE 105<br />

[58] D. Florescu and D. Kossmann. A Performance Evaluation of Alter<strong>native</strong> Mapping Schemes<br />

for Storing <strong>XML</strong> Data in a Relational Data<strong>base</strong>. Technical report, INRIA, 1999.<br />

[59] T. Grust. Accelerating XPath Location Steps. In Proceedings of the ICMD, pages 109–120,<br />

2002.<br />

[60] J. Shanmugasundaram, K. Tufte, G. He, C. Zhang, D. DeWitt, and J. Naughton. Relational<br />

Data<strong>base</strong>s for Querying <strong>XML</strong> Documents : Limitations and Opportunities. In Proceedings<br />

of the ICVLDB, pages 302–314, 1999.<br />

[61] W. Meier. eXist : An Open Source Native <strong>XML</strong> Data<strong>base</strong>. In Proceedings of WWSDS,<br />

pages 169–183, 2002.<br />

[62] D. Pe<strong>de</strong>rsen, K. Riis, and T. B. Pe<strong>de</strong>rsen. Query Optimization for <strong>OLAP</strong>-<strong>XML</strong> Fe<strong>de</strong>rations.<br />

In Proceedings of the D<strong>OLAP</strong>, pages 57–64, 2002.<br />

[63] D. Pe<strong>de</strong>rsen and T. B. Pe<strong>de</strong>rsen. Achieving adaptivity for <strong>OLAP</strong>-<strong>XML</strong> fe<strong>de</strong>rations. In<br />

Proceedings of the D<strong>OLAP</strong>, pages 25–32, 2003.<br />

[64] W. Hümmer, A. Bauer, and G. Har<strong>de</strong>. XCube : <strong>XML</strong> for Data Warehouses. In Proceedings<br />

of the D<strong>OLAP</strong>, pages 33–40, 2003.<br />

[65] V. Borkar and M. Carey. <strong>XML</strong> for Analysis Specification. Microsoft Specification, 2001.<br />

[66] A. Guttman. R-Trees : A Dynamic In<strong>de</strong>x Structure for Spatial Searching. In SIGMOD’84,<br />

Proceedings of Annual Meeting, pages 47–57, 1984.<br />

[67] S. Subramanian, F. Raab, L. Livingtree, and J. Buggert. TPC-H Benchmark. Technical<br />

report, TPC, 2003.<br />

[68] J. Gray, S. Chaudhuri, A. Basworth, A. Layman, D. Reichart, M. Venkatrao, F. Pellow, and<br />

Pirahesh H. Data cube : A relational aggregation operator generalizing group-by, cross-tab,<br />

and sub-totals. In Proceedings of the ICDE, pages 152–159, 1996.<br />

[69] M. Kay. Positional Grouping in XQuery. In Proceedings of the XIME-P, pages 22–28, 2006.<br />

[70] R. Bayer. The Universal B-Tree for Multidimensional In<strong>de</strong>xing : general Concepts. In<br />

Proceedings of the WWCA, pages 198–209, 1997.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!