Utiliser XQuery pour interroger des bases SQL Présenté par : Cosquer Pierre Guillon Verne Martin El Bazi Siham Ben Othman Mohamed Malek Galech Mercado Alejandro Przybylski Bastien Enseignant Responsable : Pascale Sebillot
2/30 Sommaire Présentation du projet Étude de l'existant XQuare XQueryCore SilkRoute Notre solution Hypothèses Analyseur syntaxique De AST vers SQL Retour vers le XML Autres pistes Conclusion
3/30 Sommaire Présentation du projet Étude de l'existant Notre solution Autres pistes Conclusion
4/30 Présentation du projet 1/2 Problématique initiale : « Utiliser XQuery pour interroger un ensemble de bases de données » 1 - Décomposition en sous- requêtes 2 - Exécution des sous-requêtes sur les bases respectives 3 - Concaténation des résultats Représentation de la problématique
5/30 Présentation du projet 2/2 Problématique trop volumineuse pour notre projet : Difficulté pour découper la requête XQuery en sous- requêtes Nécessité d’un schéma de traduction différent pour chacune des bases Une seule base SQL utilisée
6/30 Sommaire Présentation du projet Étude de l'existant XQuare XQueryCore SilkRoute Notre solution Autres pistes Conclusion
7/30 XQuare 1/3 XQuery Advanced Runtime Environment, un projet open-source permettant l'utilisation de XQuery avec des bases de données relationnelles Projet mis en place en 2005 par la société Odonota Site officiel :
8/30 XQuare 2/3 Constitué de deux outils : XQuare Bridge, permettant la traduction d'une requête XQuery pour l'utiliser sur une base relationnelle XQuare Fusion, faisant la « fusion » de bases de données en un unique fichier XML pouvant être interrogé par XQuery.
9/30 XQuare 3/3 Fonctionnalités de XQuare Bridge: Convertir un fichier XML en une base relationnelle via l'utilisation d'un fichier de mapping Exécution directe d'une requête XQuery sur une base de données relationnelle ayant une architecture précise
10/30 XQuery Core Sous ensemble de XQuery des requêtes sous forme normale définit par le W3C. L'ensemble des expressions complètes FLOWER sont réécrites en expressions plus simples Le XQuery Core contient des redondances, necessaires pour la simplicité de lecture. Exemple en XQuery : for $i in (1, 2), $j in (3, 4) return element pair { ($i,$j) } Exemple en XQuery Core : for $i in (1, 2) return for $j in (3, 4) return element pair { ($i,$j) }
11/30 SilkRoute 1/3 Framework de publication de données relationnelles en XML, dont l'objectif est d'être général, sélectif et efficace. Developpé par un département de l'université de Washinhton S'appuie sur Galax, un framework XQuery, et OCaml. Site officiel :
12/30 SilkRoute 2/3 Lors de son éxecution, SilkRoute va : Traduire la requête XQuery dans un sous ensemble de XQuery nommé XQueryCore Traduire la requête XQueryCore en une forêt Traduire la forêt en du langage SQL Produire le résultat sous la forme d'un XML
13/30 SilkRoute 3/3 Avantages : Performances proches des optimaux SQL Supporte pratiquement tout le XQuery v1 Inconvénients : Code source indisponible Installation compliquée Vétusté du projet
14/30 Sommaire Présentation du projet Étude de l'existant Notre solution Hypothèses Analyseur syntaxique De AST vers SQL Retour vers le XML Autres pistes Conclusion
15/30 Hypothèses 1/2 Contraintes sur les formats : Un fichier XML = Une table SQL Les feuilles d'un fichier XML = Une colonne de la table SQL Les noeuds d'un fichier XML = l'ensemble des colonnes SQL de leurs feuilles Pas d'attributs, pas d'élements mixtes Un seul namespace
16/30 Hypothèses 2/2 Contraintes sur XQuery : Une seule variable pour les boucles for Les chemins XPath peuvent descendre plusieurs niveaux Les raccourcis d'écriture sont autorisés (//) Pas d'opérateur de selection XPath Opérateurs autorisés dans la partie WHERE : '=', ' ', 'and, 'or', '(', ')'
17/30 Analyseur syntaxique 1/4 Plusieurs outils fournissent un analyseur syntaxique : Saxon, un outil permettant d'exécuter des requêtes XQuery XQGrammar, un projet développant une syntaxe XQuery pour ANTLR (ANother Tool for Language Recognition) Un applet de test du site W3C, codé en JavaCC
18/30 Analyseur syntaxique 2/4 L'applet, developpé par Liam Quin, permet d'obtenir l'Arbre Syntaxique Abstrait (en anglais, AST) d'une requête XQuery. Exemple : for $client in doc("clients.xml")//clients where $client/prenom = "Robert" return $client/nom
19/30 Analyseur syntaxique 3/4 |START [1:0 - 3:18] | QueryList [1:0 - 3:18] | Module [1:0 - 3:18] | MainModule [1:0 - 3:18] | Prolog [1:0 - 0:0] | QueryBody [1:0 - 3:18] | Expr [1:0 - 3:18] | FLWORExpr10 [1:0 - 3:18] | ForClause [1:0 - 1:42] | VarName [2:5 - 1:11] | QName client [2:5 - 1:11] | PathExpr [2:13 - 1:42] | FunctionCall [2:13 - 1:33] | FunctionQName doc [2:13 - 1:18] | StringLiteral "clients.xml" [2:20 - 1:32] | SlashSlash // [2:34 - 1:35] | StepExpr [2:34 – 1:42] | AbbrevForwardStep [2:34 - 1:42] | NodeTest [2:34 - 1:42] | NameTest [2:34 - 1:42] | QName clients [2:34 - 1:42]
20/30 Analyseur syntaxique 4/4 | AbbrevForwardStep [2:34 - 1:42] | NodeTest [2:34 - 1:42] | NameTest [2:34 - 1:42] | QName clients [2:34 - 1:42] | WhereClause [2:36 - 2:31] | ComparisonExpr = [3:24 - 2:31] | PathExpr [3:1 - 2:20] | VarName [3:7 - 2:13] | QName client [3:7 - 2:13] | StepExpr [3:14 - 2:20] | AbbrevForwardStep [3:14 - 2:20] | NodeTest [3:14 - 2:20] | NameTest [3:14 - 2:20] | QName prenom [3:14 - 2:20] | StringLiteral "Robert" [3:24 - 2:31] | PathExpr [4:1 - 3:18] | VarName [4:8 - 3:14] | QName client [4:8 - 3:14] | StepExpr [4:15 – 3:18] | AbbrevForwardStep [4:15 - 3:18] | NodeTest [4:15 - 3:18] | NameTest [4:15 - 3:18] | QName nom [4:15 - 3:18]
21/30 De AST vers SQL 1/3 Necessité de traduire chaque concept XQuery en SQL → Utilisation d'une table de hachage. Une table de hachage comporte les entités XML (clés) et leur équivalent en Sql (valeurs). Une autre lie les variables Xquery à des alias SQL
22/30 De AST vers SQL 2/3 La requête SQL est générée en 3 parties : Entre ''select'' et ''from' Les colonnes à sélectionner se trouvent : Dans la variable XQuery Dans le chemin du ''return'' Création des alias SQL à partir des variables Xquery Entre ''from'' et ''where'' Sélectionner la table de la variable XQuery Imbriquer d'autres requêtes SQL recursivement (une par boucle ''for'') Après ''where'' Seulement pour la requête SQL englobante Concatène toutes les parties ''where'' XQuery des boucles ''for''
23/30 Cette requête Xquery : Est transformée en : De AST vers SQL 3/3
24/30 Du SQL vers le XML Utilisation de JDBC (Java DataBase Connectivity) pour : se connecter à la base de données relationnelle, exécuter la requête SQL Utilisation de JDOM (Java Document Object Model) pour : créer un document XML à partir du résultat de la requête SQL
25/30 Exécution XQuery Récupération du fichier XML créé lors de l’étape précédente But : Obtenir un résultat formaté selon la requête XQuery Utilisation de la librairie Saxon pour : Relancer la requête XQuery de départ sur le fichier XML
26/30 Sommaire Présentation du projet Étude de l'existant Notre solution Autres pistes Conclusion
27/30 Autres pistes 1/2 Utilisation de CAML : Sur le même principe que SilkRoute, utiliser Caml et Galax pour écrire un algorithme de traduction d'AST. Utilisation de Prolog : Utiliser des prédicats de mapping entre schéma XQuery et SQL Utiliser des prédicats pour traduction de nœuds XQuery en nœuds SQL
28/30 Autres pistes 2/2 La première catégorie de prédicats retranscrit les chemins XPath. Ex : correspondance([doc("clients.xml")|[\_|client]], "client") La second catégorie traduisent récursivement tout l'AST.
29/30 Conclusion Sur le déroulement de projet : Savoir réduire ses ambitions face à des contraintes Évaluer, réévaluer les besoins requis par chaque phase du projet Diviser la problématique Analyser l'existant
30/30 Conclusion Sur le résultat de notre projet : Notre projet traduit une requête XQuery en AST, puis en SQL et rends son résultat en XML Les boucles ''for'' imbriquées sont compatibles Compatibilité avec plusieurs tables dans une même base de données