SPARQL langage et protocole d`interrogation de métadonnées

Transcription

SPARQL langage et protocole d`interrogation de métadonnées
Sommaire
FI 9/2006
SPARQL
langage et protocole
d’interrogation de métadonnées
[email protected], Domaine IT
Cet
article, le troisième d’une
série consacré au Web
sémantique, a pour sujet SPARQL, un
langage et protocoles de requêtes pour
l’interrogation de métadonnées sous
forme de fichiers RDF ou plus exactement un langage d’interrogation de
triplets RDF. Rappelons qu’un triplet
RDF est une association: {sujet, objet,
predicat}.
J’invite les lecteurs peu familiarisés
avec ce formalisme à lire ou relire les
articles précédents sur RDF/RDFS et
OWL.
Dernièrement, les spécifications de
SPARQL Query Language for RDF1,
SPARQL Protocol for RDF2 et SPARQL
Query Results XML Format3 s’enchaînent à un rythme rapide, les dernières
qui datent respectivement du 4 octobre
et 6 avril 2006 montrent la volonté du
consortium W3C de faire des ces drafts
des recommandations officielles et celle
de proposer des technologies matures
pour le Web sémantique (WS).
Le site du W3C4 consacré au WS
précise dans sa page d’accueil la vision
de cette démarche. Nous traduisons:
1
3
4
2
http://www.w3.org/TR/rdf-sparql-query/
http://www.w3.org/TR/rdf-sparql-protocol/
http://www.w3.org/TR/rdf-sparql-XMLres/
http://www.w3.org/2001/sw/
"Le Web sémantique est un Web de données. De nombreuses données que nous
utilisons tous les jours sont présentes sur
l’Internet mais ne sont pas accessibles
aux échanges (le Web proprement dit).
C’est le cas de mon compte en banque,
de mes photographies, de mes dates de
rendez-vous. Mais je ne peux pas les
rapprocher pour connaître par exemple
ce que je faisais le jour où j’ai été photographié, ni l’état de mon compte en
banque ce jour-là. Pourquoi ne peut-on
pas le faire ? Parce que les données sont
encapsulées dans des applications et que
les applications ne sont pas conçues pour
les échanger.
Le Web Sémantique porte sur deux choses. Il définit des formats communs pour
l’échange des données, alors que le Web
traditionnel ne définit que les modalités
d’échange des documents. Par ailleurs,
il offre un langage commun permettant
aux données de renvoyer à des objets du
monde réel d’une façon identique. Ceci
permet à une personne ou à une machine
de construire des bases de données puis des
réseaux de bases de données qui ne seront
pas connectées par des liens physiques
mais par le fait qu’elles désignent des
objets identiques."
suite en page
8
1 SPARQL, langage et protocole
d’interrogation de métadonnées
Francis Lapique
2 Forum IT du 2 novembre 2006
Jacqueline Dousson
3 Linotype FontExplorer X ou le
iTunes des fontes
Roland Chabloz
7 OpenSolaris User Group
15 Le bonheur est dans… les prestations
Laurence Denoréaz
16 Programme des cours
19 Intégration de données externes
avec Jahia …
Hicham Dennaoui
20 Réseau
René Berger,
Richard Timsit &
Esteban Rosales
Prochaines parutions
délai rédaction
10
1
2
3
30.11.06
11.01.07
08.02.07
08.03.07
parution
19.12.06
30.01.07
27.02.07
27.03.07
FI 9 – 21 novembre 2006 – page SPARQL langage et protocole d’interrogation de métadonnées
Suite de la première page
Pour illustrer ce langage dans une pratique il faut un
moteur SPARQL et des exemples de graphes RDF. Pour
le moteur j’ai choisi ARQ5 un élément du projet Jena6 qui
est un cadre de développement pour les applications du
WS. Pour les exemples RDF j’ai choisi FOAF (Friend Of A
Friend) 7, un projet collaboratif visant à utiliser RDF pour
créer un nouveau type de document décrivant des personnes
et accessible en ligne.
FOAF les amis de mes amis...
Plus qu ’un discours, trois exemples.
exemple 1
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<foaf:Person>
<foaf:name>Jimmy Wales</foaf:name>
<foaf:mbox rdf:resource="mailto:[email protected]" />
<foaf:homepage rdf:resource="http://www.jimmywales.com/" />
<foaf:nick>Jimbo</foaf:nick>
<foaf:depiction rdf:resource="http://www.jimmywales.com/aus_img_small.jpg" />
<foaf:interest>
<rdf:Description rdf:about="http://www.wikimedia.org" rdfs:label="Wikipedia" />
</foaf:interest>
<foaf:knows>
<foaf:Person>
<foaf:name>Angela Beesley</foaf:name> <!-- Wikimedia Board of Trustees -->
</foaf:Person>
</foaf:knows>
</foaf:Person>
</rdf:RDF>
exemple 2
<foaf:Person>
<foaf:name>Peter Parker</foaf:name>
<foaf:gender>Male</foaf:gender>
<foaf:title>Mr</foaf:title>
<foaf:givenname>Peter</foaf:givenname>
<foaf:family_name>Parker</foaf:family_name>
<foaf:mbox_sha1sum>cf2f4bd069302febd8d7c26d803f63fa7f20bd82</foaf:mbox_sha1sum>
<foaf:homepage rdf:resource="http://www.peterparker.com"/>
<foaf:weblog rdf:resource="http://www.peterparker.com/blog/"/>
</foaf:Person>
exemple 3
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<foaf:Person rdf:ID="peter">
<foaf:name>Peter Parker</foaf:name>
<foaf:depicts rdf:resource="http://www.peterparker.com/peter.jpg"/>
<foaf:based_near>
<geo:Point geo:lat="51.473" geo:long="-2.5432"/>
</foaf:based_near>
</foaf:Person>
<foaf:Person rdf:ID="spiderman">
<foaf:name>Spiderman</foaf:name>
</foaf:Person>
<foaf:Person rdf:ID="green-goblin">
<foaf:name>Green Goblin</foaf:name>
</foaf:Person>
<!-- codepiction -->
<foaf:Image rdf:about="http://www.peterparker.com/photos/spiderman/statue.jpg">
<dc:title>Battle on the Statue Of Liberty</dc:title>
<foaf:depicts rdf:resource="#spiderman"/>
<foaf:depicts rdf:resource="#green-goblin"/>
<foaf:maker rdf:resource="#peter"/>
</foaf:Image>
</rdf:RDF>
5
http://jena.sourceforge.net/ARQ/
http://jena.sourceforge.net/
7
Spécifications du vocabulaire FOAF (mai 2004) http://xmlns.com/foaf/0.1/, voir également http://www.foaf-project.org, http://rdfweb.
org, http://rdfweb.org/topic/FAQ
6
FI 9 – 21 novembre 2006 – page SPARQL langage et protocole d’interrogation de métadonnées
On peut noter que la notion de personne (introduite par
la balise <foaf:Person>) est décrite par plusieurs caractéristiques, parmi lesquelles name, title, nickname, gender, etc.
On remarquera également que les adresses email des différents
individus dont il est fait référence n’apparaissent pas en tant
que telles dans le fichier, mais sont représentées de façon codée
et que la balise <foaf:knows> introduit des connaissances.
Cyril Fievet 8 fait une bonne
présentation du projet FOAF
L’une des possibilités offertes par FOAF, qui illustre bien
la puissance du procédé, est d’ailleurs la fusion de documents
(http://www-106.ibm.com/developerworks/xml/library/x-foaf.
html). Supposons que Pierre crée son fichier FOAF, et qu’il
ne dispose pas de photos de lui-même. L’un de ses amis, Paul,
a lui aussi un fichier FOAF, dans lequel il indique l’adresse
d’une photo le montrant en compagnie de Pierre. Il est alors
très facile, de façon automatisée, de fusionner les deux fichiers
FOAF pour que la question Où peut-on consulter une
photo de Pierre ? fournisse une réponse, en renvoyant sur
la photo présentant Pierre et Paul. Sans nécessiter d’annuaire
centralisé, FOAF permet par essence de lier les personnes – et
leurs attributs ou caractéristiques – entre elles, comme si tout
était décrit dans une base de données unique.
Le principe en est simple: chaque personne est identifiée
par un fichier FOAF, qui peut être placé n’importe où sur le
Web, et qui contient, dans des champs normés et en XML,
des informations la décrivant.
Chacun peut bien sûr choisir le nombre et la profondeur
des informations le concernant. Les champs d’un fichier
Le moteur SPARQL ARQ 0.9.5
FOAF peuvent être le nom, l’adresse email, l’adresse du site
Web et/ou du blog, les adresses des photos, les études suivies,
ARQL est le moteur SPARQL du projet Jena. Pour l’insles centres d’intérêt, les amis - et bien d’autres choses, selon les
tallation il faut ramener la dernière distribution ARQ-1.x.zip9
spécifications actuelles. La dernière version de FOAF établit
et faire les exports nécessaires:
une liste de plusieurs dizaines de champs possibles, répartis
$ export ARQROOT=~/ARQ-0.9.5
en cinq grandes catégories: les données de base (nom, pré$ chmod +rx $ARQROOT/bin/*
$ export PATH=$PATH:$ARQROOT/bin
nom, etc.), les informations personnelles (centres d’intérêt,
connaissances…), les comptes en lignes (email, messageries
et ajouter au CLASSPATH tous les fichiers jar du répertoire
instantanées…), les documents et images (textes produits
lib/ de la distribution.
par la personne,
ARQdir/lib/antlr-2.7.5.jar;ARQdir/lib/arq.jar;ARQdir/lib/commons-logging.jar;
photos person- ARQdir/lib/concurrent.jar;ARQdir/lib/icu4j_3_4.jar;ARQdir/lib/jakarta-oro-2.0.8.jar;
n e l l e s … ) , e t ARQdir/lib/jena.jar;ARQdir/lib/junit.jar;ARQdir/lib/log4j-1.2.12.jar;
enfin les grou- ARQdir/lib/xercesImpl.jar;ARQdir/lib/xml-apis.jar
pes et projets.
L’installation est finie, on peut lancer le moteur en passant
Cette dernière catégorie est particulièrement intéresla commande sparql.
sante: elle permet le rattachement d’une personne à une
$ sparql
organisation (association, entreprise) mais surtout, plus
Usage: [--data URL] [exprString | --query file]
généralement, à un groupe quelconque. Il peut s’agir d’un
Le tutorial d’ARQL est à l’adresse suivante: http://jena.
groupe structuré (parti politique), informel, ou simplement
sourceforge.net/ARQ/Tutorial/index.html. Pour le monde
d’une communauté en ligne. FOAF permet donc de repréWindows on peut faire l’installation sous Cygwin.
senter le regroupement d’individus selon plusieurs groupes,
à la manière des fonctions proposées par les nombreuses
Exemples de mise en œuvre de
communautés en ligne.
SPARQL
On le voit, les champs FOAF sont conçus pour exprimer
de façon détaillée les caractéristiques d’un individu et ses liens
Comme premier exemple, cherchons l’URL du blog de
– au sens large du terme – avec d’autres entités sur l’Internet,
la personne de la communauté FOAF http://planetrdf.com/
qu’il s’agisse de documents, d’images, ou d’autres individus.
dont le nom est Dave Beckett. Cette communauté FOAF
Et l’on comprend l’intérêt de ce qui pourrait devenir un Web
est décrite par un graphe bloggers.rdf dont nous reproduisons
sémantique pour les personnes. FOAF pourrait permettre
ci-dessous un extrait concernant Dave Beckett.
de répondre à des requêtes
<foaf:Agent rdf:nodeID="id2244837">
extrêmement complexes, du
<foaf:name>Dave Beckett</foaf:name>
genre: y a-t-il des Parisiens
<rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Person"/>
<foaf:weblog>
qui travaillent chez Micro<foaf:Document rdf:about="http://journal.dajobe.org/journal/">
soft, tiennent un blog, et
<dc:title>Journalblog by Dave Beckett</dc:title>
s’intéressent à la nanotech<rdfs:seeAlso>
<rss:channel rdf:about="http://journal.dajobe.org/journal/comments.rdf">
nologie ?, ou simplement re<foaf:maker rdf:nodeID="id2244837"/>
grouper de façon automatique
<foaf:topic rdf:resource="http://www.w3.org/2001/sw/"/>
des gens qui ont sans le savoir
<foaf:topic rdf:resource="http://www.w3.org/RDF/"/>
</rss:channel>
des affinités très similaires (par
</rdfs:seeAlso>
exemple qui aime les mêmes
</foaf:Document>
genres de musique, lisent les
</foaf:weblog>
<foaf:interest rdf:resource="http://www.w3.org/2001/sw/"/>
mêmes blogs et pratiquent les
<foaf:interest rdf:resource="http://www.w3.org/RDF/"/>
mêmes sports…).
</foaf:Agent>
8
http://www.internetactu.net/?p=4800
9
http://jena.sourceforge.net/ARQ/download.html
FI 9 – 21 novembre 2006 – page SPARQL langage et protocole d’interrogation de métadonnées
Cette requête, traduite en dialecte SPARQL, se présente sous la forme de:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?url
FROM
<http://planetrdf.com/bloggers.rdf>
WHERE {
?contributor foaf:name "Dave Beckett" .
?contributor foaf:weblog ?url .
}
La première ligne précise l’espace de nom c’est un raccourci pour http://xmlns.com/foaf/0.1/, la clause SELECT nomme la variable
qui sera renvoyée - ici ?url (les variables SPARQL sont préfixées par ?), la clause FROM de la troisième ligne precise l’URI du dataset,
la clause WHERE de la quatrième ligne est la série de graph pattern que l’on cherche à satisfaire. Le premier ?contributor foaf:
name "Dave Beckett" représente l’ensemble des sujets, la variable ?contributor , liée à l’objet "Dave Beckett" par le prédicat
foaf:name, le second l’ensemble des objets ?url lié aux sujets ?contributor par le prédicat foaf:weblog. La commande
se fait comme suit (ex1.rq est le nom du fichier qui contient le code SPARQL): #sparql --query ex1.rq.
Le résultat se présente sous la forme d’un tableau avec en première ligne le nom de la variable et en deuxième, le résultat:
---------------------------------------| url
|
========================================
| <http://journal.dajobe.org/journal/> |
----------------------------------------
Vous pouvez à l’image de SQL ajouter une clause DISTINCT après SELECT ou LIMIT, OFFSET, et ORDER après WHERE. Juste à
titre d’information, le framework Jena permet d’écrire un programme Java équivalent à la commande:
// Open the bloggers RDF graph from the filesystem
InputStream in = new FileInputStream(new File("bloggers.rdf"));
// Create an empty in-memory model and populate it from the graph
Model model = ModelFactory.createMemModelMaker().createModel();
model.read(in,null); // null base URI, since model URIs are absolute
in.close();
// Create a new query
String queryString =
"PREFIX foaf: <http://xmlns.com/foaf/0.1/> " +
"SELECT ?url " +
"WHERE {" +
"
?contributor foaf:name \"Dave Beckett\" . " +
"
?contributor foaf:weblog ?url . " +
"
}";
Query query = QueryFactory.create(queryString);
// Execute the query and obtain results
QueryExecution qe = QueryExecutionFactory.create(query, model);
ResultSet results = qe.execSelect();
// Output query results
ResultSetFormatter.out(System.out, results, query);
// Important - free up resources used running the query
qe.close();
Pour plus d’information voici un pointeur sur l’API jena.
sourceforge.net/ARQ/app_api.html. L’option OPTIONAL,
comme son nom le laisse entendre, permet de dire qu’un
pattern peut-être optionnel. Dans l’exemple qui suit, on
cherche à satisfaire le pattern {?person foaf:name ?name}
et éventuellement celui {?person foaf:depiction ?depiction}:
F
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?depiction
FROM
<bloggers.rdf>
WHERE {
?person foaf:name ?name .
OPTIONAL {
?person foaf:depiction ?depiction
.
} .
}
Dans le dataset bloggers.rdf la seule personne accompagnée d’une image est "Tim
Berners-Lee".
------------------------------------------------------------------------------------| name
| depiction
|
=====================================================================================
| "Tim Berners-Lee" | <http://weblogs.elearning.ubc.ca/brian/archives/radiokid.jpg> |
| "Dave Beckett"
|
|
| "Danny Ayers"
|
|
| "John Barstow"
|
|
-------------------------------------------------------------------------------------
On peut imbriquer les OPTIONAL.
FI 9 – 21 novembre 2006 – page 10
SPARQL langage et protocole d’interrogation de métadonnées
Dans le dataset bloggers.rdf, de l’exemple ci-contre, une personne a protégé explicitement son adresse de courrier
des spammeurs en faisant appel à la balise foaf:mbox_sha1sum une autre ne l’a pas fait (balise foaf:mbox) et le reste n’ont
pas fourni cette information. Pour trouver les personnes ayant un courrier et non les autres, on fait une UNION des deux
pattern {?person foaf:mbox ?mbox} et {?person foaf:mbox_sha1sum ?mbox}.
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?name ?mbox
FROM
<bloggers.rdf>
WHERE {
?person foaf:name ?name .
{
{ ?person foaf:mbox ?mbox } UNION { ?person foaf:mbox_sha1sum ?mbox }
}
}
------------------------------------------------------------------| name
| mbox
|
===================================================================
| "Gregory Williams" | "d2063cf95ead7f1f364538ef6a0a086577713dcd" |
| "Danny Weitzner"
| "mailto:[email protected]"
|
-------------------------------------------------------------------
Le mot-clef FILTER impose
des contraintes sur les variables. Par
exemple dans le dataset rss.rdf on
trouve une référence à un flux RSS en
date du 18 septembre 2006.
F
........
<foaf:made>
<rss:channel rdf:about="http://philwilson.org/rssify.php">
<rss:title>philwilson.org</rss:title>
<dc:date>2006-09-18T09:10:00Z</dc:date>
</rss:channel>
</foaf:made>
........
.........
Imaginons que l’on veuille connaître tous les articles datant de septembre 2006.
PREFIX rss:
<http://purl.org/rss/1.0/>
PREFIX xsd:
<http://www.w3.org/2001/XMLSchema#>
PREFIX dc:
<http://purl.org/dc/elements/1.1/>
SELECT ?item_title ?pub_date
FROM <rss.rdf>
WHERE {
?item rss:title ?item_title .
?item dc:date ?pub_date .
FILTER ( xsd:dateTime(?pub_date) >= "2006-09-01T00:00:00Z"^^xsd:dateTime &&
xsd:dateTime(?pub_date) < "2006-10-01T00:00:00Z"^^xsd:dateTime )
}
Dans un premier temps on recherche les éléments liés
par le prédicat rss:title, et dans un second la date de ceux-ci
au moyen du prédicat dc:date en appliquant le filtre. && est
l’opérateur booléen ET, quant à xsd:dateTime(?pub_date)
et "2006-09-01T00:00:00Z"^^xsd:dateTime, ce sont deux
casting en type xsd:dateTime.
Dans le document SPARQL Query Language for
RDF du W3C, les exemples de graphes RDF présentés
ne font pas appel à la syntaxe RDF/XML que nous
avons vue jusqu’ici. C’est une notation dite Turtle (Terse
RDF Triple Language) 10, équivalente.
En grammaire Turtle dans
l’exemple montré: book1 identifie
un nœud, dc:title un prédicat
et "The Semantic Web" un objet.
ARQ comprend cette notation,
ainsi en notant ex1.ttl cet exemple et ex2.rq ce code SPARQL.
La commande: #sparql
PREFIX
PREFIX
F
F
dc:
ns:
F
--------------------------------------------| item_title
| pub_date
|
=============================================
| "philwilson.org" | "2006-09-18T09:10:00Z" |
---------------------------------------------
@prefix dc:
@prefix :
@prefix ns:
:book1
:book1
:book2
:book2
<http://purl.org/dc/elements/1.1/> .
<http://example.org/book/> .
<http://example.org/ns#> .
dc:title
ns:price
dc:title
ns:price
"SPARQL Tutorial" .
42 .
"The Semantic Web" .
23 .
<http://purl.org/dc/elements/1.1/>
<http://example.org/ns#>
SELECT ?title ?price
FROM <ex1.ttl>
WHERE
{ ?x dc:title ?title .
OPTIONAL { ?x ns:price ?price . FILTER (?price < 30) }
}
--query ex2.rq
produit le résultat:
-----------------------------| title
| price |
==============================
| "The Semantic Web" | 23
|
| "SPARQL Tutorial" |
|
------------------------------
10
http://www.dajobe.org/2004/01/turtle/
FI 9 – 21 novembre 2006 – page 11
SPARQL langage et protocole d’interrogation de métadonnées
Le graphe référencé par la directive FROM est le graphe par défaut. On peut nommer un graphe via la clause FROM NAMED
et travailler avec des collections de graphes. Soit les trois graphes et la requête ex3.rq:
# Default graph (stored at dft.ttl)
@prefix dc: <http://purl.org/dc/elements/1.1/> .
<bob.ttl>
<alice.ttl>
dc:publisher
dc:publisher
"Bob Hacker" .
"Alice Hacker" .
# Named graph: bob.ttl
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:a foaf:name "Bob" .
_:a foaf:mbox <mailto:[email protected]> .
# Named graph: alice.ttl
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?who ?g ?mbox
FROM <dft.ttl>
FROM NAMED <alice.ttl>
FROM NAMED <bob.ttl>
WHERE
{
?g dc:publisher ?who .
GRAPH ?g { ?x foaf:mbox ?mbox }
}
_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:[email protected]> .
la commande: sparql
--query ex3.rq
donne comme résultat:
-------------------------------------------------------------------------------| who
| g
| mbox
|
================================================================================
| "Alice Hacker" | <file:///xxxx/alice.ttl> | <mailto:[email protected]> |
| "Bob Hacker"
| <file:///xxxx/bob.ttl>
| <mailto:[email protected]> |
--------------------------------------------------------------------------------
Le pattern {?g dc:publisher ?who} est résolu dans le graphe par défaut, tandis que celui {?x foaf:mbox ?mbox } l’est
dans les graphes alice.ttl et bob.ttl introduits par le mot-cle GRAPH. Un exemple concret: voici mon profil FOAF et à
titre d’exemple j’ai indiqué une connaissance mortenf.
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:admin="http://webns.net/mvcb/">
<foaf:Person rdf:ID="me">
<foaf:name>Francis Lapique</foaf:name>
<foaf:title>M.</foaf:title>
<foaf:givenname>Francis</foaf:givenname>
<foaf:family_name>Lapique</foaf:family_name>
<foaf:mbox_sha1sum>266cb9fe0141fbad7c000bd53e89923926722a22</foaf:mbox_sha1sum>
<foaf:homepage rdf:resource="http://www.epfl.ch"/>
<foaf:workplaceHomepage rdf:resource="http://www.epfl.ch"/>
<foaf:knows>
<foaf:Person>
<foaf:name>mortenf</foaf:name>
<foaf:mbox_sha1sum>7ed2aeef52364e17ae9613bb477dc2bf0fe06a02</foaf:mbox_sha1sum></foaf:Person>
</foaf:knows>
</foaf:Person>
</rdf:RDF>
Je veux un service qui m’indique les 10 derniers articles de mes connaissances. Sur la base de l’exemple précédent, la requête
est la suivante.
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rss: <http://purl.org/rss/1.0/>
PREFIX dc:
<http://purl.org/dc/elements/1.1/>
SELECT ?title ?known_name ?link
FROM <http://www.wasab.dk/morten/index.rdf>
FROM NAMED <profil.rdf>
WHERE {
GRAPH <profil.rdf> {
?me foaf:name "Francis Lapique" .
?me foaf:knows ?known_person .
?known_person foaf:name ?known_name .
} .
?item
?item
?item
?item
dc:creator ?known_name .
rss:title ?title .
rss:link ?link .
dc:date ?date.
}
ORDER BY DESC(?date) LIMIT 10
FI 9 – 21 novembre 2006 – page 12
SPARQL langage et protocole d’interrogation de métadonnées
--------------------------------------------------------------------------------------------| title
| known_name | link
|
===================================================================================================
============================= =====================================================================
========================
| "digg.dk"
| "mortenf" | "http://
digg.dk/"
|
| "Web 2.0 Colour Palette"
| "mortenf" | "http://www.
modernlifeisrubbish.co.uk/web -2.0-colour-palette.asp"
|
| "OSX Keyboard Shortcuts"
| "mortenf" | "http://
developer.apple.com/documentation /UserExperience/Conceptual/OSXHIGuidelines/XHIGKeyboardShortcuts/
chapter_20_section_1.html" |
| "Top 10 Best Wordpress Plugins"
|
"mortenf" | "http://www.johnchow.com/index.php/my-top -10-best-wordpress-plugins/"
|
| "Top 10 over udsagn der har ført til eksklusion fra Dansk Folkeparti" | "mortenf" | "http://www.
baldersf.dk/2006/10/10/top-10 -over-udsagn-der-har-f%C3%B8rt-til-eksklusion-fra-dansk-folkeparti/"
|
| "Apple Gazette"
| "mortenf" | "http://www.
applegazette.com/"
|
En première partie, on va rechercher mes connaissances
dans le graphe profil.rdf et en deuxième les dernières
contributions de mes connaissances dans le dataset http://
www.wasab.dk/morten/index.rdf. En précisant à sparql
que l’on veut un résultat sous la forme XML il est aisé de
construire une application AJAX. On trouve sur le Web des
applications qui vont dans ce sens, en visualisant l’activité
de grandes communautés virtuelles. Vous pouvez remarquer
que dans le profil de "Peter Parker" (ex.3, page 8) vous
trouvez une référence à sa localisation, je vous laisse imaginer
les potentiels d’application en intégrant l’API Google Maps
et les problèmes éthiques et de sécurité que cela va poser.
Il est possible d’avoir un filtre sur des tag. Par exemple
considérer le graphe suivant où les deux objets "Robert" et
"Roberto" ont respectivement les tags EN et ES.
@prefix foaf:
_:a foaf:name
_:a foaf:name
_:a foaf:mbox
<http://xmlns.com/foaf/0.1/> .
"Robert"@EN.
"Roberto"@ES.
<mailto:[email protected]> .
Pour trouver les références à l’espagnol, on passe la requête
suivante:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE { ?x foaf:name ?name ;
foaf:mbox ?mbox .
FILTER ( lang(?name) = "ES" ) }
#sparql --query lang.rq
--graph lang.ttl.
-------------------------------------------| name
| mbox
|
============================================
| "Roberto"@ES | <mailto:[email protected]> |
--------------------------------------------
ASK, DESCRIBE et CONSTRUCT
SPARQL propose en plus de SELECT ces trois autres formes d’interrogation. ASK va répondre par OUI ou NON à une question, exemple:
Étant donné le graphe ask.ttl:
@prefix foaf:
<http://xmlns.com/foaf/0.1/> .
_:a foaf:name
"Alice" .
_:a foaf:homepage
<http://work.example.org/alice/> .
_:b foaf:name
"Bob" .
_:b foaf:mbox
<mailto:[email protected]> .
et la requête ask.rq
PREFIX foaf:
<http://xmlns.com/foaf/0.1/>
ASK { ?x foaf:name "Alice" }
la commande:
sparql --query ask.rq
--graph ask.ttl
donne comme réponse:
Ask => Yes
CONSTRUCT permet de construire un graphe. Sur la base du
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:a
foaf:name
"Alice" .
_:a
foaf:mbox
<mailto:[email protected]> .
graphe
et de la demande:
PREFIX foaf:
<http://xmlns.com/foaf/0.1/>
PREFIX vcard:
<http://www.w3.org/2001/vcard-rdf/3.0#>
CONSTRUCT
{ <http://example.org/person#Alice> vcard:FN ?name }
WHERE
{ ?x foaf:name ?name }
FI 9 – 21 novembre 2006 – page 13
SPARQL langage et protocole d’interrogation de métadonnées
on construit la propriété vcard
@prefix vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> .
<http://example.org/person#Alice> vcard:FN "Alice" .
DESCRIBE permet d’obtenir des informations détaillées, par exemple la requête suivante:
PREFIX ent: <http://org.example.com/employees#>
DESCRIBE ?x WHERE { ?x ent:employeeId "1234" }
vous propose comme résultat:
@prefix
@prefix
@prefix
@prefix
@prefix
_:a
foaf:
vcard:
exOrg:
rdf:
owl:
<http://xmlns.com/foaf/0.1/> .
<http://www.w3.org/2001/vcard-rdf/3.0> .
<http://org.example.com/employees#> .
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://www.w3.org/2002/07/owl#>
exOrg:employeeId
"1234" ;
foaf:mbox_sha1sum
vcard:N
[ vcard:Family
vcard:Given
"ABCD1234" ;
foaf:mbox_sha1sum
rdf:type
"Smith" ;
"John" ] .
owl:InverseFunctionalProperty .
SPARQL et AJAX
Le document SPARQL Protocol for RDF édité par
Kendall Clark, propose un protocole pour transmettre et
renvoyer des résultats pour un service de traitement de
requêtes SPARQL.
Joseki11 est une application Web qui prend en compte
protocole et langage SPARQL. Le Quick start d’installation
de Joseki est des plus simple:
z Set the JOSEKIROOT environment variable to the
location of the installation.
z Run the script rdfserver (bin/ or bat/). This will run an
HTTP server on port 2020.
z Go to http://localhost:2020/query.html (figure ci-contre).
Si vous ne demandez pas une transformation
XSLT vous avez directement les résultats sous la
forme d’un fichier XML:
F
L’intégration dans une application AJAX est alors évidente. Une indication tout de même. On ne peut pas, pour
des raisons de sécurité, passer la requête http://localhost:2020/sparql?query... comme telle , il faut passer
par l’intermédiaire d’un proxy.
11
http://www.joseki.org/
FI 9 – 21 novembre 2006 – page 14
F
<?xml version="1.0"?>
<sparql
xmlns:rdf="http://www.w3.org/1999/02/22-rdfsyntax-ns#"
xmlns:xs="http://www.w3.org/2001/XMLSchema#"
xmlns="http://www.w3.org/2005/sparql-results#">
<head>
<variable name="item_title"/>
<variable name="pub_date"/>
</head>
<results ordered="false" distinct="false">
<result>
<binding name="item_title">
<literal>philwilson.org</literal>
</binding>
<binding name="pub_date">
<literal>2006-09-18T09:10:00Z</literal>
</binding>
</result>
</results>
</sparql>
try
{
F
this.request.open(‘GET’, ‘http://
localhost/sparql/sparql?query...’, true);
this.request.send(null);
} catch (e)
SPARQL langage et protocole d’interrogation de métadonnées
Conclusion
En guise de conclusion, quelques lectures: un billet12
sur une extension de MediaWiki Semantic MediaWiki13
(SMW):
«J’avoue que j’ai été bluffé par cette application appelée
Semantic Mediawiki et qui constitue une extension au logiciel
Mediawiki. À la lecture du résumé de l’article, je m’attendais
à un simple export des données d’un site utilisant Mediawiki
(exemple au hasard: wikipedia !) vers RDF. Cela aurait été une
première étape déjà intéressante, nous permettant de récupérer
les liens sémantiques existants non typés entre les différentes
définitions de la Wikipedia et ainsi de disposer d’un thésaurus
dont j’ai rappelé il y a peu l’intérêt de la publication en RDF sur
le Web. D’ailleurs, une société proposait depuis plusieurs mois un
export mensuel des données de la Wikipedia anglophone et je me
demandais ce que ce projet pouvait donner de plus.
En lieu et place du résumé, c’est le texte complet de la communication que j’aurais dû lire ce qui m’aurait renseigné sur la
nature réelle des ambitions des développeurs. En réalité, grâce
à ce logiciel, on voit les prémices de la réponse à la question
systématique: comment les utilisateurs pourront-ils ajouter
des renseignements sémantiques ? Avec un minimum d’organisation ? en utilisant RDF, sa complexité et sa syntaxe
barbare ? Et surtout facilement ? Réponse élémentaire, mes
chers lecteurs: avec la syntaxe wiki. À ce stade de ce billet, vous
allez me rétorquer que c’est évident, d’accord et alors ?
Avant d’aller plus loin, je vous conseille la lecture du précédent billet si le concept de RDF n’est pas complètement clair
pour vous…».
Un autre lien intéressant traitant la question SQL,
XQuery, and SPARQL: What’s Wrong With This Picture? 14,
un projet Tabulator15.
Le prochain et dernier article consacré aux technologies
du WS aura comme sujet les moteurs d’inférence.n
12
14
13
15
http://www.lespetitescases.net/et-le-wiki-devint-semantique
http://wiki.ontoworld.org/index.php/Semantic_MediaWiki
http://xtech06.usefulinc.com/schedule/paper/119
http://dig.csail.mit.edu/2005/ajar/release/tabulator/0.7/About.
html
Le bonheur est dans…
les prestations
[email protected], Domaine IT
Petite
sœur de l’accréditation, l’application
Prestations de base est accessible à tout
un chacun, mais les utilisateurs qui en font l’usage le plus
fréquent sont les accréditeurs.
Cette application sert de guichet virtuel pour l’obtention
ou la mise à jour de ressources générales fournies par des
prestataires de l’Ecole (portail d’authentification, courrier
électronique, service téléphonique,…). Elle concerne toutes les personnes (étudiants et collaborateurs) accréditées
à l’EPFL.
Ce sont les accréditeurs, ainsi que pour certaines des
prestations, les personnes titulaires du droit administration
de comptes gaspar, qui sont chargés pour les personnes
accréditées dans leur unité, de créer/modifier le compte Gaspar, de demander/gérer une adresse email EPFL, de mettre
à jour les coordonnées (local et téléphone) d’une personne
et de demander la publication de l’adresse d’une page Web
personnelle dans l’annuaire Web.
La demande de carte Camipro sera tout prochainement
retirée de cette application. En effet, depuis la mise en production de Camipro 2 et des propriétés d’une accréditation,
il n’est plus nécessaire de faire une demande de carte via ce
biais.
Seules les personnes ayant un statut hors epfl ou étant
rattachée à une EHE (entité hôte de l’EPFL) doivent avoir
la propriété droits camipro associés modifiée à oui manuellement par leur accréditeur, pour pouvoir bénéficier d’une
carte et des droits d’accès sous-jacents.
Chaque personne accréditée peut accéder à ses propres
prestations. À partir de l’interface des prestations, elle a la
possibilité de gérer les paramètres de son compte email, de
changer son propre mot de passe Gaspar, de demander la
mise à jour de données (local et no de téléphone) ainsi que
la publication d’une page Web personnelle.
Comme l’application Accred, les prestations sont amenées à évoluer au fil du temps et en fonction des besoins de
l’Ecole.
Un mode d’emploi est désormais disponible. Il est accessible en ligne dans l’application sous aide, ainsi que depuis
le site de l’accréditation. Le point d’entrée est:
http://accred.epfl.ch/prestations.n
FI 9 – 21 novembre 2006 – page 15