Aller au contenu

SPARQL Protocol and RDF Query Language/Travail pratique/Faire un serveur SPARQL

Leçons de niveau 15
Une page de Wikiversité, la communauté pédagogique libre.

Un contributeur est en ce moment même en train de travailler en profondeur sur cette page ou section de page. Merci de ne pas modifier celle-ci afin de limiter les risques de conflit de versions jusqu’à disparition de cet avertissement .


Enlevez ce modèle dès que le travail est fini ; si le travail doit être continué, utilisez le modèle : {{Pas fini}}.


Après ce TP, vous saurez :
  • installer un serveur SPARQL
Durée : 2 heures
Matériel :
  • un serveur Linux (Fedora ou Ubuntu).
Début de la boite de navigation du travail pratique
Faire un serveur SPARQL
Image logo représentative de la faculté
T.P. no 7
Leçon : SPARQL Protocol and RDF Query Language

TP de niveau 15.

Précédent :Initiation à Eclipse
Suivant :PHP les variables
En raison de limitations techniques, la typographie souhaitable du titre, « Travail pratique : Faire un serveur SPARQL
SPARQL Protocol and RDF Query Language/Travail pratique/Faire un serveur SPARQL
 », n'a pu être restituée correctement ci-dessus.


Dans ce TP, nous allons installer notre propre triplestore, qui possédera un service HTTP pour répondre à des requêtes SPARQL.

Pourquoi installer 4Store ?

[modifier | modifier le wikicode]

Il existe de nombreux triplestores.

Pour les Unix-like, l'un d'eux se nomme 4Store (pour Windows il existe aussi Virtuoso qui tourne avec Cygwin).

4Store est sous Licence publique générale GNU version 3

L'objectif de la licence GNU GPL, selon ses créateurs est de garantir à l'utilisateur les droits suivants (appelés libertés) sur un programme informatique :

  • La liberté d'exécuter le logiciel, pour n’importe quel usage ;
  • La liberté d'étudier le fonctionnement d'un programme et de l'adapter à ses besoins, ce qui passe par l'accès aux codes sources ;
  • La liberté de redistribuer des copies ;
  • La liberté de faire bénéficier à la communauté des versions modifiées.


Cette licence est donc adaptée à l’utilisation de ce logiciel dans les établissements publics et privés.

Ce TP a pour objectif d'installer 4Store. Nous verrons dans un prochain TP comment interroger un serveur SPARQL sans se soucier du logiciel utilisé.

À savoir avant de commencer

[modifier | modifier le wikicode]

Les logiciels sous licence GPL sont souvent des agglomérats de nombreux logiciels qui ont chacun une installation propre ou même des communautés de développeurs distinctes. La compatibilité entre ces logiciels crée souvent des problèmes qui découragent les jeunes informaticiens.


L'avantage de la licence GNU d’offrir un logiciel gratuit est souvent rattrapé par le coût caché pour maintenir ou débugger ce logiciel. Or, a-t-on les moyens de payer un logiciel ou de rémunérer une société de services ?

4Store ne déroge pas à la règle et les autres triplestores également.

Toutefois, il y a quelques années, alors que MySQL était moins performant qu'Oracle ou que d'autres logiciels, MySQL est arrivé à s'imposer comme la BDD la plus utilisée, en étant une BDD sous licence GPL.


Un jeune informaticien peut donc à juste titre faire l’effort de maîtriser 4Store dès maintenant pour être récompensé à l'avenir.

Ce TP n'a pas pour objectif de former des experts, mais de comprendre l'installation de ce logiciel et de trouver des points d'entrée dans les communautés, qui pourront vous aider en cas de difficultés.

Fedora 17 x86_64

[modifier | modifier le wikicode]
  • Installer les dépots Sparql.pro and Epel :
wget http://repo.sparql.pro/fedora/sparql-pro-1.0.0-1.noarch.rpm
rpm -ivh sparql-pro-1.0.0-1.noarch.rpm
  • Puis installer 4Store :
