SPARQL Protocol and RDF Query Language/Travail pratique/Faire un serveur SPARQL
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}}.
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 ?
modifierIl 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
modifierLes 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.
Installation
modifierAutomatique
modifierFedora 17 x86_64
modifier- 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- 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
Ubuntu
modifierIl 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
modifierDépendances
modifierOn 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
modifierLa 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
Un outil bien pratique est contenu dans le logiciel Raptor de Redland. C'est l'outil Rapper, qui permet de voir si un fichier contient des erreurs ou de convertir un fichier dans un autre format.
Afficher le nombre de triplets et les erreurs s’il y en a.
rapper -c myFile.RDF
Convertir le fichier "ontology.owl" en entrée (format automatiquement détecté) dans le format NTriples pour être enregistré dans le fichier "ontology.n3".
rapper ontology.owl -o ntriples > ontology.n3
Voir les formats possibles en entrée et en sortie.
rapper --help
Configuration réseau
modifierEn 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
modifier4Store 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
modifierCréer une base de données
modifiersudo 4s-backend-setup test
Démarrer le serveur SPARQL
modifierIci, 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
modifierAllez sur la page : http://localhost:8081/status
Vous devez voir la page statut du serveur 4Store.
Arrêter le serveur SPARQL
modifiersudo killall 4s-httpd
sudo killall 4s-backend
Supprimer une base de données
modifiersudo killall 4s-httpd
sudo killall 4s-backend
sudo 4s-backend-destroy test
Service automatique
modifier4Store 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
modifierInstallation (niveau expert)
modifierOn 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".
Debian/Ubuntu
modifierOn 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
RHEL/CentOS
modifierExemple 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
modifierPour désinstaller ce service voici la commande :
sudo update-rc.d -f 4s-httpd
Mode d’emploi
modifierVous 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
modifiersudo service 4s-httpd start
Arrêter le service
modifiersudo service 4s-httpd stop
Redémarrer le service
modifiersudo service 4s-httpd restart
Voir les logs du service
modifierCette 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
modifierNous allons tester le serveur avec un programme PHP. On commence par installer la librairie PHP pour 4Store.
Installation
modifierPour 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
Tests
modifierOn 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 !
Références
modifierCe TP a été conçu avec les documents suivants :