Exploitation de données
L'un des grands intérêt de BaseX est l'exploitation de volumes importants de données fournis sous format XML ce qui le rend intéressant pour l'exploitation des données Open Data.
De nombreuses sources sont disponibles sur internet permettent d'obtenir des fichiers exploitables :
Data.gov (www.data.gov)
Pour cette exercice, nous allons exploiter les données sur les prix des carburants mises à disposition quotidiennement sur le site :
http://www.prix-carburants.economie.gouv.fr/rubrique/opendata/
Mise en place BaseX
BaseX est léger et portable, sous Linux, on peut l'utiliser directement par extraire l'archive.
Lien de téléchargement : http://basex.org/products/download/all-downloads/
Sous Linux : Zip Archive
Sous Windows : Windows Installer
Pour accéder à l'interface de BaseX, exécuter .../basex/bin/basexgui avec
./basexgui
Import du fichier XML
Après avoir téléchargé le fichier à l'adresse http://donnees.roulez-eco.fr/opendata/jour et en extraire le XML, il faut créer une nouvelle base à partir de ce fichier sous BaseX.
Pour cela :
Database -> New (raccourci CTRL + N)
Dans le champ input file or directory : browse => fichier xml téléchargé.
OK
La base est chargée !
for $station in //pdv
return $station
Visualisation des données
Explorer le fichier XML grâce aux différentes vues de BaseX. Utiliser diverses représentations graphiques. Pour cela :
Cliquer sur "Vizualisation"
Selectionner une représentation
Explorer les données
Question
Question
Compter, pour chaque station présente à Compiègne, le nombre de service qu'elle offre et produire un XML de la forme :
<listeStation>
<station id="$ID">
<adresse> $Adresse </adresse>
<nombreService> $NBService </nombreService>
</station>
</listeStation>
Utiliser la fonction count et les expressions XPath pour les noeuds service.
Solution
<listeStation>
{
for $station in //pdv[@cp=60200]
return <station>
{ $station/@id }
{$station/adresse }
<nombreService> {
count( $station/services/service) }
</nombreService>
</station>
}
</listeStation>
Question
Donner le nombre de stations services qui proposent chaque type d'essence et le prix moyen.
<récapitulatif>
<produit nom="$Variable1">
<nombreStation> $NOMBRE_STATION </nombreStation>
<prixMoyen> $PRIX_MOYEN </prixMoyen>
</produit>
</récapitulatif>
Penser à utiliser les clauses définies dans XQuery 3.0 comme group by
Il est possible d'itérer sur tous les éléments prix du fichier avec l'expression //pdv/prix.
Solution
<recapitulatif>
{
for $ess in //pdv/prix
let $produit := $ess/@nom
group by $produit
return <produit name="{$produit}">
<nombreStation> {count($ess)} </nombreStation>
<prixMoyen> {avg($ess/@valeur)}</prixMoyen>
</produit>
}
</recapitulatif>