Rapport de Web Sémantique

Par Macky Dieng et Baptiste Vannesson M1 DNR2I - Université de Caen Basse-Normandie

L'objectif du devoir était de concevoir un début d'application sémantique en partant de deux fichiers de données (CSV ou XML) institutionnelles. Nous avons ici choisi, d'une part, un fichier CSV ayant trait aux établissements d'enseignement supérieur et, d'autre part, un fichier CSV recensant les points poste.

Afin de mieux appréhender les données, il nous a semblé logique de procéder de la manière suivante :

  1. Analyse du premier fichier sur les établissements d'enseignement supérieur
  2. Modélisation de ce fichier à l'aide d'un graphe d'instance RDF (exemple utilisé : Université de Caen)
  3. Développement d'un script PHP pour la sérialisation globale du graphe induit (autrement dit de toutes les instances)
  4. Vérification de conformité du fichier de sortie (au format Turtle)
  5. Analyse du deuxième fichier sur les points poste
  6. Modélisation de ce fichier à l'aide d'un graphe d'instance RDF (exemple utilisé : bureau de poste « Caen Gambetta »)
  7. Développement d'un script PHP pour la sérialisation globale du graphe induit
  8. Vérification de conformité du fichier de sortie (au format Turtle)
  9. Comparaison des deux fichiers CSV et identification des points communs
  10. Fusion des deux schémas RDF à partir du blank node
  11. Fusion des scripts PHP pour la sérialisation du graphe final
  12. Vérification de conformité du fichier de sortie (au format Turtle)
  13. Intégration des triplets dans Sesame
  14. Requêtes SPARQL sur le triplestore ainsi obtenu
  15. Conception de ce rapport ☺

Naturellement, vous retrouverez cette logique en lisant la suite de ce compte-rendu. Des flèches seront utilisées pour matéraliser le cheminement de notre réflexion.

Quelques remarques subsidiaires :

  • L'URI de base utilisée pour l'ensemble de l'exercice est symboliquement « http://www.unicaen.fr# ». La plupart des ressources en dépendent.
  • Les fichiers RDF en sortie sont en UTF-8. Vérifiez bien que votre navigateur ne force pas l'encodage occidental pour que tout s'affiche correctement.
  • Notre dernier script PHP génère plus de 250 000 triplets. Donc si votre navigateur met un peu de temps avant d'afficher le résultat, c'est parfaitement normal.
  • Sesame n'acceptant pas 250 000 triplets d'un coup, nous avons décidé d'effectuer nos requêtes SPARQL sur environ 10 000 triplets (avec environ 5000 triplets concernant les établissements d'enseignement supérieur et environ 5000 triplets concernant les points poste).
  • Sesame n'acceptant pas non plus les caractères spéciaux générés par la fonction « urlencode » de PHP, nous avons géré le cas des caractères spéciaux manuellement en remplaçant chaque caractère bloquant par un underscore (d'où le tableau passé en argument à la fonction « str_replace »).
  • Les noms de communes du premier fichier ont sciemment été mis en majuscules pour que la liaison puisse se faire avec le deuxième fichier (où les noms de communes sont justement en majuscules). Sans cela, la casse aurait perturbé les inférences.
  • Dans nos graphes, vous remarquerez que le point central est le blank node qui correspond en fait à l'adresse. Ce blank node s'est avéré très utile pour fusionner nos fichiers CSV qui possédaient tous les deux la notion d'adresse.
  • Dans nos graphes, vous remarquerez aussi que les classes sont placées dans des cercles blancs, que les instances sont placées dans des disques noirs, et que les littéraux sont placés dans des rectangles. Les predicats sont quant à eux matérialisés par du texte associé à des flèches.
  • Pour certaines requêtes en fin de rapport, vous constaterez que nous avons adopté une approche incrémentale par laquelle nous avons progressivement ajouté des couches de complexité à quelque chose d'initialement simple. Cette démarche est sans doute un bon moyen de tester les limites d'un moteur d'inférence.
  • Vous pourrez enfin visualiser le résultat de nos requêtes de sélection via quelques screenshots. Les requêtes d'insertion et de suppression en sont dépourvues, pour des raisons évidentes...

