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 ...
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.