xml-database:exist_db printable version

Quelques notes à propos de eXist-db

Les databases XML

Bibliographie:

  • Le Maitre, Murisasco, Indexation et interrogation de photos de presse décrites en MPEG-7 et stockées dans une base de données XML.

Autres sources:

Petit rappel sur les databases XML: elles peuvent être XML-native (NXD, Native XML Database) ou XML-enabled.
eXist est XML-native, comme XIndice, Tamino, Berkeley DB XML ou XediX. On peut cependant dire que eXist, XIndice utilisent un schema independant model, ce qui n'est pas le cas de XediX car une DTD du type de document à indexer est requis.

MonetDB, Oracle sont XML-enabled.

Voir cette page sur le site de eXist.
Le site du projet eXist utilise eXist+Cocoon, et les URL contiennent la query, c'est assez peu pratique et peu lisible à cause de :l'URL-encoding.

Quelques critiques

  • le moteur n'est pas fait pour les gros volume de données, j'ai essayé à plusieurs reprises d'indexer la database LabelMe, mais à chaque fois l'indexation à plantée, faisant planter également toute la base.
  • l'indexation est très lente… (et il me semble avoir vu plusieurs retour d'utilisation sur le WEB disant que eXist était bien plus performant en temps d'indexation que XIndice, [ :!: réf. nécessaire ]).

Il y a plusieurs moyen de requêter eXist, en utilisant XML:DB API ou REST API from XPL, voir tutoriel.

Installation de eXist

eXist peut être installé:

  • en serveur standalone.
  • dans un servlet container comme Jetty ou tomcat.
  • embedded dans une application en utilisant XML:DB API.

Installation à partir du WAR

Il faut absolument renommer le .war, par exemple eXist-1.2.4-rev8072.war en exist.war sinon Tomcat semble perdu.
En fait, j'aurais imaginé que la configuration de déploiement du WAR prenait en compte le nom du fichier du WAR…

Les types d'index dans eXist

Sources:

Différents types d'index dans eXist:

  • Structural indexes: indexent la structure nodal des documents XML, elements (tags) et attributs.
  • Range indexes: mappent des noeuds textes et attributs spécifiques des documents vers des valeurs typées.
  • Full text indexes: mappent des noeuds textes et attributs spécifiques des documents vers des text tokens.
  • NGram indexes: mappent des noeuds textes et attributs spécifiques des documents vers des splitted tokens of n-characters (n==3 by default). Est dit très efficace pour la recherche de sous-chaîne exactes, quand la séparation des tokens par des espaces est difficile et donc que la recherche plein texte est difficile.
  • Spatial indexes: mappent les documents qui contiennent des géométries référencées vers des structures de données dédiées permettant des requêtes spatiales efficaces.

Les commentaires et les XML processing instructions ne sont pas indexés.

XML-DB API

:!: Cette API n'est presque plus utilisée.

Sources:

XML-DB API ou XAPI est un standard pour la gestion des données dans les databases XML, c'est un ensemble d'interfaces implémentées car les éditeurs pour permettre d'interagir avec leurs databases.
Cette API apporte une interface commune pour les databases XML-enabled et XML-natives.

La façon de faire la plus pratique de travailler avec eXist en Java est d'utiliser XML:DB API.
Les composants basiques employés dans l'utilisation de cette API sont: driver, collection, resource et service.

  • les drivers sont des implémentations des interfaces à la database. Ils encapsulent la logique d'accès à la database pour une database en particulier (comme eXist, XediX, MonetDB etc.). Ils doivent être enregistrés auprès du DatabaseManager. Je n'ai pas trouvé où télécharger le driver de eXist (et uniquement le driver), mais on peut le retrouver dans le WAR (dans WEB-INF/lib/exist.jar).
  • Une collection est un container hiérarchique pour des resources ou d'autres sub-collections.
  • Deux différentes resources sont définies dans l'API: XMLResource et BinaryResource. Une XMLResource représente un document ou un fragment XML, sélectionné par une query XPath.
  • les services sont utilisés lors de tâches spéciales comme requêter une collection avec XPath, ou gérer une collection.

