SPARQL Protocol and RDF Query Language/Travail pratique/PHP avec SPARQL
Introduction
modifierDans 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
modifierVariable globale
modifierOn 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
modifierQuant 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
modifierVous 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
modifierLa 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À 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 » (Archive • Wikiwix • Que 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'] ;
}
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
modifierVous 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));}
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 :
sudo pear channel-discover bordercloud.github.com/pear
sudo pear install bordercloud/bordercloud
- l'URL de la base de données : « http://lod.bordercloud.com/ » (Archive • Wikiwix • Que faire ?). 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 :
new Endpoint($MyEndPointSparql,$MyCode,$MyGraph,$modeDebug);
Partager l’objet de connexion
modifierNous 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));
}
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 :
sudo pear channel-discover bordercloud.github.com/pear
sudo pear install bordercloud/bordercloud
- l'url de la base de données : « http://lod.bordercloud.com/ » (Archive • Wikiwix • Que faire ?). 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 :
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
modifierVous 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
modifierAvec 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'] ;
}
Exercices
modifierConvertir votre application SQL en SPARQL
modifierEn 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 :
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.
}}
Voici un exemple de solution :
Dans le fichier functions.php :
<?php
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 );
}
function createArrayExperiences($arrayExperiences){
//Crée le tableau où chaque ligne sera une expérience
$nbExperience = count($arrayExperiences['poste']);
$newArray = array();
for($i = 0; $i < $nbExperience; $i++){
$newExperience = array();
foreach($arrayExperiences as $index=>$subarray){
if ($index!='valider'){
$newExperience[$index] = $subarray[$i];
}
}
$newArray[] = $newExperience;
}
return $newArray;
}
function afficheExperiences($arrayExperiences){
//Affiche les expériences
foreach ($arrayExperiences as $experience){
afficheExperience($experience);
}
}
function afficheExperience($arrayExperience){
//print_r($arrayExperience);
if ($arrayExperience['poste_actuel'] == 'on'){
echo '<b>Depuis le '.$arrayExperience['date_debut'].'</b>';
}else{
echo '<b>Du '.$arrayExperience['date_debut'].' au '.$arrayExperience['date_fin'].'</b>';
}
echo ' : ';
echo '<b>'.$arrayExperience['poste'].' ('.$arrayExperience['societe'].')</b><br />';
echo '<b>'.nl2br($arrayExperience['description']).'</b><br />';
echo 'Mots clés : <b>'. implode(', ',explode(' ',$arrayExperience['mots_cles'])) .'</b><br />';
}
Dans le fichier monCV.php :
<html>
<head><title>Mon CV</title></head>
<body>
<?php
include('functions.php');
//Initialisation des variables
if(isset($_POST['valider'])){
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$adresse = $_POST['adresse'];
$code_postal = $_POST['code_postal'];
$ville = $_POST['ville'];
$telephone = $_POST['telephone'];
$arrayExperiences = array();
$arrayExperiences['date_debut'] = $_POST['date_debut'];
$arrayExperiences['date_fin'] = $_POST['date_fin'];
$arrayExperiences['poste'] = $_POST['poste'];
$arrayExperiences['societe'] = $_POST['societe'];
$arrayExperiences['description'] = $_POST['description'];
$arrayExperiences['mots_cles'] = $_POST['mots_cles'];
$arrayExperiences['poste_actuel'] = $_POST['poste_actuel'];
// On crée le tableau d'expériences
$experiences = createArrayExperiences($arrayExperiences);
//On se connecte
$MyEndPointSparql = connectMaBase();
//En théorie, c’est le lien vers le CV sous un format lissible pour l'homme (une page web par exemple)
$noeudRacine = 'http://LinkedCV.com/CV/'.$prenom.'.'.$nom;
//on récupère la variable globale du graphe
//où insérer les triplets
global $MyGraph;
//on fabrique la requête
$sparql =
' 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 <'.$MyGraph.'> {
<'.$noeudRacine.'> rdf:type cv:CV ;
cv:nom "'.$nom.'" ;
cv:prenom "'.$prenom.'";
cv:adresse "'.$adresse.'";
cv:code_postal "'.$code_postal.'"^^xsd:integer;
cv:ville "'.$ville.'";
cv:telephone "'.$telephone.'".';
$sparql .=' }}';
//On vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$res = $MyEndPointSparql->queryUpdate($sparql );
$err = $MyEndPointSparql->getErrors();
if ($err) {
die (print_r($err,true));
}
foreach ($experiences as $experience){
//On prépare les nœuds de références
$noeudExperience = $noeudRacine.'/experience'.$experience['date_debut'];
//on calcule : si poste_actuel envoie on alors mettre "exp:posteActuel" sinon "exp:posteAncien"
$posteactuel = $experience['poste_actuel'] == 'on' ? "exp:posteActuel" : "exp:posteAncien" ;
//on fabrique la requête
$sparql ='
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 <'.$MyGraph.'> {
<'.$noeudRacine.'> cv:experience <'.$noeudExperience.'>.
<'.$noeudExperience.'> rdf:type exp:Experience ;
exp:date_debut "'.$experience['date_debut'].'"^^xsd:date;
exp:date_fin "'.$experience['date_fin'].'"^^xsd:date;
exp:poste "'.$experience['poste'].'";
exp:societe "'.$experience['societe'].'";
exp:description "'.$experience['description'].'";
exp:mots_cles "'.$experience['mots_cles'].'";
exp:poste_actuel '.$posteactuel.'. ';
$sparql .=' }}';
//On vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$res = $MyEndPointSparql->queryUpdate($sparql );
$err = $MyEndPointSparql->getErrors();
if ($err) {
die (print_r($err,true));
}
}
}
//affichage
?>
<b><?php echo $nom.' '.$prenom; ?></b><br />
<b><?php echo $adresse; ?></b><br />
<b><?php echo $code_postal.' '.$ville; ?></b><br />
Tel : <b><?php echo $telephone; ?></b><br>
Expériences : <br />
<hr/>
<?php
//print_r($arrayExperiences);
afficheExperiences($experiences);
?>
</body>
</html>
Dans le fichier index.php :
<html>
<head>
<title>Mon CV</title>
</head>
<body>
<a href="formMonCV.html">Créer un nouveau CV</a><br />
<h2>Chercher un CV :</h2>
<form method="post" action="index.php">
Rechercher dans
<select name="champ">
<?php
include('functions.php');
//On se connecte
$MyEndPointSparql = connectMaBase();
//on récupère la variable globale du graphe où insérer les triplets
global $MyGraph;
//on fabrique la requête
$sparql = '
PREFIX exp:<http://example.org/experience#>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select DISTINCT ?p where { GRAPH <'.$MyGraph.'> {
?o rdf:type exp:Experience .
?o ?p ?v . }}';
//on exécute la requête
$rows = $MyEndPointSparql->query($sparql, 'rows');
//Durant le développement on vérifie que le résultat est conforme à celui attendu
//print_r($sparql);
//print_r($rows);
//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));
}
//On scanne le résultat et on construit chaque option avec
foreach($rows as $row){
//on sélectionne uniquement la dernière partie de la propriété
$pos = strrpos($row['p'], "#");
if (! $pos === false) { // note : 3 signes "="
$property = substr($row['p'], $pos + 1);
echo '<option name="'.$property.'">'.$property.'</option>'; // on affiche chaque champ
}
}
?>
<!-- On ferme le select -->
</select>
<input type="text" name="critere"/>
<input type="submit" name="valider" value="Chercher"/>
<br />
</form>
<?php
//Initialisation des variables
if(isset($_POST['valider']) && $_POST['critere'] != ''){
$champ = $_POST['champ'];
$critere = $_POST['critere'];
//on fabrique la requête
$sparql = '
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 <'.$MyGraph.'> {
?unCV rdf:type cv:CV ;
cv:nom ?nom ;
cv:prenom ?prenom;
cv:experience ?uneExp .
?uneExp rdf:type exp:Experience ;
exp:'.$champ.' ?v .
FILTER regex(str(?v), "'.$critere.'")
}}';
//Durant le développement
//print_r($sparql);
$rows = $MyEndPointSparql->query($sparql, 'rows');
//Durant le développement, on vérifie que le résultat est conforme à celui attendu
//print_r($rows);
//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));
}
//On scanne le résultat et on construit la liste des candidats
echo 'Liste des candidats :<br />';
foreach($rows as $row){
echo '<a href="javascript:alert(\'Faire : Afficher un CV ! '.$row['unCV'].' \')">'.$row['nom'].' '.$row['prenom'].'</a><br />';
}
}
?>
</body>
</html>
Dans le fichier formMonCV.html :
<html>
<head><title>Mon CV</title></head>
<script type="text/javascript">
var nb_experience = 0;
function AjouteExperience() {
if(! document.getElementById && document.createElement) { return; }
var divExperiences = document.getElementById("experiences");
var nouvelleExperience = document.createElement("div");
nb_experience++;
nouvelleExperience.innerHTML = '<b>Expérience ' + nb_experience + ' : </b><br /> \
Date de début (aaaa-mm-jj) : <input type="text" name="date_debut[]"/> <br />\
Toujours en poste : <input type ="checkbox" name="poste_actuel[' + (nb_experience - 1) + ']" >ou \
Date de fin (aaaa-mm-jj) : <input type="text" name="date_fin[]"/> <br />\
Poste : <input type="text" name="poste[]"/> <br />\
Employeur : <input type="text" name="societe[]"/> <br />\
Description : <br /><textarea name="description[]" cols="50" rows="5"></textarea> <br /> \
Mots-clés : <input type="text" name="mots_cles[]"/> <br />';
divExperiences.appendChild(nouvelleExperience);
} // function AjouteExperience()
</script>
<body>
<form name="inscription" method="post" action="monCV.php">
Entrez votre : <br />
Nom : <input type="text" name="nom"/> <br />
Prénom : <input type="text" name="prenom"/> <br />
Adresse : <input type="text" name="adresse"/> <br />
Code postal : <input type="text" name="code_postal"/> <br />
Ville : <input type="text" name="ville"/> <br />
Téléphone: <input type="text" name="telephone"/> <br />
Expériences professionnelles : <br />
<div id="experiences"></div>
<input type="button" value="Ajouter une expérience" onClick="AjouteExperience();" />
<input type="submit" name="valider" value="OK"/>
</form>
</body>
</html>
SPARQL vs MySQL
modifierQuestions : 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
modifierVous 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>
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}}
Voici le nouveau fichier index.php avec le lien vers la page supprimeCV
<html>
<head>
<title>Mon CV</title>
</head>
<body>
<a href="formMonCV.html">Créer un nouveau CV</a><br />
<h2>Chercher un CV :</h2>
<form method="post" action="index.php">
Rechercher dans
<select name="champ">
<?php
include('functions.php');
//On se connecte
$MyEndPointSparql = connectMaBase();
//on récupère la variable globale du graphe où insérer les triplets
global $MyGraph;
//on fabrique la requête
$sparql = '
PREFIX exp:<http://example.org/experience#>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select DISTINCT ?p where { GRAPH <'.$MyGraph.'> {
?o rdf:type exp:Experience .
?o ?p ?v . }}';
//on exécute la requête
$rows = $MyEndPointSparql->query($sparql, 'rows');
//Durant le développement on vérifie que le résultat est conforme à celui attendu
//print_r($sparql);
//print_r($rows);
//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));
}
//On scanne le résultat et on construit chaque option avec
foreach($rows as $row){
//on sélectionne uniquement la dernière partie de la propriété
$pos = strrpos($row['p'], "#");
if (! $pos === false) { // note : 3 signes "="
$property = substr($row['p'], $pos + 1);
echo '<option name="'.$property.'">'.$property.'</option>'; // on affiche chaque champ
}
}
?>
<!-- On ferme le select -->
</select>
<input type="text" name="critere"/>
<input type="submit" name="valider" value="Chercher"/>
<br />
</form>
<?php
//Initialisation des variables
if(isset($_POST['valider']) && $_POST['critere'] != ''){
$champ = $_POST['champ'];
$critere = $_POST['critere'];
//on fabrique la requête
$sparql = '
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 <'.$MyGraph.'> {
?unCV rdf:type cv:CV ;
cv:nom ?nom ;
cv:prenom ?prenom;
cv:experience ?uneExp .
?uneExp rdf:type exp:Experience ;
exp:'.$champ.' ?v .
FILTER regex(str(?v), "'.$critere.'")
}}';
//Durant le développement
//print_r($sparql);
$rows = $MyEndPointSparql->query($sparql, 'rows');
//Durant le développement on vérifie que le résultat est conforme à celui attendu
//print_r($rows);
//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));
}
//On scanne le résultat et on construit la liste des candidats
echo 'Liste des candidats :<br />';
foreach($rows as $row){
echo '<a href="javascript:alert(\'Faire : Afficher un CV ! '.$row['unCV'].' \')">'.$row['nom'].' '.$row['prenom'].'</a> ';
echo '[<a href="supprimeCV.php?uriCV='.$row['unCV'].'">SUPPRIMER</a>]<br />';
}
}
?>
</body>
</html>
Voici le fichier supprimeCV.php
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title>Supprime CV</title></head>
<body>
Supprimer un CV : <br />
<?php
include('functions.php');
//Initialisation des variables
if(isset($_GET['uriCV'])){
//On se connecte
$MyEndPointSparql = connectMaBase();
//En théorie, c’est le lien vers le CV sous un format lisible pour l'homme (une page web par exemple)
$noeudRacine = $_GET['uriCV'];
//on récupère la variable globale du graphe où insérer les triplets
global $MyGraph;
//on fabrique la requête
$sparql = '
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 ?uneExp where { GRAPH <'.$MyGraph.'> { <'.$noeudRacine.'> cv:experience ?uneExp . }}';
//Durant le développement
//print_r($sparql);
$rows = $MyEndPointSparql->query($sparql, 'rows');
//Durant le développement, on vérifie que le résultat est conforme à celui attendu
//print_r($rows);
//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));
}
//On scanne le résultat et on construit la liste des candidats
foreach($rows as $row){
//on fabrique la requête
$sparql = ' DELETE DATA { GRAPH <'.$MyGraph.'> { <'.$row['uneExp'].'> ?p ?v }}';
//On vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$res = $MyEndPointSparql->queryUpdate($sparql );
$err = $MyEndPointSparql->getErrors();
if ($err) {
die (print_r($err,true));
}
}
//on fabrique la requête
$sparql = ' DELETE DATA { GRAPH <'.$MyGraph.'> { <'.$noeudRacine.'> ?p ?v }}';
//On vérifie qu’il n'y a pas d'erreur sinon on stoppe le programme et on affiche les erreurs
$res = $MyEndPointSparql->queryUpdate($sparql );
$err = $MyEndPointSparql->getErrors();
if ($err) {
die (print_r($err,true));
}
//si on arrive ici, cela signifie que le CV a été supprimé
echo '<b>CV supprimé</b><br />';
}
?>
</body>
</html>
Références
modifierDocumentation de l'API :