yum install 4store
  • La première fois, il faudra créer la base de données par défaut : DefaultKB
    • Vous pourrez changer son nom mais il vous faudra alors changer les fichiers /etc/4store.conf et /etc/init.d/4store.
4s-backend-setup DefaultKB

Vous pourrez désinstaller 4Store mais la base de données ne sera pas détruite (en théorie)

  • Pour démarrer le service HTTP :
service 4store start
  • Le service utilise le port 8181 : http://localhost:8181/status/
    • Vous pourrez changer le port 8181 (lire la documentation : man 4store.conf )
  • Et vous pouvez lancer au démarrage du serveur le service avec la commande :
chkconfig --level 345 4store on

CentOs 6 x86_64

[modifier | modifier le wikicode]
  • Installer les dépots Sparql.pro and Epel :
wget http://repo.sparql.pro/centos/sparql-pro-1.0.0-1.noarch.rpm
wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh sparql-pro-1.0.0-1.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
  • Puis installer 4Store :
yum install 4store
  • La première fois, il faudra créer la base de données par défaut : DefaultKB
    • Vous pourrez changer son nom mais il vous faudra alors changer les fichiers /etc/4store.conf et /etc/init.d/4store.
4s-backend-setup DefaultKB

Vous pourrez désinstaller 4Store mais la base de données ne sera pas détruite (en théorie)

  • Pour démarrer le service HTTP :
service 4store start
  • Le service utilise le port 8181 : http://localhost:8181/status/
    • Vous pourrez changer le port 8181 (lire la documentation : man 4store.conf )
  • Et vous pouvez lancer au démarrage du serveur le service avec la commande :
chkconfig --level 345 4store on

Il faut insérer dans le fichier /etc/apt/sources.list le dépôt (en France) qui va contenir le package, par exemple :

deb http://mirror.ovh.net/ubuntu precise main restricted universe

Ensuite, il faut mettre à jour apt-get avec ce nouveau dépot :

sudo apt-get update

Vous pouvez maintenant installer 4Store via la commande suivante sur Ubuntu:

sudo apt-get install 4store

Installation manuelle

[modifier | modifier le wikicode]

On nomme dépendances les logiciels nécessaires au fonctionnement ou à la compilation d'un autre logiciel.

Ici, nous allons seulement décrire les dépendances de 4Store pour Fedora et Ubuntu.

Si vous avez un autre système, il vous faudra consulter la documentation de 4Store pour installer les bonnes dépendances.

Ubuntu Voici la commande à exécuter pour installer les premières dépendances :

sudo apt-get install automake libtool gtk-doc-tools flex bison libxml2-dev libglib2.0-dev libpcre3-dev avahi-daemon libavahi-client-dev libavahi-glib-dev libreadline-dev git-core

Fedora Voici la commande à exécuter pour installer les premières dépendances :

yum install gcc glib2-devel libxml2-devel pcre-devel avahi avahi-devel avahi-glib-devel readline-devel ncurses-devel termcap libtermcap-devel expat-devel zlib-devel libtool automake flex gtk-doc bison git-core

Installation des librairies Redland : Raptor, Rasqal

[modifier | modifier le wikicode]

La librairie Redland est aussi une des dépendances de 4Store, mais certaines librairies ne sont pas mises à jour régulièrement.

Installation :

Ubuntu

sudo apt-get install redland

Fedora

sudo yum install redland


Configuration réseau

[modifier | modifier le wikicode]

En principe, on donne à 4Store un port comme 9000, car il est rarement ouvert sur le réseau dans la configuration réseau par défaut. Ce paramètre est indiqué à 4Store au moment de son exécution.

Cependant pour Fedora uniquement, il faut ajouter une ligne dans le fichier /etc/sysconfig/iptables (attention : il faut ajouter cette ligne juste après la dernière ligne qui commence par "-A INPUT") :

-A INPUT -m state --state NEW -m udp -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT

Cette ligne est nécessaire au logiciel Avahi qu'utilise 4Store.

Pour prendre en compte cette modification sous Fedora :

service iptables restart

Compilation & installation

[modifier | modifier le wikicode]

