lundi 6 décembre 2010

Berkeley DB XML

Berkeley DB XML est une surcouche à Berkeley DB qui permet d'hériter de toutes ses fonctionnalités pour le stockage de documents XML.

En plus du stockage, BDB XML apporte les fonctionnalités suivantes :
- Indexation des noeuds, des attributs et des metadata
- Indexation au niveau noeud ou document
- QueryPlan
- Xquery 1.0
- Possibilité d'ajouter/requêter des metadata associées aux documents
- Documents modifiables (remplacer un sous ensemble du document peut être plus rapide)
- Validation (Il est possible de fournir un schema xsd qui est vérifié à l'insertion d'un document)
- Compression zlib par défaut (personnalisable)

XQUERY (XML Query Language) est disponible pour effectuer des recherches/modifications/ajouts de documents XML.
Il s'appuie sur Xqilla (bibliothèque C++) pour effectuer le parsing des requêtes Xquery/XPath.
Xqilla utilise Xerces (bibliothèque C++) pour effectuer le parsing et la validation des documents XML.
XQuery supporte les «Expressions FLWOR» (For/Let/Where/Order/Return) qui permettent d'effectuer toute sorte de traitements sur les données comme les boucles, les tris, le filtrage.
Il n'est pas encore possible de grouper les données avec XQuery 1.0, mais cette fonctionnalité founie par XQuery 1.1 sera certainement supportée dans l'une des prochaines versions de Berkeley DB XML. Pour plus d'information, vous pouvez vous rendre sur http://www.w3.org/TR/xquery.

Voyons quelques exemples simples de traitements qu'il vous est possible d'effectuer avec le language XQuery (dans l'ensemble des exemples qui suivent, vous pouvez utiliser l'interpréteur dbxml) :

- Pour ajouter un document au container test.dbxml
dbxml -h /var/tmp/
dbxml>createContainer c1.dbxml
dbxml> put p1 '<person name="pignon" age="32" Taille="160" genre="M">Charles</person>'
dbxml> put p2 '<person age="31" Taille="190" genre="M">Cyril Scetbon</person>'

Pour mettre à jour la valeur de l'attribut age du noeud person dont la valeur de l'attribut name vaut pignon
- replace value of node collection('c1.dbxml')/person[@name='pignon']/@age with '54'

Pour récupérer à partir du container c1.dbxml la valeur du noeud person dont la valeur de l'attribut Taille est supérieur à 180 et dont la valeur de l'attribut genre vaut M
- collection("c1.dbxml")/person[@Taille>180 and genre="M"]/text()
Cyril Scetbon

Pour compter le nombre de valeur distinctes de l'attribut Taille de tous les noeuds person contenus dans le container c1.dbxml
- count(distinct-values(collection("cont2.dbxml")/person/@Taille))
3

Et voici d'autres exemples utilisant des expressions FLWOR :

Pour afficher les chiffres de 1 à 10
- for $c in 1 to 3 return $c
1
2
3

Pour afficher le nom de tous les auteurs (valeur de l'attribut name du noeud author des documents du container authors.dbxml) qui ont écrit le livre dont le titre est 'MySQL 5 Administration et Optimisation' (vérification en faisant une jointure entre les containers books.dbxml et authors.dbxml sur la relation [valeur de l'attribut id du noeud /author = valeur de l'attribut id du noeud /book/author])
-for $book in collection("books.dbxml")/book[title='MySQL 5 Administration et Optimisation']
for $author in collection("authors.dbxml")/author[@id=$book/author/@id]
order by $author/name
return <author>{$author/name/string()}</author>
<author>Stephane Combaudon</author>
<author>Olivier Dasini</author>
<author>Cyril Scetbon</author>

Pour afficher l'ensemble des noeuds person du container c2.dbxml pour lesquels la valeur de l'attribut Taille est supérieur à 180 en les insérant entre des balises <response> </response>
- for $p in collection("c2.dbxml")/person[@Taille>180]
order by $p/@Taille descending
return <response>{$p}</respoonse>
<person genre="F" Taille="185">Brigitte Nielsen</person>
<person genre="M" Taille="182">Cyril Scetbon</person>


Dans un prochain article, nous verrons comment créer des index et vérifier que nos requêtes les utilisent bien.
Lire la suite...