Développer avec eXist

libraries

Les .jar nécessaires à l'écriture d'un client sont:

  • exist.jar
  • exist-modules.jar
  • antlr-X.X.X.jar
  • commons-pool-X.X.jar
  • commons-collections-X.X.jar
  • commons-logging-X.X.X.jar
  • jgroups-all.jar
  • log4j-X.X.X.jar
  • sunxacml.jar
  • xmldb.jar
  • xmlrpc-1.2-patched.jar
  • stax-api-X.X.X.jar (for Java 1.4 only)
  • jta.jar

Il faut extraire ces .jar du WAR de eXist, car certaines versions sont patchées ou sont des versions qui datent un peu ou qui ne sont plus disponibles sur le site de leur projet respectifs.

un peu de code

Sources:

Le guide du développeur est un bon début pour créer une collection et indexer des documents.
Pour supprimer une collection, il faut utiliser un objet CollectionManagementService (et non CollectionManager comme il existe dans certaines libraries implémentant XML:DB API, cet objet est un ajout et ne fait pas partie de l'API).

Un point négatif de eXist, pour la suppression d'une collection, le code suivant génère des exceptions:

//if collection ever exists, delete it.
		if (col != null) {
			Database[] dbs = DatabaseManager.getDatabases();
			CollectionManagementService svc = null;
			try {
				svc = (CollectionManagementService) col.getService(
						"CollectionManager", "1.0");
				svc.removeCollection(EXIST_URI + collectionName);
			} catch (XMLDBException e) {
				e.printStackTrace();
			}
			return;
		}

Les exceptions levées sont:

org.xmldb.api.base.XMLDBException: org.exist.EXistException: collection /db/LabelMe not found!
org.exist.xmldb.RemoteCollectionManagementService@1bac748
     at org.exist.xmldb.RemoteCollection.readCollection(RemoteCollection.java:393)
     at org.exist.xmldb.RemoteCollection.removeChildCollection(RemoteCollection.java:429)
     at org.exist.xmldb.RemoteCollectionManagementService.removeCollection(RemoteCollectionManagementService.java:143)
     at org.exist.xmldb.RemoteCollectionManagementService.removeCollection(RemoteCollectionManagementService.java:120)
     at net.trevize.labelthem.ExistDBManager4LabelMe.indexDataset(ExistDBManager4LabelMe.java:66)
     at net.trevize.labelthem.ExistDBManager4LabelMe.main(ExistDBManager4LabelMe.java:197)
Caused by: org.apache.xmlrpc.XmlRpcException: org.exist.EXistException: collection /db/LabelMe not found!
     at org.apache.xmlrpc.XmlRpcClient$Worker.execute(XmlRpcClient.java:457)
     at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:163)
     at org.exist.xmldb.RemoteCollection.readCollection(RemoteCollection.java:391)
     ... 5 more
[B@209f4eorg.apache.xmlrpc.XmlRpcException: org.exist.EXistException: collection /db/LabelMe not found!
     at org.apache.xmlrpc.XmlRpcClient$Worker.execute(XmlRpcClient.java:457)
     at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:163)
     at org.exist.xmldb.RemoteCollection.readCollection(RemoteCollection.java:391)
     at org.exist.xmldb.RemoteCollection.removeChildCollection(RemoteCollection.java:429)
     at org.exist.xmldb.RemoteCollectionManagementService.removeCollection(RemoteCollectionManagementService.java:143)
     at org.exist.xmldb.RemoteCollectionManagementService.removeCollection(RemoteCollectionManagementService.java:120)
     at net.trevize.labelthem.ExistDBManager4LabelMe.indexDataset(ExistDBManager4LabelMe.java:66)
     at net.trevize.labelthem.ExistDBManager4LabelMe.main(ExistDBManager4LabelMe.java:197)
