Les Noms & Notes en RDF


Un exemple simple et complet

  1. L'idée

  2. Réalisation
    1. Note technique sur la transformation XML->RDF

  3. Extension à des données supplémentaires



  1. L'idée

    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...
  2. Réalisation

  3. Extension à des données supplémentaires

    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 :

    1. 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


    2. 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 !

    3. 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" )
           }