Les Noms & Notes en RDF
Un exemple simple et complet
- L'idée
- Réalisation
- Note technique sur la transformation XML->RDF
- Extension à des données supplémentaires
-
est de convertir nos fichiers XML de Noms & Notes, qui
existent sous deux formes différentes, en un format RDF permettant une
exploitation via SPARQL affranchie du choix de syntaxe XML de la source.
À partir d'un fichier XML comme :
<?xml version="1.0" ?>
<liste>
<eleve>
<nom>Toto</nom>
<note>12</note>
</eleve>
<eleve>
<nom>Tata</nom>
<note>13</note>
</eleve>
<eleve>
<nom>Tutu</nom>
<note>17</note>
</eleve>
<eleve>
<nom>Titi</nom>
<note>11</note>
</eleve>
</liste>
nous souhaitons obtenir le RDF que voici : NN.rdf
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:epita="http://epita/masters/international/"
xml:base="http://epita/masters/international/perso">
<rdf:Description rdf:about="#Toto">
<epita:note >12</epita:note>
</rdf:Description>
<rdf:Description rdf:about="#Tata">
<epita:note >13</epita:note>
</rdf:Description>
<rdf:Description rdf:about="#Tutu">
<epita:note >17</epita:note>
</rdf:Description>
<rdf:Description rdf:about="#Titi">
<epita:note >11</epita:note>
</rdf:Description>
</rdf:RDF>
qui se traduit en N3 sous la forme :
@prefix epita:
<http://epita/masters/international/> .
@prefix rdf:
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://epita/masters/international/perso#Toto>
epita:note "12" .
<http://epita/masters/international/perso#Tutu>
epita:note "17" .
<http://epita/masters/international/perso#Tata>
epita:note "13" .
<http://epita/masters/international/perso#Titi>
epita:note "11"
.
et à qui on pourra demander la note de l'étudiant Dunabla par une
requête comme :
PREFIX epita:
<http://epita/masters/international/>
SELECT ?mark
FROM <chemin-vers-le-fichier.rdf>
WHERE {
<http://epita/masters/international/perso#Dunabla>
epita:note ?mark .
}
et la liste des étudiants ayant une note supérieure à 16 par
PREFIX epita: <http://epita/masters/international/>
SELECT ?nom
FROM
<chemin-vers-le-fichier.rdf>
WHERE {
?nom epita:note ?mark .
FILTER ( ?mark > "16" )
}
Notez les guillemets autour de la note : "16"
et non 16
...
-
-
C'est un bon exemple d'emploi de XSLT pour engendrer du XML, en mettant
en œuvre les techniques décrites ici.
Voici la feuille de style :
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version='1.0'
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:epita="http://epita/masters/international/"
>
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:template match="/">
<rdf:RDF
xml:base="http://epita/masters/international/perso" >
<xsl:apply-templates />
</rdf:RDF>
</xsl:template>
<xsl:template match="eleve">
<rdf:Description rdf:about="#{@nom}">
<epita:note>
<xsl:value-of select="@note" />
</epita:note>
</rdf:Description>
</xsl:template>
</xsl:stylesheet>
- Le fichier RDF correspondant à la collection de Noms
& Notes
qui nous a servi comme jeu d'essai pour FO
est accessible à l'URL
http://pagesperso-systeme.lip6.fr/Jean-Francois.Perrot/inalco/XML/RDF/Exemples/NNFO.rdf
-
Il est très facile d'ajouter des fichiers donnant des renseignements supplémentaires sur la même
population,
et de faire des requêtes combinant plusieurs sources, en multipliant les clauses FROM
. Par exemple :
- Puisque nos étudiants sont censés appartenir à l'EPITA, il
est naturel d'enregistrer leurs majeures :
nous introduisons donc une relation epita:mjr
, ce qui
donne un document comme mjr.rdf
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:epita="http://epita/masters/international/"
xml:base="http://epita/masters/international/perso">
<rdf:Description rdf:about="#Toto">
<epita:mjr
>GISTRE</epita:mjr>
</rdf:Description>
<rdf:Description rdf:about="#Tata">
<epita:mjr >SRS</epita:mjr>
</rdf:Description>
<rdf:Description rdf:about="#Tutu">
<epita:mjr >SCIA</epita:mjr>
</rdf:Description>
<rdf:Description rdf:about="#Titi">
<epita:mjr
>GISTRE</epita:mjr>
</rdf:Description>
</rdf:RDF>
Le fichier homologue pour le "jeu d'essais FO" est en ligne à l'URL
http://pagesperso-systeme.lip6.fr/Jean-Francois.Perrot/inalco/XML/RDF/Exemples/MJRFO.rdf
- Pour contrôle, il est bon de vérifier la liste des majeures par
PREFIX epita: <http://epita/masters/international/>
SELECT DISTINCT ?sp
FROM <chemin-vers-le-fichier-des-majeures.rdf>
WHERE {
[] epita:mjr ?sp .
}
Notez l'emploi de la spécification DISTINCT
!
- Nous pouvons alors demander la liste des noms & notes des étudiants dont la majeure est donnée,
p. ex. GISTRE
:
PREFIX epita: <http://epita/masters/international/>
SELECT ?name ?mark
FROM
<chemin-vers-le-fichier-des-notes.rdf>
FROM
<chemin-vers-le-fichier-des-majeures.rdf>
WHERE {
?name epita:note ?mark .
?name epita:mjr ?sp
FILTER ( ?sp = "GISTRE" )
}