Aller au contenu

SPARQL Protocol and RDF Query Language/Travail pratique/PHP avec SPARQL

Leçons de niveau 15
Une page de Wikiversité, la communauté pédagogique libre.
Après ce TP, vous saurez :
  • utiliser des variables globales dans PHP
  • utiliser des classes dans PHP
  • installer des bibliothèques PHP externes
  • utiliser des bibliothèques PHP SPARQL pour 4Store
  • modifier des données
  • afficher des données
  • rechercher des données
Durée : 1,5 heure
Matériel :
  • un serveur Web Linux avec PHP.
Début de la boite de navigation du travail pratique
PHP avec SPARQL
Image logo représentative de la faculté
T.P. no 13
Leçon : SPARQL Protocol and RDF Query Language

TP de niveau 15.

Précédent :PHP avec MySQL
Suivant :Requêtes de découverte
En raison de limitations techniques, la typographie souhaitable du titre, « Travail pratique : PHP avec SPARQL
SPARQL Protocol and RDF Query Language/Travail pratique/PHP avec SPARQL
 », n'a pu être restituée correctement ci-dessus.


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

[modifier | modifier le wikicode]

Variable globale

[modifier | modifier le wikicode]

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.'....
		...}

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 bibliothèque

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

[modifier | modifier le wikicode]

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 bibliothèque SPARQL : PHP4Store.

Installation de la bibliothèque PHP pour 4Store

[modifier | modifier le wikicode]

La bibliothèque 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

[modifier | modifier le wikicode]

À 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 arrête 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'] ;
}


Enregistrer des données

[modifier | modifier le wikicode]

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 arrête le programme et on affiche les erreurs
$err = $MyEndPointSparql->getErrors();
if ($err) { die (print_r($err,true));}


Partager l’objet de connexion

[modifier | modifier le wikicode]

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 arrête le programme et on affiche les erreurs
$res = $endpoint->queryUpdate($sparql );
//On vérifie qu’il n'y a pas d'erreur sinon on arrête le programme et on affiche les erreurs
$err = $endpoint->getErrors();
if ($err) {
		 die (print_r($err,true));
}


Supprimer des données

[modifier | modifier le wikicode]

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 arrête le programme et on affiche les erreurs
$res = $endpoint->queryUpdate($sparql );
//on vérifie qu’il n'y a pas d'erreur sinon on arrête le programme et on affiche les erreurs
$err = $endpoint->getErrors();
if ($err) {
		 die (print_r($err,true));
}

Affichage avec l’objet de connexion

[modifier | modifier le wikicode]

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 arrête 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'] ;
}

Convertir votre application SQL en SPARQL

[modifier | modifier le wikicode]

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.


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

[modifier | modifier le wikicode]

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

Supprimer des CVs

[modifier | modifier le wikicode]

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>


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}}

Documentation de l'API :