< SPARQL Protocol and RDF Query Language < Travail pratique

Introduction

Dans ce TP, nous allons enregistrer nos CV dans l’entrepôt 4Store que nous avons créé dans le TP Faire un serveur SPARQL.

Ce TP a pour objectif de comprendre comment un silo est utilisé par un langage comme PHP pour pouvoir créer des données et les enregistrer.

On supposera que vous connaissez la syntaxe SPARQL pour lire et écrire dans une base de données.

À savoir avant de commencer

Variable globale

On peut définir des variables et les appeler partout dans le code.

Elles doivent être :

  • définies au moment de l’exécution d’une page ou dans un fichier appelé avec la fonction include() (ou require ou require_once).
  • dans une fonction. Vous devez insérer la variable globale dans le contexte d’exécution avec le mot clé global comme ci-dessous.


Pour les appeler dans une fonction, il faut utiliser cette syntaxe :

		$myGraph = 'http://example.org';
		...
		...{
		global $myGraph;
		...'.$myGraph.'....
		...}

Classe

Quant il y a de nombreuses fonctions et de nombreuses variables globales, le code :

  • devient rapidement illisible
  • est très difficile à débugger
  • ralentit les performances du système


On a donc créé des classes :

  • qui possèdent leurs fonctions et leurs variables
  • qui se rapportent à un rôle, par exemple :
    • une classe Banque donnerait comme fonction : Combien d’argent reste-t-il sur votre compte ?
    • une classe EndPointSparql serait la métaphore d’un serveur distant qui offrirait un certain nombre d’informations pour répondre aux questions : Es-tu en marche ? Combien de place reste-t-il dans mon espace SPARQL ? Etc.

Pour appeler une fonction d’une classe PHP, il faut : 1 Inclure le fichier qui contient la classe ou qui va appeler le chargement de la librairie

include(‘myClasse.php');

2 Instancier l’objet (le mettre en mémoire) avec la commande new

$myclasse = new myClasse($argument,$argument2);

3 Utiliser le symbole -> après la variable qui contient l’objet, suivi du nom de la fonction

$myclasse->ouvrirLeGarage();

SPARQL avec PHP

Vous avez maintenant tous les éléments pour apprendre à convertir les programmes PHP/MySQL en applications utilisant SPARQL.

Nous allons maintenant étudier l’utilisation d'une librairie SPARQL : PHP4Store.

Installation de la librarie PHP pour 4Store

La librairie PHP peut être installée avec les commandes :

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

Il vous suffit de lire la suite pour apprendre à l’utiliser.

Lecture des données de n’importe quelle base de données SPARQL en ligne

À la différence d'une base de données SQL, vous n'avez besoin que d’une adresse URL sur le réseau pour atteindre des données via SPARQL.


Vous pouvez voir des exemples de requêtes SPARQL sur le site : http://en.sparql.pro

Chaque exemple de requêtes, comme sur la page "« http://en.sparql.pro/wiki/Picture_gallery » (ArchiveWikiwixQue faire ?). Consulté le 2014-11-15" indique :

  • l'adresse URL de l'Endpoint SPARQL (point d'accès SPARQL, par exemple : http://dbpedia.org/)
  • la requête SPARQL
  • le résultat

Par exemple, avec l'url http://dbpedia.org/, vous pouvez utiliser ce code :

//on cherche la classe
include("php4store/Endpoint.php");
//on instancie l’objet
$myEndpoint = new Endpoint('http://dbpedia.org/');
//on fabrique la requête SPARQL
$sparql = 'select ?object ?property ?value where {?object ?property ?value } limit 5';
//On utilise la fonction pour faire une requête en lecture
$rows = $myEndpoint->query($sparql, 'rows'); 
//On vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$err = $myEndpoint->getErrors();
if ($err) { die (print_r($err,true));}				
//On scanne le résultat 
foreach($rows as $row){	
	echo $row['object'] .' '. $row['property'] .' '. $row['value'] ;
}
Lecture de données avec accès sécurisé

Le contrôle des données d'une base de données SPARQL n’est pas encore défini par le W3C. Ainsi, les hébergeurs de données comme http://BorderCloud.com ou les fabricants de logiciels comme Virtuoso implémentent leurs propres solutions.

Enregistrer des données

Vous n'avez besoin que d’une adresse sur le réseau pour enregistrer des données dans votre silo SPARQL 4Store.

Vous devriez par exemple utiliser ce type de code avec l'adresse : http://localhost:8081/

//on cherche la classe
include("php4store/Endpoint.php");
//on instancie l’objet
$myEndpoint = new Endpoint('http://localhost:8081/');
//on fabrique la requête SPARQL d’insertion
$sparql = 'INSERT DATA { GRAPH <'.$MyGraph.'> {
 ...METTRE ICI VOS TRIPLETS... 
}}';
//On utilise la fonction pour faire une requête en lecture
$MyEndPointSparql->queryUpdate($sparql); 
//On vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$err = $MyEndPointSparql->getErrors();
if ($err) { die (print_r($err,true));}
Enregistrement de données avec accès sécurisé

