Aller au contenu

« SPARQL Protocol and RDF Query Language/Travail pratique/Faire un serveur SPARQL » : différence entre les versions

Une page de Wikiversité, la communauté pédagogique libre.
Contenu supprimé Contenu ajouté
m Annulation des modifications 458019 de JackBot (discussion)
Ligne 17 : Ligne 17 :
Il existe de nombreux triplestores.
Il existe de nombreux triplestores.


L'un d'eux se nomme [http://4store.org/about 4Store].
Pour les Unix-like, l'un d'eux se nomme [http://4store.org/about 4Store], pour Windows il existe aussi [http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSDownload#Pre-built%20binaries%20for%20Windows Virtuoso].
Ce logiciel est sous [[w:Licence publique générale GNU|Licence publique générale GNU version 3]]
Ce logiciel est sous [[w:Licence publique générale GNU|Licence publique générale GNU version 3]]



Version du 2 février 2015 à 00:24

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 ?

Il existe de nombreux triplestores.

Pour les Unix-like, l'un d'eux se nomme 4Store, pour Windows il existe aussi Virtuoso.

Ce logiciel 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

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.

Installation

Automatique

Fedora 17 x86_64

  • 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
  • Et vous pouvez lancer au démarrage du serveur le service avec la commande :
chkconfig --level 345 4store on

CentOs 6 x86_64

  • 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
  • Et vous pouvez lancer au démarrage du serveur le service avec la commande :
chkconfig --level 345 4store on

Ubuntu

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

Dépendances

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

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

Création du répertoire destiné à contenir les librairies à installer :

mkdir ~/projets
cd ~/projets
mkdir redland
cd redland

Définir le répertoire de configuration des packages. Il y a deux possibilités :

  • Si votre système est sous 32 bits :
export PKG_CONFIG_PATH=/usr/lib/pkgconfig
  • sinon, sous 64 bits :
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig

Téléchargement et génération du fichier de configuration de la compilation :

wget http://download.librdf.org/source/raptor2-2.0.4.tar.gz
tar xvzf raptor2-2.0.4.tar.gz
cd raptor2-2.0.4
./autogen.sh

Il y a deux possibilités :

  • Si votre système est sous 32 bits :
./configure --libdir=/usr/lib
  • sinon, sous 64 bits :
./configure --libdir=/usr/lib64

Compilation :

make
#make check

Installation avec le compte root :

Ubuntu

sudo make install

Fedora

su -
make install


Téléchargement :

cd ..
wget http://download.librdf.org/source/rasqal-0.9.26.tar.gz
tar xvzf rasqal-0.9.26.tar.gz
cd rasqal-0.9.26

Génération du fichier de configuration de la compilation :

./autogen.sh

Il y a deux possibilités :

  • Si votre système est sous 32 bits
./configure '--enable-query-languages=sparql rdql laqrs' --libdir=/usr/lib
  • sinon sous 64 bits
./configure '--enable-query-languages=sparql rdql laqrs' --libdir=/usr/lib64

Compilation :

make
#make check

Installation avec le compte root :

Ubuntu

sudo make install

Fedora

su -
make install


Configuration réseau

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

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

Créer une base de données

sudo 4s-backend-setup test

Démarrer le serveur SPARQL

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

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

Vous devez voir la page status du serveur 4Store.

Arrêter le serveur SPARQL

sudo killall 4s-httpd
sudo killall 4s-backend

Supprimer une base de données

sudo killall 4s-httpd
sudo killall 4s-backend
sudo 4s-backend-destroy test

Service automatique

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

Installation (niveau expert)

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".

Debian/Ubuntu

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

RHEL/CentOS

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

Pour désinstaller ce service voici la commande :

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

Mode d'emploi

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

sudo service 4s-httpd start

Arrêter le service

sudo service 4s-httpd stop

Redémarrer le service

sudo service 4s-httpd restart

Voir les logs du service

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

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

Installation

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

Tests

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 !

Références

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