Pearltrees, RDF & Perl

| 2 Commentaires | Aucun Trackback

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 '' '' pearltrees ce qui signifie donc :
    1. initialise une base de données en utilisant SQLite ;
    2. le nom de cette base de données est ./pearltrees.db 1;
    3. 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 ;
    4. le second '' permet de spécifier le mot de passe, idem que précédemment2
    5. et finalement, pearltrees est le nom du modèle de données RDF, ici j'ai arbitrairement donné le nom de pearltrees ;
    6. 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…

Notes de bas de page:

1 puisque nous utilisons SQLite, la base de données est en fait un fichier

2 dans le cas d'une base de données MySQL, cela aurait été nécessaire évidemment

Aucun Trackback

URL de Trackback : http://blog.bjornoya.be/mt-tb.cgi/22

2 Commentaires

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. :-)

Laisser un commentaire

À propos de cette note

Cette page contient une unique note de manu publiée le 7 mars 2010 15h54.

« On se tient au courant ! » est la note précédente de ce blog.

L'importance de l'écosystème d'un langage est la note suivante de ce blog.

Retrouvez le contenu récent sur l'index principal ou allez dans les archives pour retrouver tout le contenu.

Pages

Powered by Movable Type 4.261