4Store est encore un jeune logiciel et ne peut pas encore être installé via des packages. Le plus simple est encore de le compiler à partir des dernières sources avec la méthode suivante :

cd ~/projets
git clone https://github.com/garlik/4store.git
cd 4store

#create the tarball
./make-tarball.sh
mv 4store-v<MettreLeNumeroDeVersion>.tar.gz ../.
cd ..
tar xvzf 4store-v<MettreLeNumeroDeVersion>.tar.gz
cd 4store-v<MettreLeNumeroDeVersion>

#Compile
./autogen.sh
./configure
make

#create the folder of logs
sudo mkdir /var/log/4store

Ubuntu

sudo make install

Fedora

su -
make install

Pour tester (attention : seule la première série de tests doit passer au vert, les autres tests concernent la partie en cours de développement) :

make test

Mode d’emploi du serveur

[modifier | modifier le wikicode]

Créer une base de données

[modifier | modifier le wikicode]
sudo 4s-backend-setup test

Démarrer le serveur SPARQL

[modifier | modifier le wikicode]

Ici, nous exécuterons le service sur le port 8081 (paramètre -p) et nous désirons voir les erreurs en sortie (paramètre -D, mode debug).

sudo 4s-backend test
sudo 4s-httpd -D test -p 8081

Vérifier l'état du serveur SPARQL

[modifier | modifier le wikicode]

Allez sur la page : http://localhost:8081/status

Vous devez voir la page statut du serveur 4Store.

Arrêter le serveur SPARQL

[modifier | modifier le wikicode]
sudo killall 4s-httpd
sudo killall 4s-backend

Supprimer une base de données

[modifier | modifier le wikicode]
sudo killall 4s-httpd
sudo killall 4s-backend
sudo 4s-backend-destroy test

Service automatique

[modifier | modifier le wikicode]

4Store ne se lance pas automatiquement au démarrage de votre ordinateur. Or, cela est indispensable si l’on veut avoir un service robuste qui redémarre en même temps que son serveur (et cela évitera de le redémarrer manuellement durant les prochains TP).

Installation (niveau expert)

[modifier | modifier le wikicode]

On commence par créer notre base de données, ou silo de données, qui contiendra nos graphes. On va l'appeler "DefaultKB" (KB pour KnowledgeBase).

sudo 4s-backend-setup DefaultKB

On va maintenant fabriquer rapidement un service 4Store pour démarrer et arrêter le service SPARQL avec la base de données "DefaultKB".

On fabrique le script pour lancer le service automatiquement au démarrage du serveur :

sudo vim /etc/init.d/4s-httpd

Copier dans ce fichier le code suivant pour un système débian:

#! /bin/sh -e
DAEMON_BACKEND="/usr/local/bin/4s-backend" 
DAEMON_HTTPD="/usr/local/bin/4s-httpd" 
DAEMON_KB="DefaultKB" #argument à utiliser par le programme
DAEMON_PORT="8081"
DAEMONUSER="root" #utilisateur du programme
DAEMON_NAME_BACKEND="4s-backend" 
DAEMON_NAME_HTTPD="4s-httpd" 
DAEMON_NAME="4s-httpd"

PATH="/sbin:/bin:/usr/sbin:/usr/bin" #Ne pas toucher

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

d_start () {
        log_daemon_msg "Starting system $DAEMON_NAME Daemon"
	$DAEMON_BACKEND $DAEMON_KB
	$DAEMON_HTTPD -p $DAEMON_PORT $DAEMON_KB
        log_end_msg 0
}

d_stop () {
        log_daemon_msg "Stopping system $DAEMON_NAME Daemon"
	killall $DAEMON_HTTPD
	killall $DAEMON_BACKEND
	log_end_msg 0
}

case "$1" in

        start)
                d_start
                ;;
        stop|force-stop)
                d_stop
                ;;
        restart|reload|force-reload)
                d_stop
                d_start 
                ;;
        status)
                status_of_proc "$DAEMON_NAME_BACKEND" "$DAEMON_BACKEND" "system-wide $DAEMON_NAME_BACKEND" && exit 0 || exit $?
                status_of_proc "$DAEMON_NAME_HTTPD" "$DAEMON_HTTPD" "system-wide $DAEMON_NAME_HTTPD" && exit 0 || exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|force-stop|restart|reload|force-reload|status}"
                exit 1
                ;;
