Faire fonctionner RDF avec le framework Jena
- Installation
- Principe :
les triplets RDF
- Triplets
- Ensemble
(graphe) de triplets
- Requêtes
sur une base de connaissances RDF : SPARQL
- RDFa et les
microformats
-
Installation
- Télécharger [
http://jena.sourceforge.net/
],
et dézipper, pour obtenir un
répertoire Jena-2.6.2
(dit répertoire
de base)
- Installer une variable d'environnement
$JENAROOT
donnant le chemin du répertoire de base
Par exemple, dans votre fichier d'initialisation ".cshrc
"
ajouter une ligne comme
setenv JENAROOT
/Users/jfp/Documents/RPO/SemWeb/Jena/Jena-2.6.2
- Dans le répertoire
$JENAROOT/bin
,
commander "chmod a+x *
"
pour rendre exécutables les scripts qui y sont logés.
- Vérifier que tout va bien en commandant (dans le même
répertoire
$JENAROOT/bin
)
"./rdfparse -h
" (= demander le mode d'emploi
de la commande jena.rdfparse
).
On doit vous répondre par le discours limpide que voici :
java <class-path>
com.hp.hpl.jena.rdf.arp.NTriple ( [ -[xstfurR]][ -b xmlBase -[eiw]
NNN[,NNN...] ] [ file ] [ url ] )...
All options, files and URLs can be
intemingled in any order.
They are processed from left-to-right.
file Converts RDF/XML
file into N-triples
url
Converts RDF/XML from URL into N-triples
-b uri
Sets XML Base to the absolute URI.
-r
Content is RDF (default, no embedding, rdf:RDF tag may be omitted).
-R
RDF embedded in XML document, search for obligatory rdf:RDF start
element.
-t
No n-triple output, error checking only.
-x
Lax mode - warnings are suppressed.
-s
Strict mode - most warnings are errors.
-n
Show line and column numbers.
-u
Allow unqualified attributes (defaults to warning).
-f
All errors are.error - report first one only.
-b url
Sets XML Base to the absolute url.
-e NNN[,NNN...]
Treats numbered warning conditions as errrors.
-w NNN[,NNN...]
Treats numbered error conditions as warnings.
-i NNN[,NNN...]
Ignores numbered error/warning conditions.
-
Principe
: les triplets RDF
-
Triplets
L'élément de base de RDF est l'énoncé d'une relation binaire aRb,
où a et b sont les deux termes
et R la relation.
Comme on le voit, un tel énoncé prend naturellement la forme d'un
triplet (a, R, b).
Les trois composants du triplet portent des noms variables avec le
point de vue du locuteur :
- au ras des octets :
le premier terme a sera appelé ressource,
la relation R sera vue comme une propriété,
et le second terme b sera sa valeur.
- en termes philosophiques :
le premier terme a sera appelé sujet,
la relation R sera
savamment appelée prédicat, et le second terme b
sera un objet.
Les deux termes de la relation ne jouent pas des rôles symétriques,
ainsi que le laissent entendre les deux terminologies ci-dessus.
- Le premier aura toujours le statut de ressource
: pour une réflexion utile sur l'acception de ce mot dans le cadre du
World Wide Web,
lire Wikipédia.
Pratiquement, une ressource sera désignée par une chaîne de caractères
qui aura le statut exorbitant d'URI.
On envisage aussi, dans le cadre de RDF, des ressources anonymes.
- Le second sera soit une ressource (éventuellement
anonyme), soit un littéral - c'est-à-dire une
chaîne de caractères banale,
sans statut privilégié.
- Quant à la relation, qui est une entité d'une tout
autre nature (cf. en logique, la différence entre le 1er ordre et le
2ème ordre),
on admet froidement qu'elle sera désignée, elle aussi, par une URI...
Nous pouvons à présent montrer un premier exemple de triplet RDF, qui
énonce que
- un certain John Smith, vu comme
une ressource : "
http://.../JohnSmith
"
(premier terme)
- a comme nom sur sa carte de visite (relation :
précisions ci-après)
- la chaîne de caractères (banale) "
John
Smith
".
Noter la différence de statut entre les deux chaînes de carctères en
jeu : l'URI "http://.../JohnSmith
"
et le littéral "John Smith
".
Quant à la relation, elle sera désignée dans le cadre conceptuel
formalisé des cartes de visite VCARD
,
dont
le namespace est http://www.w3.org/2001/vcard-rdf/3.0
.
À l'intérieur de cet espace de nommage, alias vocabulaire,
elle porte le nom local "FN
" (comme Full
Name). Sa désignation complète est http://www.w3.org/2001/vcard-rdf/3.0#FN
(et non simplement http://www.w3.org/2001/vcard-rdf/3.0:FN
comme on aurait pu croire).
Ce triplet peut être représenté graphiquement ainsi :
où la notation abrégée vcard:FN
renvoie à une
déclaration xmlns:vcard='http://www.w3.org/2001/vcard-rdf/3.0#'
.
En notation N3, ce triplet s'écrit :
@prefix
rdf:
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://somewhere/JohnSmith>
<http://www.w3.org/2001/vcard-rdf/3.0#FN> "John Smith".
ou bien
@prefix
rdf:
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix vcard:
<http://www.w3.org/2001/vcard-rdf/3.0#> .
<http://somewhere/JohnSmith> vcard:FN "John Smith".
En syntaxe XML, le même triplet s'écrit :
<rdf:RDF
xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
xmlns:vcard='http://www.w3.org/2001/vcard-rdf/3.0#'
>
<rdf:Description
rdf:about='http://somewhere/JohnSmith'>
<vcard:FN>John
Smith</vcard:FN>
</rdf:Description>
</rdf:RDF>
-
Ensemble
(graphe) de triplets
L'idée est de manipuler des collections de triplets, censées
représenter des connaissances.
Il pourra arriver qu'une même ressource soit à la fois sujet et objet,
qu'un même sujet entre dans plusieurs relations,
ce qui donnera à la collection l'aspect d'un graphe
au sens de ce terme en Combinatoire.
Suite de l'exemple :
le vocabulaire vcard
distingue le nom
complet (FN
= Full
Name), dont la valeur est une chaîne de caractères,
et le nom (N
=
Name), dont la valeur est un objet complexe formé du nom de
famille (Family
) et du prénom (Given
).
Cet agrégat sera représenté en RDF par une ressource anonyme.
D'où un graphe comme celui-ci :
en notation N3
@prefix vcard:
<http://www.w3.org/2001/vcard-rdf/3.0#> .
@prefix rdf:
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://somewhere/JohnSmith> vcard:FN "John Smith".
<http://somewhere/JohnSmith>
vcard:N
[ vcard:Family "Smith" ; vcard:Given "John"] .
ou bien, dans une écriture plus compacte
@prefix vcard:
<http://www.w3.org/2001/vcard-rdf/3.0#> .
@prefix rdf:
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://somewhere/JohnSmith>
vcard:FN "John
Smith" ;
vcard:N [
vcard:Family "Smith" ; vcard:Given "John"] .
et en XML
<rdf:RDF
xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
xmlns:vcard='http://www.w3.org/2001/vcard-rdf/3.0#'
>
<rdf:Description
rdf:about='http://somewhere/JohnSmith'>
<vcard:FN>John
Smith</vcard:FN>
<vcard:N rdf:nodeID="A0"/>
</rdf:Description>
<rdf:Description rdf:nodeID="A0">
<vcard:Given>John</vcard:Given>
<vcard:Family>Smith</vcard:Family>
</rdf:Description>
</rdf:RDF>
Un exemple un peu plus fourni...
en notation N3 : fichier vcardCat.N3
@prefix vcard:
<http://www.w3.org/2001/vcard-rdf/3.0#> .
@prefix rdf:
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://somewhere/RebeccaSmith/>
vcard:FN "Becky
Smith" ;
vcard:N [
vcard:Family "Smith" ; vcard:Given "Rebecca"] .
<http://somewhere/JohnSmith/>
vcard:FN "John
Smith" ;
vcard:N [
vcard:Family "Smith" ; vcard:Given "John"] .
<http://somewhere/SarahJones/>
vcard:FN "Sarah
Jones" ;
vcard:N [
vcard:Family "Jones" ; vcard:Given "Sarah"] .
<http://somewhere/MattJones/>
vcard:FN "Matt
Jones" ;
vcard:N [
vcard:Family "Jones" ; vcard:Given "Matthew"] .
et en XML: fichier vcardCat.rdf
<?xml version="1.0"?>
<rdf:RDF
xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
xmlns:vcard='http://www.w3.org/2001/vcard-rdf/3.0#'
>
<rdf:Description rdf:nodeID="A0">
<vcard:Family>Smith</vcard:Family>
<vcard:Given>John</vcard:Given>
</rdf:Description>
<rdf:Description
rdf:about='http://somewhere/JohnSmith/'>
<vcard:FN>John
Smith</vcard:FN>
<vcard:N rdf:nodeID="A0"/>
</rdf:Description>
<rdf:Description
rdf:about='http://somewhere/SarahJones/'>
<vcard:FN>Sarah
Jones</vcard:FN>
<vcard:N rdf:nodeID="A1"/>
</rdf:Description>
<rdf:Description
rdf:about='http://somewhere/MattJones/'>
<vcard:FN>Matt
Jones</vcard:FN>
<vcard:N rdf:nodeID="A2"/>
</rdf:Description>
<rdf:Description rdf:nodeID="A3">
<vcard:Family>Smith</vcard:Family>
<vcard:Given>Rebecca</vcard:Given>
</rdf:Description>
<rdf:Description rdf:nodeID="A1">
<vcard:Family>Jones</vcard:Family>
<vcard:Given>Sarah</vcard:Given>
</rdf:Description>
<rdf:Description rdf:nodeID="A2">
<vcard:Family>Jones</vcard:Family>
<vcard:Given>Matthew</vcard:Given>
</rdf:Description>
<rdf:Description
rdf:about='http://somewhere/RebeccaSmith/'>
<vcard:FN>Becky
Smith</vcard:FN>
<vcard:N rdf:nodeID="A3"/>
</rdf:Description>
</rdf:RDF>
Essayez !
Le W3C met à votre disposition un service de validation : http://www.w3.org/RDF/Validator/
auquel vous pouvez soumettre vos fichiers en RDF-XML (soit par copier-coller, soit en donnant une URL publique).
La validateur vous livrera la liste des triplets (sous forme d'un tableau à 4 colonnes : n°, sujet, prédicat, objet),
et, si vous le demandez, il vous dessinera le graphe correspondant dans le format de votre choix.
Voici par exemple comment il voit les 16 triplets de notre vcardCat.rdf
(format "PNG - embedded
"):

-
Requêtes
sur une base de connaissances RDF : SPARQL
Comme son nom l'indique, le langage de requêtes SPARQL suit son
devancier SQL.
Exemple simple :
fichier vcard1.rq
PREFIX vcard:
<http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?prenom
FROM
<http://pagesperso-systeme.lip6.fr/Jean-Francois.Perrot/inalco/XML/RDF/Exemples/vcardCat.rdf>
WHERE {
?x vcard:N ?c .
?c vcard:Given ?prenom .
}
ce qui se lit :
chercher dans le fichier "vcardCat.rdf
"
(ci-dessus) toutes les chaînes (ici désignées par "?prenom
")
telles qu'il existe dans le graphe correspondant deux triplets de la
forme "?x vcard:N ?c
" et "?c
vcard:Given ?prenom
",
avec la même valeur pour "?c
".
Exécution :
%/..($JENAROOT)../bin/sparql
--query
vcard1.rq
-------------
| prenom |
=============
| "Rebecca" |
| "Matthew" |
| "Sarah" |
| "John" |
-------------
Les valeurs recherchables ne se limitent pas aux chaînes terminales,
mais on obtiendra toutjours des chaînes représentatives :
Exemple : fichier vcard3.rq
PREFIX vcard:
<http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?prenom ?x ?c
FROM <vcardCat.rdf>
WHERE {
?x vcard:N ?c .
?c vcard:Given ?prenom .
}
%/..($JENAROOT)../bin/sparql
--query
vcard3.rq
-------------------------------------------------------
| prenom |
x
| c |
=======================================================
| "Rebecca" | <http://somewhere/RebeccaSmith/> | _:b0 |
| "Matthew" |
<http://somewhere/MattJones/>
| _:b1 |
| "Sarah" |
<http://somewhere/SarahJones/> | _:b2
|
| "John" |
<http://somewhere/JohnSmith/>
| _:b3 |
-------------------------------------------------------
Et le résultat obtenu peut aussi avoir une forme propre à une
exploitation ultérieure, par exemple en XML :
%/..($JENAROOT)../bin/sparql
--query
vcard1.rq --results XML
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
<head>
<variable name="prenom"/>
</head>
<results>
<result>
<binding
name="prenom">
<literal>Rebecca</literal>
</binding>
</result>
<result>
<binding
name="prenom">
<literal>Matthew</literal>
</binding>
</result>
<result>
<binding
name="prenom">
<literal>Sarah</literal>
</binding>
</result>
<result>
<binding
name="prenom">
<literal>John</literal>
</binding>
</result>
</results>
</sparql>
Mise en œuvre à distance
Essayez ! Il faut que le champ "FROM
" de votre
requête contienne une URL accessible depuis le réseau.
De même qu'on écrit le plus souvent les requêtes SQL au moyen d'une interface aimable,
on trouve des logiciels permettant de composer des requêtes SPARQL avec un peu de confort.
Par exemple Twinkle.
-
Utilisation avec DBPedia
Le projet DBPedia propose le contenu de Wikipédia sous la forme d'une énorme base de connaissances en RDF.
-
L'idée est d'enrichir le balisage d'un document XML afin d'en extraire
certains types d'informations sous forme RDF.
Le nom générique de cette famille de logiciels est microformats.
RDFa [Wikipédia, Wikipedia]
en fait partie, mais on peut en discuter...