220 likes | 302 Views
Formation aux technologies du Web sémantique CCSD, Lyon, 8-10 septembre 2010. Présentation de la formation. Objectif : découvrir les technologies du Web sémantique tant du point de vue théorique que pratique. Jour 3. Jour 1. Jour 2. Aspect théorique et Web de données. PHP et
E N D
Formation aux technologies du Web sémantiqueCCSD, Lyon, 8-10 septembre 2010
Présentation de la formation Objectif : découvrir les technologies du Web sémantique tant du point de vue théorique que pratique Jour 3 Jour 1 Jour 2 Aspect théorique et Web de données PHP et Web sémantique Aspect pratique et Ontologie
Plan de la journée Préparerl’environnement Gestion destriplets Sélection ettraitement des triplets
Préparer l’environnement Télécharger ARC sur le site http://arc.semsol.org Créer un nouveau répertoire dans votre espace Web et placer le répertoire « arc » Créer une base de données MySQL et, éventuellement, un utilisateur dédié avec les droits de création des tables
Configurer ARC <?php /* Fichier de configuration pour ARC 2 */ $arc_config = array( /* Configuration de l'accès à la base de données MySQL */ 'db_host' => '', /* Domaine de la base de données ; par défaut : localhost */ 'db_name' => '', /* Nom de la base de données */ 'db_user' => '', /* Nom de l'utilisateur de la base de données */ 'db_pwd' => '', /* Mot de passe de l'utilisateur de la base de données */ /* Nom de l'entrepôt RDF Cela permet de créer plusieurs entrepôts distincts avec la même base de données */ 'store_name' => '', /* Nombre d'erreurs maximums avant l'arrêt d'un script 'max_errors' => 100, */ /* Configuration complémentaire en cas de présence d'un proxy 'proxy_host' => '192.168.1.1', 'proxy_port' => 8080, */ /* Préfixe pour les nœuds blancs 'bnode_prefix' => 'bn', */ /* Formats supportés par l'extracteur de données structurées dans les pages Web */ 'sem_html_formats' => 'rdfa microformats', ); ?>
Principes de fonctionnement de ARC Toutes les interactions avec la base de données MySQL se font en SPARQL Depuis l’extérieur via un sparql endpoint Simulation d’un triple storeavec BD Mysql SPARQL SPARQL Convertisseur SPARQL To SQL Ou directement via des méthodes PHP
Configurer le SPARQL endpoint <?php include_once('arc/ARC2.php'); include_once('config.php'); /* Compléments par rapport à la configuration initiale */ $config = $arc_config + array ( /* Type de requêtes supportés par le sparql endpoint */ 'endpoint_features' => array( 'select', 'construct', 'ask', 'describe', 'load', 'insert', 'delete', 'dump' /* dump is a special command for streaming SPOG export */ ), 'endpoint_timeout' => 60, /* Temps maximal d'exécution */ 'endpoint_read_key' => '', /* Facultatif : définition d'une clé pour effectuer une requête de lecture */ 'endpoint_write_key' => 'somekey', /* Facultatif : définition d'une clé pour effectuer une requête d'écriture */ 'endpoint_max_limit' => 250, /* Facultatif : Nombre maximal de résultat */ ); /* Instantiation d'un sparql endpoint */ $ep = ARC2::getStoreEndpoint($config); /* Création des tables ARC dans la base si elle n'existe pas */ if (!$ep->isSetUp()) { $ep->setUp(); } /* Méthode pour déclarer le sparql endpoint */ $ep->go(); ?>
Plan de la journée Préparerl’environnement Gestion destriplets Sélection ettraitement des triplets
Le principe des graphes nommés Chaque triplet étant indépendant, comment rassembler un ensemble cohérent de triplets ? 1 6 2 8 3 5 7 4 Le graphe nommé Principe du graphe nommé Ressource pour relier différents graphesQuadruplet <Sujet1> <Prédicat1> <Objet1> <Graphe1> <Sujet2> <Prédicat2> <Objet2> <Graphe1> • Gérer un ensemble de triplets (suppression, ajout, modification) • Indiquer la provenance d’un ensemble de triplets • Exprimer la confiance sur un ensemble de triplets Le principe des graphes nommées est présent dans SPARQL, mais pas encore officiellement dans RDF la syntaxe RDF/XML ne permet pas de l’exprimer
SPARQL Update LOAD Charger un flux RDF (quelque soit sa syntaxe) accessible à l’URI indiqué. S’il s’agit d’une page HTML, ARC détecte les microformats, microdatas et RDFa et en extrait les triplets RDF. Syntaxe LOAD <http://example.com/> Dans ce cas, l’URI chargé est aussi l’URI du graphe nommé LOAD <http://example.com/> INTO <http://example.com/archive> Dans ce cas, les triplets sont associés au graphe nommé précisé INSERT Insérer un ensemble de triplets dans un graphe nommé Syntaxe INSERT INTO <http://example.com/> { <#foo> <bar> "baz" . } Dans ce cas, les triplets exprimés sont insérés dans le graphe nommé précisé INSERT INTO <http://example.com/inferred> { ?s foaf:knows ?o .} WHERE { ?s xfn:contact ?o .} Il est aussi possible d’ajouter des triplets construits à partir de triplets existants.
SPARQL Update DELETE Supprimer des triplets RDF Syntaxe DELETE { <#foo> <bar> "baz" . } Dans ce cas, les triplets exprimés seront supprimés DELETE FROM <http://example.com/archive> Dans ce cas, tous les triplets associés au graphe nommé seront supprimés DELETE FROM <http://example.com/inferred> { ?s rel:wouldLikeToKnow ?o .} WHERE { ?s kiss:kissed ?o .} Il est aussi possible de supprimer des triplets à partir de s contraintes exprimées via d’autres triplets Ces opérations sont en cours de normalisation dans le cadre de SPARQL 1.1. La syntaxe peut donc encore légèrement variée.
LOAD : Charger des triplets <?php $url=$_GET['url']; include_once('arc/ARC2.php'); include_once('config.php'); /*Instantiation*/ $store = ARC2::getStore($arc_config); /*Si les tables ne sont pas crées, création des tables */ if (!$store->isSetUp()) { $store->setUp(); } /* Chargement du flux distant */ if (isset($url)) { $load="LOAD <".$url.">"; if ($rows = $store->query($load)) { $added_triples = $rows['result']['t_count']; echo $added_triples." triplets ont été ajoutés<br/>"; } } else { print "Vous n'avez pas saisi d'URL à charger"; } ?> Renvoie un tableau Exploitation du tableau
Plan de la journée Préparerl’environnement Gestion destriplets Sélection ettraitement des triplets
SELECT : effectuer une requête <?php include_once('arc/ARC2.php'); include_once('config.php'); /* Instantiation de l'entrepôt à partir de la configuration */ $store=ARC2::getStore($arc_config); /*Si les tables ne sont pas crées, création des tables */ if (!$store->isSetUp()) { $store->setUp(); } $query="PREFIX skos: <http://www.w3.org/2004/02/skos/core#> SELECT DISTINCT ?s ?nom WHERE { ?s skos:subject <http://dbpedia.org/resource/Category:Star_Wars_characters>; rdfs:label ?nom. FILTER (lang(?nom)='fr') }"; $res=$store->query($query); if($store->getErrors()) { print_r($store->errors); echo "***\nQuery = $query"; } else { print_r($res); } ?>
Le tableau de réponse Array ( [query_type] => select [result] => Array ( [variables] => Array ( [0] => s [1] => nom ) [rows] => Array ( [0] => Array ( [s] => http://dbpedia.org/resource/Anakin_Skywalker [s type] => uri [nom] => Anakin Skywalker [nom type] => literal [nom lang] => fr ) [1] => Array ( [s] => http://dbpedia.org/resource/Luke_Skywalker [s type] => uri [nom] => Luke Skywalker [nom type] => literal [nom lang] => fr ) ) ) [query_time] => 0.17298412322998 )
Exploiter le tableau de réponses <?php /* [SNIP] */ $query="PREFIX skos: <http://www.w3.org/2004/02/skos/core#> SELECT DISTINCT ?s ?nom WHERE { ?s skos:subject <http://dbpedia.org/resource/Category:Star_Wars_characters>; rdfs:label ?nom. FILTER (lang(?nom)='fr') }"; $res=$store->query($query); if($store->getErrors()) { print_r($store->errors); echo "***\nQuery = $query"; } else { print "<ul>"; foreach ($res['result']['rows'] as $result) { print "<li><a href=\"".$result['s']."\">".$result['nom']."</a></li>"; } print "</ul>"; } ?>
Utiliser des classes (1) class store { public $store; public function __construct() { $this->init(); } private function init() { global $arc_config; $this->store = ARC2::getStore($arc_config); /*Si les tables ne sont pas crées, création des tables */ if (!$this->store->isSetUp()) { $this->store->setUp(); } } public function do_query($query) { global $debug; $prefix=" PREFIX dbpprop: <http://dbpedia.org/property/> PREFIX dbowl: <http://dbpedia.org/ontology/> $res = $this->store->query($prefix." ".$query); if($debug && $this->store->getErrors()) { print_r($this->store->errors); echo "***\nQuery = $query"; die(); } return $res; } }
Utiliser des classes (2) class personnage { public $uri; public function __construct($uri, $lang='en') { $this->store=new store; $this->uri=$uri; $this->lang=$lang; $infos="SELECT ?label ?abstract ?affiliation ?page WHERE { <".$this->uri."> dbowl:abstract ?abstract; rdfs:label ?label; dbpprop:affiliation ?affiliation; foaf:page ?page. FILTER (lang(?abstract)='".$lang."') FILTER (lang(?label)='".$lang."') }"; $infosquery=$this->store->do_query_row($infos); $this->query=$infos; $this->result=$infoquery; $this->description=$infosquery['abstract']; $this->nom=$infosquery['label']; $this->affiliation=$infosquery['affiliation']; $this->wikipedia=$infosquery['page']; } }
Créer de nouvelles pages en exploitant les classes <?php include ('./class.php'); $uri=$_GET['uri']; $personnage=new personnage ($uri,'fr'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title><?php echo $personnage->nom ?></title> </head> <body> <div id="logo"> <h1><a href="./">Encyclopédie Star Wars</a></h1> <h1 id="persName"> <?php echo $personnage->nom ?> </h1> <div id="content"> <p><strong>Description</strong> : <?php echo $personnage->description ?> <a href="<?php echo $personnage->wikipedia ?>">En savoir plus sur Wikipedia</a></p> <p><strong>Affiliation</strong> : <?php echo $personnage->affiliation ?></p> </div> <div id="footer"> <a href="./">Accueil</a> | <a href="http://www.lespetitescases.net/semweblabs/">Semantic Web Labs</a> | <a href="http://www.lespetitescases.net">Les Petites cases</a> </div> </body> </html>
Remote store : interroger un sparql endpoint distant Il est tout à fait possible d’interroger un sparql endpoint distant ce qui permet de mixer différentes sources de données <?php /* configuration */ $remoteconfig = array( /* remote endpoint */ 'remote_store_endpoint' => 'http://dbpedia.org/sparql', ); /* instantiation */ $remotestore = ARC2::getRemoteStore($remoteconfig); $query="SELECT ?label WHERE {<".$personnage->planet."> rdfs:label ?label FILTER (lang(?label)='fr')}"; $result = $remotestore->query($query, 'row'); print $result['label']; ?> Arc ne dispose pas de système de cache. Attention donc à la perte de connexion !!
CONSTRUCT : récupérer ou créer des triplets Ce type de requêtes permet de récupérer un ensemble de triplets stockés dans le triple store pour les manipuler localement, de « re-modéliser » des nouveaux triplets à partir des triplets existants voire d’appliquer des règles d’inférence. Deux parties Construction des triplets cible CONSTRUCT { ?resourcedc:title ?label Une ressourcea pour titreune étiquette } Recherche dans les triplets existants WHERE { ?resourcerdfs:label ?label Une ressource a pour étiquette une étiquette. }
Gautier Poupeau Antidot | GSM: +33 (0)6 45 49 59 77 F-75 Paris | mailto: gpoupeau@antidot.net Blog : Les petites cases | Twitter : @lespetitescases Merci pour votre attention