Suite à quelques discussions récentes, je me suis replonger dans les arcanes du RDF. En effet, Pearltrees offrant une possibilité d'exportation des favoris en RDF, ma curiosité naturelle m'a poussée à investiguer de manière à savoir ce que je pouvais faire concrètement avec ce fichier. En plus, @SebDeclercq a été assez gentil que pour me transmettre sa propre sauvegarde, m'épargnant ainsi la tâche fastidieuse d'enrichir mes propres Pearltrees.
Donc, j'ai un fichier contenant plein de liens, et maintenant, je veux exploiter ces informations. Comment faire ? Comme indiqué dans le billet du blog de Nicolas Cynober, nous pouvons utiliser un outil comme SPARQLer pour manipuler les informations. Dans SPARQLer, vous pourrez soumettre votre requête écrite en SPARQL, et obtenir une réponse sous différent format :
- en XML, avec la possibilité de renseigner un script XSLT permettant de transformer le document (par exemple en XHTML) ;
- en JSON ;
- ou encore simplement en texte.
Donc, c'est un outil très intéressant, mais il faut être en ligne, et personnellement, j'aime bien avoir mes outils directement disponibles, quelque soit mes accès au web. Et donc, se pose la question de savoir ce que je peux avoir directement sur ma machine. Un petit tour par le CPAN, et hop, voici quelques modules prometteurs :
- RDF::Redland ;
- RDF::Trine ;
- et celui qu'il me faut pour interroger le fichier via la SPARQL : RDF::Query.
Un petit cpan RDF::Query plus tard, je me retrouve donc avec un module
permettant d'interroger en SPARQL un store RDF.
Mais comment faire passer mon fichier pearltrees_export.rdf dans un store
RDF ? Relativement simplement, RDF::Trine propose dans son répertoire bin
quelques exemples de scripts qui vont nous aider :
-
rdf_init_store.pl qui, comme son nom l'indique, permet d'initialiser un
magasin RDF ; j'ai donc lancé la commande suivante pour initialiser ma
base de données :
./rdf_init_store.pl sqlite ./pearltrees.db '' '' pearltreesce qui signifie donc :- initialise une base de données en utilisant SQLite ;
-
le nom de cette base de données est
./pearltrees.db1; - le premier '' permet de spécifier le nom d'utilisateur pour la base de données, et il n'y en a pas dans le cas présent ;
- le second '' permet de spécifier le mot de passe, idem que précédemment2
-
et finalement,
pearltreesest le nom du modèle de données RDF, ici j'ai arbitrairement donné le nom depearltrees; -
la commande une fois lancée me donne un message d'avertissement :
Log4perl: Seems like no initialization happened. Forgot to call init()?, mais quand je vérifie via un
sqlite3 pearltrees.db, je constate que les tables (Bnodes, Literals, Models, Resources et Statement2742456113224982524) ont bien été créées, donc, pas de soucis !
-
rdf_store_add_file.pl qui permet d'ajouter un fichier dans la base de
données de triplets ; ce script s'utilise de la manière suivante
./rdf_store_add_file.pl sqlite ./pearltrees.db '' '' pearltrees sebdeclercq.rdf, ce qui suit la logique du script précédent (utilisation de SQLite, le nom de la base de données, le nom d'utilisateur, le mot de passe et le nom du modèle de données RDF.
Sur mon EeePC 1005HA, voici quelques statistiques :
- pour un fichier RDF de 421515 octets, j'obtiens une base de données de 1872896 octets ;
-
le traitement du fichier prend un peu de temps, voici le résultat de
time:
real 16m52.234s user 3m33.573s sys 0m17.757s
Après l'exécution de rdf_store_add_file.pl, nous nous retrouvons donc avec une base de données qui pourra servir de base à RDF::Query.
Voici un petit script illustrant l'utilisation de RDF::Query :
#!/usr/bin/env perl
use strict;
use warnings;
use RDF::Trine;
use RDF::Trine::Store::DBI;
use RDF::Query;
use Data::Dump;
my $sparql = <<'SPARQL';
PREFIX pt: <http://www.pearltrees.com/rdf/0.1/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title ?url
WHERE {
?pearl rdf:type pt:pearl;
dc:title ?title;
owl:sameAs ?url;
pt:parentTree ?tree
}
ORDER BY DESC (?tree)
SPARQL
my $store =
RDF::Trine::Store::DBI->new( 'pearltrees', 'DBI:SQLite:dbname=./pearltrees.db', '', '' );
my $model = RDF::Trine::Model->new($store);
my $querier = RDF::Query->new($sparql);
my $iterator = $querier->execute($model);
while ( my $row = $iterator->next ) {
print $row->{title} . ' ' . $row->{url} . "\n";
}
Voilà pour aujourd'hui. Je suis en train de travailler sur un script s'appuyant sur HTTP::Server::Simple et Template::Declare afin d'avoir une interface plus agréable pour tester mes requêtes SPARQL.
Keep in touch…

Hi!
My french is really bad, but I could tell that this is about RDF and Perl. I don't know if you are at the perlrdf mailing list.
Also, I'm starting to organize a perlrdf hackathon here in Norway at the around the 20th of April. All very uncertain yet, but it shouldn't be very hard to get here from Belgium. :-)
Hi!
You're right, this is indeed a post about RDF and Perl :)
And as I'm not yet on the perlrdf mailing list, I've just submit a subscription request.
Concerning your idea of a perlrdf hackathon, it is really fun and intersting! I doubt to be able to go in Norway during this period ($work), but if it's possible to hack online, I can free some time!
Btw, can you tell me how to access the archives of the perlrdf mailing list. When I try to access http://lists.perlrdf.org/pipermail/dev/, I receive a Forbidden message.
Bye