Traitement d'un premier fichier : le cas des établissements d'enseignement supérieur

→ Télécharger le fichier CSV (input) ← Flèche vers le bas
Schéma RDF des établissements d'enseignement supérieur
Schéma RDF des établissements d'enseignement supérieur (Université de Caen)
Flèche vers le bas
                

<?php

// Encodage de l'output (UTF-8)
header('Content-Type: text/plain; charset=utf-8');

// Ouverture du fichier en lecture
$handle = fopen("enseignement.csv", "r");
if (!$handle) { echo "Problème d'ouverture du fichier."; }

// Initialisation du template
$template = "";

// Déclaration des préfixes d'URI
$template .= "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . \n";
$template .= "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . \n";
$template .= "@prefix unicaen: <http://www.unicaen.fr#> . \n";

// Création du premier triplet générique
$template .= "unicaen:Etablissement_enseignement rdf:type rdfs:Class . \n";

// Caractères spéciaux à ne pas mettre dans les triplets
$specialChars = array
                (
                    " ", 
                    "'", 
                    "\"", 
                    ",", 
                    ";", 
                    ".", 
                    ":", 
                    "?", 
                    "!", 
                    "&", 
                    "#", 
                    "\\", 
                    "/", 
                    "*", 
                    "(", 
                    ")", 
                    "[", 
                    "]", 
                    "{", 
                    "}", 
                    "~", 
                    "@", 
                    "€", 
                    "$"
                );

