Wikipédia:Requêtes XML

Un article de Wikipédia, l'encyclopédie libre.

MediaWiki utilise le serveur de base de données relationnelle MySQL pour stocker ses données. Comme toute base de données, il est possible de faire des requêtes pour obtenir par exemple la liste des articles modifiés un jour donné. Le guide « Requêtes SQL » donne des conseils à ce sujet.

Depuis le mois de juillet 2005, une partie des dumps SQL a été remplacée par des fichiers XML (voir http://download.wikimedia.org/). Ce guide a pour but d'expliquer comment effectuer des requêtes sur ce nouveau format.

Sommaire

[modifier] Les fichiers

Plusieurs fichiers sont disponibles :

  • pages_current.xml.gz : versions actuelles des pages
  • all_titles_in_ns0.gz : tous les titres dans l'espace principal
  • pages_full.xml.gz : toutes les pages, historiques, etc.

[modifier] Importation

Un dump peut être introduit de plusieurs façons dans un MediaWiki local. Les développeurs recommandent l'utilisation de mwdumper (programme en Java) au lieu du script Php. Ce programme a été conçu par Brion Vibber, les questions relatives à son utilisation sont à poster sur la liste (en anglais) wikitech-l. Le programme est disponible à l'adresse suivante : http://download.wikimedia.org/tools

Néanmoins, voici la procédure pour le faire en php :

zcat pages_full.xml.gz | php importDump.php

ou si le format de l'archive est bzip2 :

bzip2 -dc pages_full.xml.bz2 | php importDump.php

importDump.php se trouve dans le répertoire maintenance de MediaWiki, le script n'est pas très user-friendly mais devrait afficher au bout d'un certain temps ce type de sortie (on peut aussi vérifier avec la commande df ou top que le script est bien en train de travailler) :

100 (0.28551094485 pages/sec 28.8651565243 revs/sec)
100 (0.283854484845 pages/sec 28.7005269627 revs/sec)
100 (0.283835636868 pages/sec 28.7014596001 revs/sec)
100 (0.283820668186 pages/sec 28.7027841736 revs/sec)
100 (0.283806693527 pages/sec 28.7042089833 revs/sec)
(...)

Voir aussi de:Wikipedia:XML-Dump pour des informations supplémentaires.

[modifier] Format et DTD

à faire..

Voir meta:Help:Export en attendant.

[modifier] Première méthode : Insertion du XML dans une base MySQL

La méthode la plus simple, si l'on est habitué à travailler avec les requêtes en SQL, consiste à convertir le fichier XML en fichier SQL. La sortie peut ensuite être insérée dans la base de données comme un dump normal en SQL. Un script en Perl permet d'effectuer la conversion, il est disponible ici (la page est protégée pour éviter des modifications douteuses du code) ou sur la page originale : de:Wikipedia:Xml2sql.

Un autre programme en Java permet de faire une opération similaire.

Si MySQL stoppe l'insertion avec un Got a packet bigger than 'max_allowed_packet' bytes, alors la variable max_allowed_packed dans le fichier my.cnf doit être augmentée. Voir [1] en cas de problèmes de ce type.

Valeurs conseillées (testées avec succès lors de l'insertion via le script Perl) :

key_buffer                              = 16M
max_allowed_packet                      = 32M
table_cache                             = 64
sort_buffer_size                        = 512K
net_buffer_length                       = 8K
read_buffer_size                        = 256K

[modifier] Avec le script en Perl

Il faut avoir créé au préalable la base de données wikipedia (ou autre, changer le paramètre -D dans la ligne de commande si nécessaire) afin de pouvoir insérer les données. Ceci se fait avec la commande "CREATE DATABASE wikipedia" dans la ligne de commande MySQL. (voir la page de Wikipédia à ce sujet).

Pour effectuer la conversion, on procède comme suit (sous Unix/Linux). À noter que des messages d'avertissement apparaissent :

dake@gentoo /tmp $ chmod +x xml2sql
dake@gentoo /tmp $ zcat 20050713_pages_current.xml.gz | ./xml2sql | mysql -u nom_utilisateur -D wikipedia
duplicate key name_title_dup_prevention: 5+Statuts pour une association en France/archive1
...
duplicate key name_title_dup_prevention: 6+Frédéric III de Prusse.jpg
duplicate key name_title_dup_prevention: 6+RévolutionNationale.jpg
dake@gentoo /tmp $

La commande zcat fonctionne de manière similaire à cat, elle écrit le contenu du fichier sur la sortie au fur et à mesure de la décompression.

Une courte requête dans MySQL semble indiquer que la base est valide :

mysql> SELECT DATE_FORMAT(cur_timestamp, '%Y %D %M %h:%i:%s %x' ) FROM cur WHERE cur_title='RC4';
+-----------------------------------------------------+
| DATE_FORMAT(cur_timestamp, '%Y %D %M %h:%i:%s %x' ) |
+-----------------------------------------------------+
| 2005 29th June 11:56:07 2005                        |
+-----------------------------------------------------+
1 row in set (0.00 sec)

[modifier] Avec le programme en Java

Il est codé en Java 1.5 et un readme.txt en allemand décrit les opérations à suivre. Il crée un dump en SQL pour la version 1.4 de MediaWiki (table cur), pas pour la version 1.5.

Il ne tient pas compte de tous les paramètres des articles (version du 26.01.2006) :

  • supporté: id, namespace, title, text, comment, userid, username, timestamp, isredirect
  • non-supporté : restrictions, isminor

Le Jar est disponible ici : http://chsemrau.de/wikipedia/xml2sql.zip


[modifier] Deuxième méthode : STX

Les fichiers des projets Wikimedia sont trop gros pour des langages comme XSLT ou XQuery qui sont normalement utilisés pour faire des requêtes sur des fichiers XML au travers d'une architecture de type DOM (représentation en arbre du fichier XML).

Une alternative repose sur Streaming Transformations for XML (STX), un langage de transformation à une passe pour les fichiers XML. Il est possible de combiner STX et XSLT. Le projet STX se trouve sur Sourceforge à l'adresse suivante : http://stx.sourceforge.net/

Une requête prend alors cette forme :

zcat pages_full.xml.gz | java -jar joost.jar - myscript.stx

Voir meta:Processing_MediaWiki_XML_with_STX pour des exemples.

[modifier] Troisième méthode : SAX

Il est possible de coder ses propres requêtes grâce à SAX (Simple API for XML), une interface classique pour travailler avec du XML qui est basée sur la prise en charge des tags XML et la lecture au fur à et mesure du fichier. Contrairement à DOM qui doit générer un arbre et donc lire l'ensemble du fichier, SAX est capable de travailler sur des fichiers de très grande taille.

Des bibliothèques SAX sont disponibles dans un grand nombre de langages comme Java, Python, etc. Cette approche, qui ressemble à STX, nécessite toutefois d'avoir de bonnes connaissances en programmation.

[modifier] Quatrième méthode : Parse::MediaWikiDump

Parse:MediaWikiDump est un module écrit en Perl par Triddle. Il permet de lancer des requêtes sur le XML assez rapidement pour peu que l'on aie des bases en programmation.

Voir Parse::MediaWikiDump pour plus d'informations.

[modifier] Extraire les articles dont le titre contient certains caractères spéciaux

#!/usr/bin/perl -w

use strict;
use Parse::MediaWikiDump;
use utf8;

my $file = shift(@ARGV) or die "un dump doit être spécifié : ./extract.pl nom_dump.xml";
my $pages = Parse::MediaWikiDump::Pages->new($file);
my $page;

binmode STDOUT, ":utf8";

while(defined($page = $pages->page)) {
  #main namespace only
  next unless $page->namespace eq '';
         if ($page->title =~ /æ|Æ|á|Á|ā|Ā|ä|Ä|å|ĉ|Ĉ|ē|Ē|ē|ě|Ě|Ë/) {
           print $page->title, "\n";
  }
}