BASE DE DONNÉES XML NATIVE
1. eXist
eXist-db Open Source Native XML Database
NXDB - eXist - XQuery IvMad, 2011-2012 2
Ce cours s’inspire, reprend, modifie et enrichi des supports disponibles sur Internet
Introduction
• Le SGBD-XML eXist est un système open-source sous licence GNU.
• eXist est utilisable sur toutes les plates-formes:
• Linux, Mac OS ou Windows
• eXist exploite de nombreux standard tels que:
• XQuery, XSLT, XPath, XUpdate, etc.
• eXist est facile à installer.
• eXist supporte l'accès concurrent.
• eXist optimise l'accès aux données par une indexation automatique des données.
• eXist propose une documentation riche à l'adresse suivante:
http://www.exist-db.org/exist/documentation.xml
• eXist se déploie comme une application Web sous le contrôle d'un moteur de Servlet: Tomcat, Jettyou autre.
La connexion eXist
NXDB - eXist - XQuery IvMad, 2011-2012 4
Service Java pour eXist
eXist peut être interrogée par une application Java en utilisant la méthode d'accès XML-RPC ou un Web service basé SOAP.
Méthodologie d'un TP avec eXist
• eXist sera utilisé pour mettre en place un site Web avec une base de données XML native afin de pouvoir l'administré en:
• intégrant des documents XML,
• interrogeant la base données (Xquery),
• modifiant la base de données (XQuery Update),
• appliquant des feuilles de style aux documents produits (XSLT)
• eXist propose une implémentation de XQuery, accompagnée de nombreuses fonctionnalités et d'interfaces Web.
• eXist est entièrement développé en Java, il est possible d'utiliser ses librairies dans des programmes Java pour manipuler la BD.
• Pour simplifier l'installation du produit une archive intégrant les composants nécessaires au TP est mise en disposition pour être déployé dans un espace utilisateur.
NXDB - eXist - XQuery IvMad, 2011-2012 6
Déploiement de eXist
• Dans un premier temps il faut déployer l'archive Tomcat.rar avec le moteur de ServletsTomcat et la BD eXist en tant qu'application Web.
• L'archive est à décompresser sur un disque dur ou une clé USB dans le répertoire racine, exemple:c:\tomcat ou e:\tomcat
• Le fichier script catalina_start.bat lance le serveur d'application tomcat avec activation du SGBD eXist.
• Le fichier script catalina_stop.bat arrête les serveurs.
Le démarrage catalina_start.bat
NXDB - eXist - XQuery IvMad, 2011-2012 8
Le serveur Tomcat sur port 8080
Déploiement de eXist
• eXist est déployé comme une application Web par le moteur de ServletsTomcat à son lancement:
NXDB - eXist - XQuery IvMad, 2011-2012 10
Le serveur SGBD eXist
Connexion aux collections
NXDB - eXist - XQuery IvMad, 2011-2012 12
Fonctions de gestion
Collections XML
NXDB - eXist - XQuery IvMad, 2011-2012 14
Manipulation d'une collections XML
Créer une collection XML
NXDB - eXist - XQuery IvMad, 2011-2012 16
Une bibliothèque en XML
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="bibliotheque.xsl"?>
<bibliotheque>
<livre><titre>1984</titre>
<auteur><nom>Orwell</nom><prenom>George</prenom></auteur>
<ref>Fiction-O-1</ref></livre>
<livre><titre>N ou M</titre> <auteur> <nom>Christie</nom>
<prenom>Agatha</prenom> </auteur> <ref>Policier-C-15</ref></livre>
<livre> <titre>Le cheval pale</titre> <auteur> <nom>Christie</nom>
<prenom>Agatha</prenom> </auteur> <ref>Policier-C-17</ref> </livre>
<livre> <titre>Le chien des Baskerville</titre> <auteur> <nom>Conan Doyle</nom>
<prenom>Arthur</prenom> </auteur> <ref>Policier-D-3</ref> </livre>
<livre><titre>Dune</titre><auteur><nom>Herbert</nom>
<prenom>Franck</prenom> </auteur> <ref>Fiction-H-1</ref> </livre>
</bibliotheque>
Activer le client en JavaWebStart
NXDB - eXist - XQuery IvMad, 2011-2012 18
Lancer le fichier exist.jnlp
Autoriser l'exécution du fichier
NXDB - eXist - XQuery IvMad, 2011-2012 20
Connexion à la BD
• S'identifier en tant que admin avec mot de passe guest
Choisir une collection dans la BD
NXDB - eXist - XQuery IvMad, 2011-2012 22
Interface de requête XQuery
Lister une collection de la BD
Activer l'interface XQuery
NXDB - eXist - XQuery IvMad, 2011-2012 24
Ouvrir une collection
Lancer une requête XQuery
Lancer la requête
Écrire la requête
Résultat de la requête XQuery: afficher les noms des
auteurs présents dans la bib
TP - http://localhost:8080/site
NXDB - eXist - XQuery IvMad, 2011-2012 26
XQuery en bref
• XQuery est un langage de requête pour faire des recherches dans des données XML. C'est un langage pour la recherche et l'extraction des elements et d'attributs d'un document XML.
• XQuery est la même chose pour XML que l'est SQL pour les bases de données relationnelles.
• XQuery est basé essentiellement sur des expressions XPath
• XQuery existe chez la plupart des BD XML
• XQuery est une recommandation W3C
• La figure montre l'intersection et l'implication des différentes technologies XML
XQuery en bref
• XQuery :
• Langage pour interroger les données XML (arbres, DOM)
• Requêtes pour interroger et extraire des éléments de l'arbre.
• Moins que pour transformer l'arbre, plus souple que XSL qui est plus une transformation d’arbre XML, mais utilisant tous les deux les expressions XPath
• Semblable à SQL pour les B.D., sauf que SQL :
• travaille sur des bases relationnelles :
• données fortement en relation dans des tables
• base ses requêtes sur la recherche de ces relations fortes
NXDB - eXist - XQuery IvMad, 2011-2012 28
Tables Arbre
XQuery en bref
• Les données XML sont différentes:
• Les données relationnelles (SQL) sont denses
• Chaque rangée a une valeur dans chaque colonne
• Problème des valeurs nulles
• Ce n’est pas le cas de XML qui peut avoir :
• des éléments vides
• des éléments absents
• C’est un degré de liberté supérieur pour XML
• Les documents XML porte pour cette raison la nomination :
• données semi-structurées
XQuery et XPath
• Xpath
• XPath permet d'exprimer des requêtes de filtrage sur des arbres
• Il n'est pas possible :
• de créer des nœuds dans l'arbre
• de construire des arbres/des documents nouveaux
• de trier des nœuds, ...
• Il est difficile d'exprimer des jointures (pas de variables)
• XQuery
• XQuery est un langage de requêtes complet qui permet :
• de créer des nœuds et de construire des arbres nouveaux
• de définir et d'instancier des variables
• de définir des fonctions, ...
NXDB - eXist - XQuery IvMad, 2011-2012 30
Format d’une requête XQuery
• Une requête XQuery est une composition d’expressions
• Chaque expression a une valeur ou retourne une erreur
• Forme 1 : Expressions simples :
• Valeurs atomiques :
• 46, ‘‘Salut’’
• Valeurs construites :
• true()
• Forme 2 : Expressions complexes :
• Expressions de chemins (XPath)
• FILM//ACTEUR
• Expressions FLWR
• For-Let-Where-Return
• Tests
• if-then-return-else-return
Format d’une requête XQuery
NXDB - eXist - XQuery IvMad, 2011-2012 32
<biblio>
<book category="COOKING">
<title lang="en">Everyday Italian
</title>
<author>Giada De Laurentiis
</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter
</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</biblio>
Expressions régulières Liste de tous les auteurs
doc("data/books.xml")//book/author Auteur du premier livre
doc("data/books.xml")//book[1]/author Liste de tous les auteurs et prix
doc("data/books.xml")// book/(author, price)
ou
doc("data/books.xml")/(descendant::aut hor,descendant::price)
Accès via un attribut
Liste des prix des livres qui ont un attribut 'title'
doc("data/books.xml")//book/(@title union price)
Une collection XML
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
Sélectionner un nœud XML
• Quelles fonctions pour sélectionner un nœud du fichier XML
"books.xml"?
• XQuery se sert de fonctions pour l'extraction de parties d'un document XML
• La fonction "doc()" ouvre un fichier XML:
• doc("books.xml")
• Les expressions:
• XQuery utilise les expressions Xpath pour naviguer dans un document XML.
• L'expression suivante est utilisée pour sélectionner les éléments du titre dans le document "books.xml"
• doc("books.xml")/bookstore/book/title
• /bookstore sélectionne les éléments bookstore
• /book sélectionne tous les éléments book qui se trouvent sous l'élément bookstore
• /title sélectionne tous les éléments dans chaque éléments book
NXDB - eXist - XQuery IvMad, 2011-2012 34
Lancer la requête XQuery
Rédiger la requête XQuery Le bouton qui
soumet la requête XQuery
Le résultat de la requête
XQuery
Filtrer la requête XQuery
• XQuery utilise des prédicats afin de limiter (filtrer) la sélection dans un
document XML :
• Sélectionner tous les éléments book dans bookstoredont le prixest inférieur à 30 en se limitant juste à l'affichage du titre
doc("books.xml") /bookstore
/book[price<30]
/title
NXDB - eXist - XQuery IvMad, 2011-2012 36
Filtrer la requête XQuery
• Le langage de requête XQuery défini FLWOR ('flower') comme une expression qui prend en charge l'itération et la liaison des variables aux résultats intermédiaires. FLWOR est l'acronyme de: FOR, LET, WHERE, ORDER BY, RETURN.
• L'expression FLWOR qui suit produira le même résultat que celle présentée au transparent précèdent.
for $x in doc("books.xml")/bookstore/book where $x/price>30
return $x/title
Filtrer la requête XQuery
• Avec le format FLWOR il est possible d'avoir un résultat trié:
for $x in doc("books.xml")/bookstore/book where $x/price>30
order by $x/title return $x/title
• La requête utilise l'opérateur for pour sélectionner tous les book contenu dans bookstoredans une variable nommé $x.
• La clause where selecte les éléments de book dont l'élément price contient une valeur supérieur à30.
• La clause order byclause définie l'ordre de sortie de l'élément title.
• La clause returnspécifie le contenu du retour, c.à.d. le résultat.
NXDB - eXist - XQuery IvMad, 2011-2012 38
Filtrer la requête XQuery
• L'opérateur alternative "if-then-else":
for $x in doc("books.xml")/bookstore/book return if ($x/@category="CHILDREN")
then <child>{data($x/title)}</child>
else <adult>{data($x/title)}</adult>
Dans /bookstore/bookon cherche à détacher /category contenant l'étiquette
"children" pour retourner le résultat balisé en <child>, sinon balisé en <adult>
eXist avec Java XML:DB
• On utilise L'API XML:DB dont la description est disponible à l'adresse: http://exist-db.org/api/
• XML:DB API permet:
• Gestion de la base et des collections
• Stockage et récupération des ressources
• Requêtes sur toute ou une partie de l’arborescence
• Il existe des extensions qui permettent entre autre :
• La gestion des utilisateurs
• La gestion de plusieurs bases de données en parallèle, avec chacune une configuration propre
• Pour plus d’informations:
http://exist-db.org/exist/devguide_xmldb.xml
NXDB - eXist - XQuery IvMad, 2011-2012 40
eXist et XML:DB avec Eclipse
• Créer un nouveau projet Java sous Eclipse
eXist et XML:DB avec Eclipse
NXDB - eXist - XQuery IvMad, 2011-2012 42
Donner un nom au projet et passer à la page suivante
eXist et XML:DB avec Eclipse
Ajouter les jar qui font le lien avec l'API XML:DB de eXist et sont
nécessaires à la compilation et à l'exécution de l'application
eXist et XML:DB avec Eclipse
NXDB - eXist - XQuery IvMad, 2011-2012 44
Sélectionner les jar et les ajouter par le bouton "Add external JARs"
Créer une classe dans le projet
import org.xmldb.api.base.*; import org.xmldb.api.modules.*; import org.xmldb.api.*;
import javax.xml.transform.OutputKeys; import org.exist.xmldb.EXistResource;
public class Retrieve { // connexion à la BD et afficher une collection
private static String URI = "xmldb:exist://139.124.38.134:8080/exist/xmlrpc";
public static void main(String args[]) throws Exception { final String driver = "org.exist.xmldb.DatabaseImpl";
Class cl = Class.forName(driver); // initialize database driver Database database = (Database) cl.newInstance();
database.setProperty("create-database", "true");
DatabaseManager.registerDatabase(database);
Collection col = null;
XMLResource res = null;
try { // get the collection
col = DatabaseManager.getCollection(URI + "/db/biblio");
col.setProperty(OutputKeys.INDENT, "no");
res = (XMLResource)col.getResource("bib.xml");
if(res == null) { System.out.println("document not found!");
} else { System.out.println(res.getContent()); } } finally { //dont forget to clean up!
if(res != null) { try { ((EXistResource)res).freeResources(); } catch(XMLDBException xe) {xe.printStackTrace();} } if(col != null) {
try { col.close(); } catch(XMLDBException xe) {xe.printStackTrace();}
} } }}
eXist et XML:DB avec Eclipse
NXDB - eXist - XQuery IvMad, 2011-2012 46
Accès à une collection de la BD
• Pour accéder à une collection, il faut se connecter au driver de la base de données eXist: org.exist.xmldb.DatabaseImpl
• Il est enregistré dans le programme avec le DatabaseManager
• Pour extraire une collection à partir de la base de données eXist on fait appel à la méthode statique DatabaseManager.getCollection ( )
• L'identification d'une collection se fait par son URI complet dont le format est :
• xmldb : [DATABASE-ID] :// [HOST-ADDRESS] /db/ collection
• où DATABASE-ID est "eXist",
• et "HOST-ADDRESS" est localhost: 8080 si nous sommes en local et si le port utilisé est 8080
• Si on utilise une machine distante il faut préciser son adresse IP.
Requête XQuery avec Java
• Pour interroger la BD on peut utiliser deux services:
• XPathQueryService
• XQueryService
• L'API XML:DB de eXist défini différents types de services:
• La méthode getService de la classeCollection fait appel au service approprié
• Pour l'exécution d'une requête la méthode service.query(xpath)
est appelée. Elle retourne un objet de typeResourceSet qui contient les ressources trouvés par la requête.
• ResourceSet.getIterator() est le conteneur des ressources.
• Chaque ressource contient un fragment de document ou une valeur sélectionner par l'expression Xpath ou XQuery.
NXDB - eXist - XQuery IvMad, 2011-2012 48
Requête XQuery avec Java
import org.xmldb.api.base.*;import org.xmldb.api.modules.*;
import org.xmldb.api.*;import org.exist.xmldb.EXistResource;
public class QueryExample {
private static String URI = "xmldb:exist://139.124.38.134:8080/exist/xmlrpc";
public static void main(String args[]) throws Exception { final String driver = "org.exist.xmldb.DatabaseImpl";
Class cl = Class.forName(driver); // initialize database driver Database database = (Database) cl.newInstance();
database.setProperty("create-database", "true");
DatabaseManager.registerDatabase(database);
Collection col = null;
try { col = DatabaseManager.getCollection(URI + "books");
XQueryService xqs = (XQueryService) col.getService("XQueryService", "1.0");
xqs.setProperty("indent", "yes");
CompiledExpression compiled = xqs.compile("/bookstore/book/author");
ResourceSet result = xqs.execute(compiled);
ResourceIterator i = result.getIterator();
Resource res = null;
while(i.hasMoreResources()) { try { res = i.nextResource();
System.out.println(res.getContent());
} finally { //A la fin faut libérer les ressources
try { ((EXistResource)res).freeResources(); } catch(XMLDBException xe) {xe.printStackTrace();} } }} finally { if(col != null) {try { col.close(); } catch(XMLDBException xe) {xe.printStackTrace();}}} } }
Requête XQuery avec Java
• Connexion à la BD:
String URI = "xmldb:exist://localhost:8080/exist/xmlrpc"
final String driver = "org.exist.xmldb.DatabaseImpl";
Class cl = Class.forName(driver);
Database database = (Database) cl.newInstance();
database.setProperty("create-database", "true");
DatabaseManager.registerDatabase(database);
• Constitution et envoi de la requête XQuery:
col=DatabaseManager.getCollection(URI + "books");
XQueryService xqs=(XQueryService) col.getService("XQueryService","1.0");
xqs.setProperty("indent", "yes");
CompiledExpression compiled =
xqs.compile("/bookstore/book/author");
• Récupération du résultat:
ResourceSet result = xqs.execute(compiled);
ResourceIterator i = result.getIterator();
NXDB - eXist - XQuery IvMad, 2011-2012 50
Le pilote XML:DB
La collection à interroger
Le requête XQuery Adresse de la
collection
Requête XQuery avec Eclipse
Exercices de requêtes avec Java
• Affichez tous les titres de films
• Afficher le titre du film avec un auteur choisi
• Afficher le titre du livre de la collection 'biblio' dont le nom de l'auteur est 'Scholl'
• Afficher les titres des films ordonnés par genre
• Afficher la collection 'films'
• Afficher la collection 'biblio'
• Afficher le titre des films avec 'Kate Winslet' et 'Leonardo DiCaprio'
• Composer la requête XQuery qui répond à la question: Quel rôle joue 'Kate Winslet' dans le film 'Titanic'.
• Afficher le 'Résumé' du film avec 'John Travolta'
Remarque: Effectuez les requêtes XQuery par l'interface XQuery de eXist et par un programme Java
NXDB - eXist - XQuery IvMad, 2011-2012 52
Accès aux supports du cours
• Les transparents du cours sont accessibles à l'adresse:
http://ivmad.free.fr/ic4/Cours-IvMad-eXist-M1-2012.pdf ou
http://valk.iut-gtr.univ-mrs.fr/ic4/Cours-IvMad-eXist-M1-2012.pdf
• Le support de TP: Tomcat-eXist-Exercices est accessible à l'adresse:
http://ivmad.free.fr/ic4/tomcat-exist.rar ou
http://valk.iut-gtr.univ-mrs.fr/ic4/tomcat-exist.rar
• Adresse de contact: ivan.madjarov@lsis.org