// Parcours du fichier
while (!feof($handle)) {
	$ligne = trim(fgets($handle));
	if ((strlen($ligne) > 0) && !(preg_match("#Code UAI#", $ligne))) {
		list
        (
            $codeUai, 
            $typeEtablissement, 
            $nom, 
            $sigle, 
            $statut, 
            $tutelle, 
            $universite, 
            $adresse, 
            $codePostal, 
            $commune, 
            $departement, 
            $academie, 
            $region, 
            $longitude, 
            $latitude, 
            $region
        ) = explode(";", $ligne);
        
        // Construction des triplets RDF (instances et littéraux)
        if (!empty($typeEtablissement)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $typeEtablissement)  . ' rdfs:subClassOf unicaen:Etablissement_enseignement .' . "\n";
        if (!empty($tutelle)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $tutelle)  . ' rdf:type unicaen:Tutelle .' . "\n";
        if (!empty($nom) && !empty($typeEtablissement)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' rdf:type unicaen:' . str_replace($specialChars, "_", $typeEtablissement) . ' .' . "\n";
        if (!empty($nom) && !empty($codeUai)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:possede _:Adresse' . $codeUai . ' .' . "\n";
        if (!empty($nom) && !empty($tutelle)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:depend unicaen:' . str_replace($specialChars, "_", $tutelle) . ' .' . "\n";
        if (!empty($nom) && !empty($academie)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:academie ' . '"' . $academie . '" .' . "\n";
        if (!empty($nom) && !empty($statut)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:statut ' . '"' . $statut . '" .' . "\n";
        if (!empty($nom) && !empty($codeUai)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:code ' . '"' . $codeUai . '" .' . "\n";
        if (!empty($nom)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:nom ' . '"' . $nom . '" .' . "\n";
        if (!empty($nom) && !empty($sigle)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:sigle ' . '"' . $sigle . '" .' . "\n";
        if (!empty($nom) && !empty($typeEtablissement)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:type ' . '"' . $typeEtablissement . '" .' . "\n";
        if (!empty($codeUai)) 
            $template .= '_:Adresse' . $codeUai . ' rdf:type unicaen:Coordonnees .' . "\n";
        if (!empty($codeUai) && !empty($adresse)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:intitule ' . '"' . $adresse . '" .' . "\n";
        if (!empty($codeUai) && !empty($codePostal)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:CP ' . '"' . $codePostal . '" .' . "\n";
        if (!empty($codeUai) && !empty($latitude)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:latitude ' . '"' . $latitude . '" .' . "\n";
        if (!empty($codeUai) && !empty($longitude)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:longitude ' . '"' . $longitude . '" .' . "\n";
        if (!empty($codeUai) && !empty($departement)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:departement ' . '"' . $departement . '" .' . "\n";
        if (!empty($codeUai) && !empty($region)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:region ' . '"' . $region . '" .' . "\n";
        if (!empty($codeUai) && !empty($commune)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:commune ' . '"' . strtoupper($commune) . '" .' . "\n";
    }
}

// Affichage du résultat
echo $template;

// Fermeture du fichier
$close = fclose($handle);
if (!$close) { echo "Problème de fermeture du fichier."; }
                
                
Flèche vers le bas → Télécharger le fichier RDF (output) ←

Traitement d'un deuxième fichier : le cas des points poste

→ Télécharger le fichier CSV (input) ← Flèche vers le bas
Schéma RDF des points poste
Schéma RDF des points poste (Caen Gambetta)
Flèche vers le bas
                

<?php

// Encodage de l'output (UTF-8)
header('Content-Type: text/plain; charset=utf-8');

// Ouverture du fichier en lecture
$handle = fopen("poste.csv", "r");
if (!$handle) { echo "Problème d'ouverture du fichier."; }

// Initialisation du template
$template = "";

// Déclaration des préfixes d'URI
$template .= "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . \n";
$template .= "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . \n";
$template .= "@prefix unicaen: <http://www.unicaen.fr#> . \n";

// Création du premier triplet générique
$template .= "unicaen:Point_poste rdf:type rdfs:Class . \n";

// Caractères spéciaux à ne pas mettre dans les triplets
$specialChars = array
                (
                    " ", 
                    "'",
                    "\"", 
                    ",",
                    ";", 
                    ".", 
                    ":", 
                    "?", 
                    "!", 
                    "&", 
                    "#", 
                    "\\", 
                    "/", 
                    "*", 
                    "(", 
                    ")", 
                    "[", 
                    "]", 
                    "{", 
                    "}", 
                    "~", 
                    "@", 
                    "€", 
                    "$"
                );

// Parcours du fichier
while (!feof($handle)) {
	$ligne = trim(fgets($handle));
	if ((strlen($ligne) > 0) && !(preg_match("#identifiant#", $ligne))) {
		list
        (
            $identifiant, 
            $libelle, 
            $caracteristique, 
            $adresse, 
            $complementAdresse, 
            $lieuDit, 
            $codePostal, 
            $localite, 
            $pays, 
            $latitude, 
            $longitude
        ) = explode(";", $ligne);
        
        // Construction des triplets RDF (instances et littéraux)
        if (!empty($libelle)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $libelle)  . ' rdf:type unicaen:Point_poste .' . "\n";
        if (!empty($libelle) && !empty($identifiant)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $libelle) . ' unicaen:se_situe _:Adresse' . $identifiant . ' .' . "\n";
        if (!empty($libelle) && !empty($identifiant)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $libelle) . ' unicaen:identifiant ' . '"' . $identifiant . '" .' . "\n";
        if (!empty($libelle)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $libelle) . ' unicaen:libelle ' . '"' . $libelle . '" .' . "\n";
        if (!empty($libelle) && !empty($caracteristique)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $libelle) . ' unicaen:caracteristique ' . '"' . $caracteristique . '" .' . "\n";
        if (!empty($identifiant)) 
            $template .= '_:Adresse' . $identifiant . ' rdf:type unicaen:Coordonnees .' . "\n";
        if (!empty($identifiant) && !empty($adresse)) 
            $template .= '_:Adresse' . $identifiant . ' unicaen:intitule ' . '"' . $adresse . '" .' . "\n";
        if (!empty($identifiant) && !empty($codePostal)) 
            $template .= '_:Adresse' . $identifiant . ' unicaen:CP ' . '"' . $codePostal . '" .' . "\n";
        if (!empty($identifiant) && !empty($latitude)) 
            $template .= '_:Adresse' . $identifiant . ' unicaen:latitude ' . '"' . $latitude . '" .' . "\n";
        if (!empty($identifiant) && !empty($longitude)) 
            $template .= '_:Adresse' . $identifiant . ' unicaen:longitude ' . '"' . $longitude . '" .' . "\n";
        if (!empty($identifiant) && !empty($localite)) 
            $template .= '_:Adresse' . $identifiant . ' unicaen:commune ' . '"' . $localite . '" .' . "\n";
    }
}

// Affichage du résultat
echo $template;

// Fermeture du fichier
$close = fclose($handle);
if (!$close) { echo "Problème de fermeture du fichier."; }
                
                
Flèche vers le bas → Télécharger le fichier RDF (output) ←

Fusion des deux fichiers

→ Télécharger le premier fichier CSV (input) ← → Télécharger le deuxième fichier CSV (input) ← Flèche vers le bas
Schéma RDF issu du croisement des deux schémas précédents
Schéma RDF issu du croisement des deux schémas précédents
Flèche vers le bas
                

<?php

// Encodage de l'output (UTF-8)
header('Content-Type: text/plain; charset=utf-8');

// Ouverture du fichier des établissements en lecture
$handle = fopen("../enseignement/enseignement.csv", "r");
if (!$handle) { echo "Problème d'ouverture du fichier."; }

// Initialisation du template
$template = "";

// Déclaration des préfixes d'URI
$template .= "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . \n";
$template .= "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . \n";
$template .= "@prefix unicaen: <http://www.unicaen.fr#> . \n";

// Création du premier triplet générique pour les établissements
$template .= "unicaen:Etablissement_enseignement rdf:type rdfs:Class . \n";

// Caractères spéciaux à ne pas mettre dans les triplets
$specialChars = array
                (
                    " ", 
                    "'", 
                    "\"", 
                    ",", 
                    ";", 
                    ".", 
                    ":", 
                    "?", 
                    "!", 
                    "&", 
                    "#", 
                    "\\", 
                    "/", 
                    "*", 
                    "(", 
                    ")", 
                    "[", 
                    "]", 
                    "{", 
                    "}", 
                    "~", 
                    "@", 
                    "€", 
                    "$"
                );

// Parcours du fichier des établissements
while (!feof($handle)) {
	$ligne = trim(fgets($handle));
	if ((strlen($ligne) > 0) && !(preg_match("#Code UAI#", $ligne))) {
		list
        (
            $codeUai, 
            $typeEtablissement, 
            $nom, 
            $sigle, 
            $statut, 
            $tutelle, 
            $universite, 
            $adresse, 
            $codePostal, 
            $commune, 
            $departement, 
            $academie, 
            $region, 
            $longitude, 
            $latitude, 
            $region
        ) = explode(";", $ligne);
        
        // Construction des triplets RDF (instances et littéraux)
        if (!empty($typeEtablissement)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $typeEtablissement)  . ' rdfs:subClassOf unicaen:Etablissement_enseignement .' . "\n";
        if (!empty($tutelle)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $tutelle)  . ' rdf:type unicaen:Tutelle .' . "\n";
        if (!empty($nom) && !empty($typeEtablissement)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' rdf:type unicaen:' . str_replace($specialChars, "_", $typeEtablissement) . ' .' . "\n";
        if (!empty($nom) && !empty($codeUai)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:possede _:Adresse' . $codeUai . ' .' . "\n";
        if (!empty($nom) && !empty($tutelle)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:depend unicaen:' . str_replace($specialChars, "_", $tutelle) . ' .' . "\n";
        if (!empty($nom) && !empty($academie)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:academie ' . '"' . $academie . '" .' . "\n";
        if (!empty($nom) && !empty($statut)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:statut ' . '"' . $statut . '" .' . "\n";
        if (!empty($nom) && !empty($codeUai)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:code ' . '"' . $codeUai . '" .' . "\n";
        if (!empty($nom)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:nom ' . '"' . $nom . '" .' . "\n";
        if (!empty($nom) && !empty($sigle)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:sigle ' . '"' . $sigle . '" .' . "\n";
        if (!empty($nom) && !empty($typeEtablissement)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $nom) . ' unicaen:type ' . '"' . $typeEtablissement . '" .' . "\n";
        if (!empty($codeUai)) 
            $template .= '_:Adresse' . $codeUai . ' rdf:type unicaen:Coordonnees .' . "\n";
        if (!empty($codeUai) && !empty($adresse)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:intitule ' . '"' . $adresse . '" .' . "\n";
        if (!empty($codeUai) && !empty($codePostal)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:CP ' . '"' . $codePostal . '" .' . "\n";
        if (!empty($codeUai) && !empty($latitude)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:latitude ' . '"' . $latitude . '" .' . "\n";
        if (!empty($codeUai) && !empty($longitude)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:longitude ' . '"' . $longitude . '" .' . "\n";
        if (!empty($codeUai) && !empty($departement)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:departement ' . '"' . $departement . '" .' . "\n";
        if (!empty($codeUai) && !empty($region)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:region ' . '"' . $region . '" .' . "\n";
        if (!empty($codeUai) && !empty($commune)) 
            $template .= '_:Adresse' . $codeUai . ' unicaen:commune ' . '"' . strtoupper($commune) . '" .' . "\n";
    }
}

// Fermeture du fichier des établissements
$close = fclose($handle);
if (!$close) { echo "Problème de fermeture du fichier."; }

// Ouverture du fichier des points poste en lecture
$handle = fopen("../poste/poste.csv", "r");
if (!$handle) { echo "Problème d'ouverture du fichier."; }

// Création du premier triplet générique pour les points poste
$template .= "unicaen:Point_poste rdf:type rdfs:Class . \n";

// Parcours du fichier des points poste
while (!feof($handle)) {
	$ligne = trim(fgets($handle));
	if ((strlen($ligne) > 0) && !(preg_match("#identifiant#", $ligne))) {
		list
        (
            $identifiant, 
            $libelle, 
            $caracteristique, 
            $adresse, 
            $complementAdresse, 
            $lieuDit, 
            $codePostal, 
            $localite, 
            $pays, 
            $latitude, 
            $longitude
        ) = explode(";", $ligne);
        
        // Construction des triplets RDF (instances et littéraux)
        if (!empty($libelle)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $libelle)  . ' rdf:type unicaen:Point_poste .' . "\n";
        if (!empty($libelle) && !empty($identifiant)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $libelle) . ' unicaen:se_situe _:Adresse' . $identifiant . ' .' . "\n";
        if (!empty($libelle) && !empty($identifiant)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $libelle) . ' unicaen:identifiant ' . '"' . $identifiant . '" .' . "\n";
        if (!empty($libelle)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $libelle) . ' unicaen:libelle ' . '"' . $libelle . '" .' . "\n";
        if (!empty($libelle) && !empty($caracteristique)) 
            $template .= 'unicaen:' . str_replace($specialChars, "_", $libelle) . ' unicaen:caracteristique ' . '"' . $caracteristique . '" .' . "\n";
        if (!empty($identifiant)) 
            $template .= '_:Adresse' . $identifiant . ' rdf:type unicaen:Coordonnees .' . "\n";
        if (!empty($identifiant) && !empty($adresse)) 
            $template .= '_:Adresse' . $identifiant . ' unicaen:intitule ' . '"' . $adresse . '" .' . "\n";
        if (!empty($identifiant) && !empty($codePostal)) 
            $template .= '_:Adresse' . $identifiant . ' unicaen:CP ' . '"' . $codePostal . '" .' . "\n";
        if (!empty($identifiant) && !empty($latitude)) 
            $template .= '_:Adresse' . $identifiant . ' unicaen:latitude ' . '"' . $latitude . '" .' . "\n";
        if (!empty($identifiant) && !empty($longitude)) 
            $template .= '_:Adresse' . $identifiant . ' unicaen:longitude ' . '"' . $longitude . '" .' . "\n";
        if (!empty($identifiant) && !empty($localite)) 
            $template .= '_:Adresse' . $identifiant . ' unicaen:commune ' . '"' . $localite . '" .' . "\n";
    }
}

// Affichage du résultat
echo $template;

// Fermeture du fichier des points poste
$close = fclose($handle);
if (!$close) { echo "Problème de fermeture du fichier."; }
                
                
Flèche vers le bas → Télécharger le fichier RDF (output) ←

Requêtes SPARQL

Description de la ressource "unicaen:Groupe_FIM_Agneaux"

                

PREFIX unicaen: <http://www.unicaen.fr#>

DESCRIBE unicaen:Groupe_FIM_Agneaux
                
                
→ Voir le résultat après exécution ←

Sélection du nom de la commune d'un établissement donné (EPICOM)

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT ?commune 
WHERE 
{
    unicaen:EPICOM unicaen:possede _:Adresse0342005V .
  	_:Adresse0342005V unicaen:commune ?commune .
}
                
                
→ Voir le résultat après exécution ←

Vérification de l'existence de points poste à Paris

                

PREFIX unicaen: <http://www.unicaen.fr#>

ASK 
WHERE 
{
  	?pp unicaen:se_situe ?adresse .
  	?adresse unicaen:commune "PARIS" .
}
                
                
→ Voir le résultat après exécution ←

Sélection des points poste se trouvant à Paris

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT ?pp 
WHERE 
{
  	?pp unicaen:se_situe ?adresse .
  	?adresse unicaen:commune "PARIS" .
}
                
                
→ Voir le résultat après exécution ←

Sélection des points poste se trouvant dans la commune d'un établissement donné (Institut de management et de communication interculturels)

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT ?pp 
WHERE 
{
    unicaen:Institut_de_management_et_de_communication_interculturels unicaen:possede _:Adresse0753666C .
  	_:Adresse0753666C unicaen:commune ?commune .
  	?pp unicaen:se_situe ?adresse .
  	?adresse unicaen:commune ?commune .
}
                
                
→ Voir le résultat après exécution ←

Sélection des dix premiers points poste se trouvant dans la commune d'un établissement donné (Institut de management et de communication interculturels)

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT ?pp 
WHERE 
{
    unicaen:Institut_de_management_et_de_communication_interculturels unicaen:possede _:Adresse0753666C .
  	_:Adresse0753666C unicaen:commune ?commune .
  	?pp unicaen:se_situe ?adresse .
  	?adresse unicaen:commune ?commune .
} 
LIMIT 10
                
                
→ Voir le résultat après exécution ←

Sélection de dix points poste différents se trouvant dans la commune d'un établissement donné (Institut de management et de communication interculturels) en partant du onzième point poste

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT DISTINCT ?pp 
WHERE 
{
    unicaen:Institut_de_management_et_de_communication_interculturels unicaen:possede _:Adresse0753666C .
  	_:Adresse0753666C unicaen:commune ?commune .
  	?pp unicaen:se_situe ?adresse .
  	?adresse unicaen:commune ?commune .
} 
OFFSET 10
LIMIT 10
                
                
→ Voir le résultat après exécution ←

Sélection de 10 points poste différents se trouvant dans la commune d'un établissement donné (Institut de management et de communication interculturels) en partant du onzième point poste. Les points poste sont d'abord triés par ordre alphabétique.

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT DISTINCT ?pp 
WHERE 
{
    unicaen:Institut_de_management_et_de_communication_interculturels unicaen:possede _:Adresse0753666C .
  	_:Adresse0753666C unicaen:commune ?commune .
  	?pp unicaen:se_situe ?adresse .
  	?adresse unicaen:commune ?commune .
} 
ORDER BY ?pp
OFFSET 10
LIMIT 10
                
                
→ Voir le résultat après exécution ←

Sélection de dix points poste différents se trouvant dans la commune d'un établissement d'enseignement qui possède elle-même plus de vingt points poste. La sélection est triée par ordre alphabétique et prend comme point de départ le onzième point poste du jeu de résultat.

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT DISTINCT ?pp ?commune
WHERE 
{
    ?etablissement unicaen:possede ?adresse1 .
  	?adresse1 unicaen:commune ?commune .
  	?pp unicaen:se_situe ?adresse2 .
  	?adresse2 unicaen:commune ?commune .
} 
GROUP BY ?pp ?commune
HAVING (COUNT(?pp) > 20)
ORDER BY ?pp
OFFSET 10
LIMIT 10
                
                
→ Voir le résultat après exécution ←

Sélection des établissements dont le nom contient le terme "management", quelle que soit la casse

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT ?nom 
WHERE 
{
    ?ecole unicaen:nom ?nom .
    FILTER regex(?nom , "management", "i")
}
                
                
→ Voir le résultat après exécution ←

Sélection de la région de deux établissements donnés dont l'adresse est inconnue

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT ?region 
WHERE 
{
    { 
        unicaen:IT_Paris_Eiffel unicaen:possede ?adresse .
        ?adresse unicaen:region ?region .
    } 
    UNION 
    { 
        unicaen:Groupe_FIM_Cherbourg unicaen:possede ?adresse .
        ?adresse unicaen:region ?region .
    }
}
                
                
→ Voir le résultat après exécution ←

Sélection des points poste qui ne sont pas à Paris, dans l'ordre inverse de l'alphabet

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT ?pp WHERE 
{
    { 
        ?pp unicaen:se_situe ?adresse .
    	?adresse unicaen:commune ?commune .
    }
  	MINUS
    { 
    	?pp unicaen:se_situe ?adresse .
        ?adresse unicaen:commune "PARIS" .
    }
}
ORDER BY DESC(?pp)
                
                
→ Voir le résultat après exécution ←

Sélection de toutes les adresses complètes (répondant au triptyque « intitulé / code postal / commune ») présentes dans le triplestore. Le département et la région sont facultatifs.

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT ?intitule ?cp ?commune ?departement ?region
WHERE 
{
  	?adresse unicaen:intitule ?intitule .
  	?adresse unicaen:CP ?cp .
	?adresse unicaen:commune ?commune .
  	OPTIONAL 
  	{
    	?adresse unicaen:departement ?departement .
  		?adresse unicaen:region ?region .
  	} 
}
                
                
→ Voir le résultat après exécution ←

Sélection (avec contrainte de réduction) des ressources et des caractéristiques associées aux libellés « ABONDANT AP » et « NOGENT LE ROI BP »

                

PREFIX unicaen: <http://www.unicaen.fr#>

SELECT REDUCED *
WHERE 
{
  	?pp unicaen:libelle ?libelle .
  	?pp unicaen:caracteristique ?caracteristique .
	VALUES (?libelle)
 	{
    	("ABONDANT AP")
    	("NOGENT LE ROI BP")
  	}
}
                
                
→ Voir le résultat après exécution ←

Construction d'un nouveau graphe RDF fondé sur un remplacement de prédicat (« unicaen:libelle » vers « unicaen:nom »)

                

PREFIX unicaen: <http://www.unicaen.fr#>

CONSTRUCT { ?pp unicaen:nom ?libelle . }
WHERE { ?pp unicaen:libelle ?libelle . }
                
                
→ Voir le résultat après exécution ←

Insertion simple d'un triplet de test

                

PREFIX unicaen: <http://www.unicaen.fr#>

INSERT DATA { unicaen:Test unicaen:test "Test" . }
                
                

Insertion d'un triplet de test avec contexte

                

PREFIX unicaen: <http://www.unicaen.fr#>

INSERT DATA 
{ 
    GRAPH <http://www.unicaen.fr/test>
    {
        unicaen:Test unicaen:test "Test" . 
    }
}
                
                

Suppression simple du triplet de test

                

PREFIX unicaen: <http://www.unicaen.fr#>

DELETE DATA { unicaen:Test unicaen:test "Test" . }
                
                

Modification du sigle de l'Institut Catholique de Rennes

                

PREFIX unicaen: <http://www.unicaen.fr#>

DELETE { unicaen:Institut_Catholique_de_Rennes unicaen:sigle "ICR" . }
INSERT { unicaen:Institut_Catholique_de_Rennes unicaen:sigle "Test" . }
WHERE { unicaen:Institut_Catholique_de_Rennes unicaen:sigle "ICR" . }
                
                

Suppression et restauration de toutes les données concernant l'IXAD

                

PREFIX unicaen: <http://www.unicaen.fr#>

DELETE { unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest ?predicat ?objet . }
INSERT
{ 
	unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest rdf:type unicaen:Autre_établissement_du_supérieur .
	unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest unicaen:possede _:Adresse0596135Y .
	unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest unicaen:depend unicaen:Ministère_de_la_Justice .
	unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest unicaen:academie "Lille" .
	unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest unicaen:statut "Public" .
	unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest unicaen:code "0596135Y" .
	unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest unicaen:nom "IXAD Ecole des Avocats Nord-Ouest" .
	unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest unicaen:sigle "IXAD" .
	unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest unicaen:type "Autre établissement du supérieur" .
}
WHERE { unicaen:IXAD_Ecole_des_Avocats_Nord-Ouest ?predicat ?objet . }