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
Sommaire Déroulement 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
Sommaire Déroulement du projet Étude de l'existant Notre solution Autres pistes Conclusion
Déroulement du projet 1/2 Problématique initiale : « Utiliser XQuery pour interroger un ensemble de bases de données » Décomposition en sous- problèmes. Etude de l'existant Plan de travail Représentation de la problématique
Déroulement du projet 2/2 La problématique est trop volumineuse pour notre projet : Très peu d'informations sur « comment » découper la requête XQuery Le souci de traduction ==> Seule une seule base SQL sera utilisée.
Sommaire Déroulement du projet Étude de l'existant Xquare XQueryCore SilkRoute Notre solution Autres pistes Conclusion
Xquare 1/3 XQuery Advanced Runtime Environment, un projet open-source permettant l'utilisation de XQuery avec des bases de données relationelles Projet peu récent (2005) mis en place par la société Odonota Site officiel :
Xquare 2/3 Constitué de deux outils : XQuare Bridge, permettant la traduction d'une requete XQuery pour l'utiliser sur une base relationelle. XQuare Fusion, faisant la « fusion » de bases de données en un unique XML pouvant être interrogé par XQuery.
Xquare 3/3 Fonctionnalités de XQuare Bridge: Convertir un fichier XML en une base relationnelle via l'utilisation d'un fichier de mapping Execution directe d'une requête XQuery sur une base de donnée relationnelle ayant une architecture précise
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) }
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 :
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
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
Sommaire Déroulement du projet Étude de l'existant Notre solution Hypothèses Analyseur syntaxique De AST vers SQL Retour vers le XML Autres pistes Conclusion
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
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', '(', ')'
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
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
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]
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]
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
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''
Cette requête Xquery : Est transformée en : De AST vers SQL 3/3
Retour vers le XML Utilisation de JDOM (Java Document Object Model), pour créer un document XML. Creation d'un squelette XML « vide » devant servir de réponse à la requête XQuery. Ajout des informations obtenues après interrogation de la base SQL dans le squelette.
Sommaire Déroulement du projet Étude de l'existant Notre solution Autres pistes Conclusion
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
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.
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
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