• Aucun résultat trouvé

BASE DE DONNÉES XML NATIVE

N/A
N/A
Protected

Academic year: 2022

Partager "BASE DE DONNÉES XML NATIVE"

Copied!
27
0
0

Texte intégral

(1)

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

(2)

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

(3)

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

(4)

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

(5)

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

(6)

Le serveur SGBD eXist

Connexion aux collections

NXDB - eXist - XQuery IvMad, 2011-2012 12

(7)

Fonctions de gestion

Collections XML

NXDB - eXist - XQuery IvMad, 2011-2012 14

(8)

Manipulation d'une collections XML

Créer une collection XML

NXDB - eXist - XQuery IvMad, 2011-2012 16

(9)

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

(10)

Lancer le fichier exist.jnlp

Autoriser l'exécution du fichier

NXDB - eXist - XQuery IvMad, 2011-2012 20

(11)

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

(12)

Lister une collection de la BD

Activer l'interface XQuery

NXDB - eXist - XQuery IvMad, 2011-2012 24

Ouvrir une collection

(13)

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

(14)

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

(15)

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

(16)

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)

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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"

(23)

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

(24)

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

(25)

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

(26)

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

(27)

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

Références

Documents relatifs

In an effort to link the genes involved in the day 3 embryo-TE transition with early embryonic development, we further investi- gated differences and similarities in the gene

Dans cette thèse nous allons aborder les mécanismes d’émergence et de transmission des souches bactériennes résistantes aux antibiotiques, le rôle du chirurgien-dentiste dans

Dans ces conditions d'élevage, la fréquence fonda- mentale des syllabes de la première section du chant paraît assez basse, mais, dans la nature, on enregistre parfois des syllabes

De manière tout à fait différente, la troisième image (fig. 9) nous met face à un temps présent caractérisé par la condensation qualitative d’une durée, où il n’y a plus

En cas de rechute survenant plus de six mois après l'obtention d'une rémission complète avec un traitement à base de platine (tableau 4), un nouveau traitement identique

Müller-Beck (1968 : 48) insiste sur la pré- sence, dans l’industrie de la grotte Nietoperzowa, de pointes relativement minces, partiellement retou- chées sur les faces dorsale

•  Comprendre le comportement des consommateurs •  Mesurer comment ils réagissent aux incitations •  Construction d’un simulateur tarifaire pour

faveur d’interventions législatives rendues nécessaires par la persistance des consommations illicites, d’autres dispositifs ont été mis en place : libéralisation de