Dans un service sécurisé, par exemple dans le service http://BorderCloud.com, il faut utiliser :

  • la librairie PHP du service, que vous pouvez installer avec la commande :
sudo pear channel-discover bordercloud.github.com/pear
sudo pear install bordercloud/bordercloud

L'initialisation de la classe Endpoint de votre base de données sera alors :

 new Endpoint($MyEndPointSparql,$MyCode,$MyGraph,$modeDebug);

Partager l’objet de connexion

Nous allons créer une fonction pour initialiser la classe Endpoint de la même manière, quelle que soit la source des données.

Dans le fichier functions.php, on peut écrire cette fonction et les variables globales :

include("php4store/Endpoint.php");

	//Config debug
	$modeDebug = false;	

	//Put here the URL of your endpoint
	$MyEndPointSparql = 'http://localhost:8081/';	

	//Put the name of your graph
	$MyGraph = 'http://FIRSTNAME.me/test'; //example

	//Read only (or false for read&write)
	$ReadOnly = false;

function connectMaBase(){	
	global $MyEndPointSparql,$MyGraph,$modeDebug,$ReadOnly;	
	return new Endpoint($MyEndPointSparql,$ReadOnly,$modeDebug );
}

Ainsi, on utilisera cette fonction de cette manière :

//on cherche les fonctions
include('functions.php');

//on se connecte
$endpoint = connectMaBase();	
//on récupère la variable globale du graphe où insérer les triplets
global $MyGraph;		
//on fabrique la requête
$sparql = 'INSERT DATA { GRAPH <'.$MyGraph.'> {
 ...METTRE ICI VOS TRIPLETS... 
}}'; 	
//On vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$res = $endpoint->queryUpdate($sparql );
//On vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$err = $endpoint->getErrors();
if ($err) {
		 die (print_r($err,true));
}
Enregistrement de données avec accès sécurisé

Dans un service sécurisé par exemple dans le service http://BorderCloud.com, il faut :

  • utiliser la librairie propre à ce service. À installer via les commandes :
sudo pear channel-discover bordercloud.github.com/pear
sudo pear install bordercloud/bordercloud

Et le seul code à changer sera celui du fichier functions.php :

include("bordercloud/Endpoint.php");
	//Config debug
	$modeDebug = false;	

	//Put here the URL of your endpoint
	$MyEndPointSparql = "http://lod.bordercloud.com/";	

	//Put the name of your graph
	$MyGraph = "http://FIRSTNAME.me/test"; //example

	//Put your code Bordercloud 
	$MyCode = "00000000010";

function connectMaBase(){
	global $MyEndPointSparql,$MyCode,$MyGraph,$modeDebug;	
	return new Endpoint($MyEndPointSparql,$MyCode,$MyGraph,$modeDebug);
}

Pour plus d'infos : documentation du service BorderCloud

Supprimer des données

Vous utiliserez le même code que pour insérer des données, sauf que la requête sera différente :

//on cherche les fonctions
include('functions.php');

//on se connecte
$endpoint = connectMaBase();	
//on récupère la variable globale du graphe où insérer les triplets
global $MyGraph;		
//on fabrique la requête
$sparql = 'DELETE DATA { GRAPH <'.$MyGraph.'> {
 ...METTRE ICI VOS TRIPLETS... 
}}'; 	
//on vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$res = $endpoint->queryUpdate($sparql );
//on vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$err = $endpoint->getErrors();
if ($err) {
		 die (print_r($err,true));
}

Affichage avec l’objet de connexion

Avec votre objet de connexion préconfiguré, vous utiliserez ce code dans votre page PHP :

//on cherche les fonctions
include('functions.php');

//on se connecte
$endpoint = connectMaBase();