Caused by: org.apache.xmlrpc.XmlRpcException: org.exist.EXistException: collection /db/LabelMe not found! 
     at org.apache.xmlrpc.XmlRpcClient$Worker.execute(XmlRpcClient.java:457)
     at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:163)
     at org.exist.xmldb.RemoteCollection.readCollection(RemoteCollection.java:391)
     at org.exist.xmldb.RemoteCollection.removeChildCollection(RemoteCollection.java:429)
     at org.exist.xmldb.RemoteCollectionManagementService.removeCollection(RemoteCollectionManagementService.java:143)
     at org.exist.xmldb.RemoteCollectionManagementService.removeCollection(RemoteCollectionManagementService.java:120)
     at net.trevize.labelthem.ExistDBManager4LabelMe.indexDataset(ExistDBManager4LabelMe.java:66)
     at net.trevize.labelthem.ExistDBManager4LabelMe.main(ExistDBManager4LabelMe.java:197)

Ce qui est assez étrange… La collection est bien supprimée mais des exceptions sont quand même levées !

Un autre problème: lorsque qu'un appel XML-RPC pour XML:DB plante (ou en arrêtant le processus client violemment), eXist semble un peu paumé. Le client ne peut plus supprimer la collection incriminée, et de plus même l'inteface WEB admin de eXist n'arrive pas à browser la collection. Ma solution est de supprimer la collection avec cette interface WEB et de relancer l'indexation de la collection.

Expérimentation avec LabelMe

L'indexation est très lente, et n'aboutie pas, au bout de 3h de calcul, environ la moitié du dataset est indexé, puis survient:

org.xmldb.api.base.XMLDBException: java.lang.IllegalArgumentException: Document id ('22139') and proxy id ('22136') differ !
	at org.exist.xmldb.RemoteCollection.store(RemoteCollection.java:522)
	at org.exist.xmldb.RemoteCollection.storeResource(RemoteCollection.java:483)
	at org.exist.xmldb.RemoteCollection.storeResource(RemoteCollection.java:469)
	at net.trevize.labelthem.ExistDBManager4LabelMe.indexFile(ExistDBManager4LabelMe.java:128)
	at net.trevize.labelthem.ExistDBManager4LabelMe.indexDir(ExistDBManager4LabelMe.java:108)
	at net.trevize.labelthem.ExistDBManager4LabelMe.indexDir(ExistDBManager4LabelMe.java:101)
	at net.trevize.labelthem.ExistDBManager4LabelMe.indexDataset(ExistDBManager4LabelMe.java:90)
	at net.trevize.labelthem.ExistDBManager4LabelMe.main(ExistDBManager4LabelMe.java:195)
Caused by: org.apache.xmlrpc.XmlRpcException: java.lang.IllegalArgumentException: Document id ('22139') and proxy id ('22136') differ !
	at org.apache.xmlrpc.XmlRpcClient$Worker.execute(XmlRpcClient.java:457)
	at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:163)
	at org.exist.xmldb.RemoteCollection.store(RemoteCollection.java:520)
	... 7 more

Ces exceptions sont bloquantes pour le processus d'indexation apparemment (et la servlet eXist est KO également! )

D'après un collègue (G. Dupont), le processus d'indexation de eXist réagit mieux quand on découpe le dataset à indexer en plusieurs collections, pour le moment i.e. 11/12/2008, je voulais faire une collection /db/LabelMe contenant toutes les annotations, mais dans mes prochaines expérimentations je vais construire la collection /db/LabelMe comme le répertoire annotations du dataset, i.e. une sous-collection par répertoire d'annotations.

De plus, si un appel XML-RPC de XML:DB pour l'indexation plante, le contenu de la collection semble ne plus être utilisable (ni browsable depuis l'interface admin de eXist…). De plus, mon client XML:DB ne pas supprimer la collection incriminée, ma solution est de la supprimée de puis l'interface WEB de eXist.

Note 12/12/2008: deuxième plantage, je pense que eXist n'est pas fait pour les gros volume de donnée (bien que les 46,302 fichiers XML ne soient pas vraiment un gros volume de données), je vais essayer MonetDB probablement.

 
xml-database/exist_db.txt · Last modified: 2010/12/01 15:59 by njames

 © Nicolas James 2009-2011

 Valid XHTML 1.0 Transitional Valid CSS! DokuWiki