esac
exit 0

On autorise l'exécution de ce script :

sudo chmod 0755 /etc/init.d/4s-httpd

On teste le service :

sudo service 4s-httpd start

On vérifie que les processus 4s-httpd et 4s-backend ont démarré (il peut y avoir plusieurs processus 4s-httpd ou backend) avec la commande suivante :

ps -AL | grep 4s

On vérifie que le serveur fonctionne avec le lien : http://localhost:8081/status

sudo service 4s-httpd stop

On vérifie que le serveur s'est arrêté avec le même lien, qui doit afficher "serveur inconnu" ou "incapable de se connecter".

On déclare le service 4s-httpd au système et on le lance pour la dernière fois manuellement.

sudo update-rc.d 4s-httpd defaults
sudo service 4s-httpd start

Exemple de code pour un système Archlinux:

#! /bin/bash
. /etc/rc.conf
. /etc/rc.d/functions


DAEMON_BACKEND="/usr/bin/4s-backend"
DAEMON_HTTPD="/usr/bin/4s-httpd"
DAEMON_KB="DefaultKB" #argument à utiliser par le programme
DAEMON_PORT="8081"
DAEMONUSER="root" #utilisateur du programme
DAEMON_NAME_BACKEND="4s-backend"
DAEMON_NAME_HTTPD="4s-httpd"
DAEMON_NAME="4s-httpd"

PATH="/sbin:/bin:/usr/sbin:/usr/bin" #Ne pas toucher



test -x $DAEMON || exit 0


d_start () {
        stat_busy "Starting system $DAEMON_NAME Daemon"
        $DAEMON_BACKEND $DAEMON_KB
        $DAEMON_HTTPD -p $DAEMON_PORT $DAEMON_KB
        add_daemon $DAEMON_NAME_BACKEND
        add_daemon $DAEMON_NAME_HTTPD
        stat_done
}

d_stop () {
        stat_busy "Stopping system $DAEMON_NAME Daemon"
        killall $DAEMON_HTTPD
        killall $DAEMON_BACKEND
        rm_daemon $DAEMON_NAME_BACKEND
        rm_daemon $DAEMON_NAME_HTTPD
        stat_done
}

case "$1" in

        start)
                d_start
                ;;
        stop|force-stop)
                d_stop
                ;;
        restart|reload|force-reload)
                d_stop
                d_start
                ;;
        status)
                ck_status "$DAEMON_NAME_BACKEND" #"$DAEMON_BACKEND" "system-wide $DAEMON_NAME_BACKEND" && exit 0 || exit $?
                ck_status "$DAEMON_NAME_HTTPD" #"$DAEMON_HTTPD" "system-wide $DAEMON_NAME_HTTPD" && exit 0 || exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|force-stop|restart|reload|force-reload|status}"
                exit 1
                ;;
esac
exit 0

On autorise l'exécution de ce script :

sudo chmod 0755 /etc/init.d/4s-httpd

On teste le service :

sudo service 4s-httpd start

On vérifie que les processus 4s-httpd et 4s-backend ont démarré (il peut y avoir plusieurs processus 4s-httpd ou backend) avec la commande suivante :

ps -AL | grep 4s

On vérifie que le serveur fonctionne avec le lien : http://localhost:8081/status

sudo service 4s-httpd stop

On vérifie que le serveur s'est arrêté avec le même lien, qui doit afficher "serveur inconnu" ou "incapable de se connecter".

On déclare le service 4s-httpd au système et on le lance pour la dernière fois manuellement.

sudo /sbin/chkconfig 4s-httpd on
sudo service 4s-httpd start

Désinstallation

[modifier | modifier le wikicode]

Pour désinstaller ce service voici la commande :

sudo update-rc.d -f 4s-httpd

Mode d’emploi

[modifier | modifier le wikicode]

