# SPARQL Protocol and RDF Query Language/Travail pratique/PHP avec SPARQL
## 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 :

### 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 bibliothèque
2 Instancier l’objet (le mettre en mémoire) avec la commande new
3 Utiliser le symbole → après la variable qui contient l’objet, suivi du nom de la fonction

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

### Installation de la bibliothèque PHP pour 4Store

La bibliothèque PHP peut être installée avec les commandes :
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 » . 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 :
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/
Dans un service sécurisé, par exemple dans le service http://BorderCloud.com, il faut utiliser :
* la bibliothèque PHP du service, que vous pouvez installer avec la commande :
* l'URL de la base de données : « http://lod.bordercloud.com/ » . Consulté le 2014-11-15
* le nom du graphe où vous voulez enregistrer des données
* le code d'accès pour écrire dans ce graphe
L'initialisation de la classe Endpoint de votre base de données sera alors :

### 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 :
Ainsi, on utilisera cette fonction de cette manière :
Dans un service sécurisé par exemple dans le service http://BorderCloud.com, il faut :
* utiliser la bibliothèque propre à ce service. À installer via les commandes :
* l'url de la base de données : « http://lod.bordercloud.com/ » . Consulté le 2014-11-15
* le nom du graphe où vous voulez enregistrer des données
* le code d'accès pour écrire dans ce graphe
Et le seul code à changer sera celui du fichier functions.php :
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 :

### Affichage avec l’objet de connexion

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

## 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.
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 :
Exemple de requête SPARQL : Chercher un mot clé dans un CV
Exemple de requête SPARQL : Ajouter un nouveau CV
Exemple de requête SPARQL : Ajouter une expérience au CV
Voici un exemple de solution :
Dans le fichier functions.php :
Dans le fichier monCV.php :
Dans le fichier index.php :
Dans le fichier formMonCV.html :

### SPARQL vs MySQL

Questions : que faut-il faire pour insérer une nouvelle information dans l’expérience des CVs pour SPARQL & MySQL ?
Pour SPARQL & MySQL, il faudra changer le formulaire.
Uniquement pour MySQL :
* Insérer une nouvelle colonne dans la table
* Insérer une valeur par défaut à cette colonne pour éviter les erreurs d'affichage durant l’affichage des anciens enregistrements qui n'auront pas cette information.
* Modifier toutes les requêtes pour insérer des données dans la table modifiée
* Modifier les requêtes de lecture pour lire cette nouvelle colonne
Uniquement pour SPARQL :
* Ajouter seulement une ligne dans les requêtes pour enregistrer ou lire cette nouvelle donnée.
Conclusion: SPARQL présente un coût non négligeable pour apprendre à l’utiliser, mais en cours de développement, il facilitera la maintenance des applications, surtout au sein de méthodes agiles.

### 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 :
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 :
Voici le nouveau fichier index.php avec le lien vers la page supprimeCV
Voici le fichier supprimeCV.php