Formation aux technologies du Web sémantique

Download Report

Transcript Formation aux technologies du Web sémantique

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 1
Jour 2
Jour 3
Aspect théorique
et
Web de données
Aspect pratique
et
Ontologie
PHP
et
Web sémantique
2
Plan de la journée
Préparer
l’environnement
Gestion des
triplets
Sélection et
traitement des triplets
3
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
4
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',
);
?>
5
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 store
avec BD Mysql
SPARQL
SPARQL
Convertisseur SPARQL To SQL
Ou directement via des méthodes PHP
6
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();
?>
7
Plan de la journée
Préparer
l’environnement
Gestion des
triplets
Sélection et
traitement des triplets
Le principe des graphes nommés
Chaque triplet étant indépendant,
comment rassembler un ensemble cohérent de triplets ?
1
6
2
3
Le graphe nommé
5
8
4
7
Principe du graphe nommé
Ressource pour relier différents
graphes
Quadruplet
• 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
<Sujet1> <Prédicat1> <Objet1> <Graphe1>
<Sujet2> <Prédicat2> <Objet2> <Graphe1>
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
9
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.
10
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.
11
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 */
Renvoie un tableau
if (isset($url)) {
Exploitation du tableau
$load="LOAD <".$url.">";
if ($rows = $store->query($load)) {
$added_triples = $rows['result']['t_count'];
echo $added_triples." triplets ont &eacute;t&eacute; ajout&eacute;s<br/>";
}
}
else {
print "Vous n'avez pas saisi d'URL &agrave; charger";
}
?>
12
Plan de la journée
Préparer
l’environnement
Gestion des
triplets
Sélection et
traitement des triplets
13
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);
}
?>
14
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
)
15
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>";
}
?>
16
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;
}
}
17
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'];
}
}
18
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>
19
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 !!
20
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
CONSTRUCT
{
triplets cible
Une ressource a pour titre une étiquette
}
Recherche
WHERE
{ dans les triplets existants
Une ressource a pour étiquette une étiquette.
}
21
Merci pour votre attention
Gautier Poupeau
Antidot | GSM: +33 (0)6 45 49 59 77
F-75 Paris | mailto: [email protected]
Blog : Les petites cases | Twitter : @lespetitescases