Vous pouvez stopper et redémarrer le service manuellement quand vous le souhaitez. Vous pouvez également suivre les logs et ainsi débugger vos requêtes SPARQL.

Démarrer le service

[modifier | modifier le wikicode]
sudo service 4s-httpd start

Arrêter le service

[modifier | modifier le wikicode]
sudo service 4s-httpd stop

Redémarrer le service

[modifier | modifier le wikicode]
sudo service 4s-httpd restart

Voir les logs du service

[modifier | modifier le wikicode]

Cette commande va vous permettre de suivre en temps réel les logs de votre service et ainsi voir les requêtes SPARQL.

sudo tail -f /var/log/4store/query-DefaultKB.log

Tests du service avec PHP

[modifier | modifier le wikicode]

Nous allons tester le serveur avec un programme PHP. On commence par installer la librairie PHP pour 4Store.

Pour installer la dernière version de PHP4store :

sudo apt-get install curl php5-curl
sudo pear channel-discover bordercloud.github.com/pear
sudo pear install bordercloud/php4store

On va créer un petit programme PHP pour tester notre serveur.

On va créer un projet test4store et ouvrir un nouveau fichier query.php :

cd ~/projets
mkdir test4store
cd test4store
vim query.php

On copie dans le fichier query.php le code suivant :

<?php

require_once('php4store/Endpoint.php');

$graph = "http://www.bordercloud.com";
$endpoint ="http://localhost:8081/sparql/";

// WRITE ******************************************

//put argument false to write
$readonly = false;
$sp_write = new Endpoint('http://localhost:8081/',$readonly);

echo "\nInsert :";
$q = " 
                        PREFIX a: <http://example.com/test/a/>
                        PREFIX b: <http://example.com/test/b/> 
                        INSERT DATA {  
                                GRAPH <".$graph."> {    
                                a:A b:Name \"Test1\" .   
                                a:A b:Name \"Test2\" .   
                                a:A b:Name \"Test3\" .  
}}";

$res = $sp_write->query($q,'raw');

//Search errors
$err = $sp_write->getErrors();
if ($err) {
            print_r($err);
            throw new Exception(print_r($err,true));
}

//print result
var_dump($res);

// DELETE ******************************************

echo "\nDelete :";
$q = " 
                        PREFIX a: <http://example.com/test/a/>
                        PREFIX b: <http://example.com/test/b/> 
                        DELETE DATA {  
                                GRAPH <".$graph."> {     
                                a:A b:Name \"Test2\" . 
}}";

$res = $sp_write->query($q,'raw');
$err = $sp_write->getErrors();
if ($err) {
            print_r($err);
            throw new Exception(print_r($err,true));
}
var_dump($res);

// READ ONLY ******************************************

//put argument false to write
$readonly = true;
$sp_readonly = new Endpoint('http://localhost:8081/',$readonly);

echo "\nPrint :";

$q = "select * where { GRAPH <".$graph."> {?x ?y ?z.}} ";

$rows = $sp_readonly->query($q, 'rows');

$err = $sp_readonly->getErrors();
if ($err) {
            print_r($err);
            throw new Exception(print_r($err,true));
}
var_dump($rows);

echo "\nASK :";
$q = "PREFIX a: <http://example.com/test/a/>
                        PREFIX b: <http://example.com/test/b/> 
                        ask where { GRAPH <".$graph."> {a:A b:Name \"Test3\" .}} ";

$res = $sp_readonly->query($q, 'raw');

$err = $sp_readonly->getErrors();
if ($err) {
            print_r($err);
            throw new Exception(print_r($err,true));
}
var_dump($res);

Ce code est un des exemples de la documentation de PHP4Store.

On exécute notre exemple :

php query.php

Si tout fonctionne, la dernière ligne devrait ressembler à ceci :

ASK :bool(true)

Vous pouvez également voir les logs du serveur et ainsi voir toutes les requêtes SPARQL envoyées par votre programme PHP :

sudo tail -f /var/log/4store/query-DefaultKB.log -n100

Maintenant, tout est en place pour apprendre à utiliser SPARQL !

Ce TP a été conçu avec les documents suivants :