//on récupère la variable globale du graphe où insérer les triplets
global $MyGraph;	
//on fabrique la requête SPARQL de lecture
$sparql = ' select ?object ?property ?value where {?object ?property ?value } limit 5';
//on utilise la fonction pour faire une requête en lecture
$rows = $endpoint->query($sparql, 'rows'); 
//on vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$err = $endpoint->getErrors();
if ($err) { die (print_r($err,true));}				
//on scanne le résultat 
foreach($rows as $row){	
	echo $row['object'] .' '. $row['property'] .' '. $row['value'] ;
}

Exercices

Convertir votre application SQL en SPARQL

En utilisant les exemples de requêtes SPARQL ci-dessous, vous allez remplacer le code du projet Eclipse qui fait référence à une base de données SQL pour utiliser votre base de données SPARQL.

Remarque

Utiliser l'URI exp:posteAncien pour indiquer que c’est un ancien poste ou exp:posteActuel pour un poste actuel.

Exemple de requête SPARQL : pour lire les propriétés disponibles pour le type d'objet expérience :

PREFIX exp:<http://example.org/experience#> 
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select DISTINCT ?p where { GRAPH <http://fr.sparql.pro/wiki/> {
	 	 ?o rdf:type	 exp:Experience .	
			 ?o ?p ?v . 
}}

Exemple de requête SPARQL : Chercher un mot clé dans un CV

PREFIX cv:<http://example.org/CV#> 
PREFIX exp:<http://example.org/experience#> 
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?unCV ?nom ?prenom where { 
			GRAPH <http://fr.sparql.pro/wiki/> {
		?unCV 	rdf:type cv:CV ;
				cv:nom ?nom ;
				cv:prenom ?prenom;
				cv:experience ?uneExp .
		?uneExp rdf:type exp:Experience ;	
				exp:mots_cles ?v . 
		FILTER regex(str(?v), "sparql")
}}

Exemple de requête SPARQL : Ajouter un nouveau CV

PREFIX cv:<http://example.org/CV#> 
PREFIX exp:<http://example.org/experience#> 
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
INSERT DATA { GRAPH <http://fr.sparql.pro/wiki/> { 
	<http://LinkedCV.com/CV/Phillipe.Dubois> rdf:type cv:CV ;
			 cv:nom "Dubois" ;
			 cv:prenom "Phillipe";
			 cv:adresse "4 rue de Nostradamus";
			 cv:code_postal "99444"^^xsd:integer;
			 cv:ville "Icioulà";
			 cv:telephone "0123456789". 
}}

Exemple de requête SPARQL : Ajouter une expérience au CV

	 
PREFIX cv:<http://example.org/CV#> 
PREFIX exp:<http://example.org/experience#> 
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
INSERT DATA { GRAPH <http://fr.sparql.pro/wiki/> {
	<http://LinkedCV.com/CV/Phillipe.Dubois> cv:experience <http://LinkedCV.com/CV/Phillipe.Dubois/experience2010-01-01>.
	<http://LinkedCV.com/CV/Phillipe.Dubois/experience2010-01-01> rdf:type exp:Experience ;
	 exp:date_debut "2010-01-01"^^xsd:date;	
			 exp:date_fin "2010-06-06"^^xsd:date;	
			 exp:poste "Boulanger";
			 exp:societe "Au plaisir du croissant";
			 exp:description "Boulanger du matin au soir";
			 exp:mots_cles "croissant pain pâtisserie";
			 exp:poste_actuel exp:posteAncien. 
}}

SPARQL vs MySQL

Questions : que faut-il faire pour insérer une nouvelle information dans l’expérience des CVs pour SPARQL & MySQL ?

Supprimer des CVs

Vous allez utiliser la recherche du fichier index.php pour sélectionner les CVs que vous voulez supprimer.

Ajouter un lien vers la page supprimeCV.php quand la liste des candidats est générée sur la page Index.php. Le lien vers la page supprimeCV.php aura un paramètre GET "uriCV" comme ceci :

<a href="supprimeCV.php?uriCV=http://...Phillipe.Dubois">SUPPRIMER</a>
Remarque

Comme $_POST, la variable $_GET vous permettra de récupérer la variable GET uriCV dans la page supprimeCV.php

Vous utiliserez cette requête pour supprimer les triplets :

DELETE DATA { GRAPH <http://fr.sparql.pro/wiki/> { 
	<http://LinkedCV.com/CV/Phillipe.Dubois> ?p ?v}}

Références

Documentation de l'API :

Cet article est issu de Wikiversity. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.