Sémantiser une base de données relationnelle (3ème épisode)

Ce billet est le troisième épisode d’une série de billets sur la sémantisation d’une base de données relationnelle des auteurs de langue bretonne issue du projet PRELIB.

Je posterai dorénavant la dernière version de la totalité des triplets RDF sur mon compte personnel sur le site de partage de code informatique GitHub Gist. Je commençai en effet à être un peu perdu avec mes petits bout de triplets dispersés d’un billet à l’autre. Pour l’instant, les triplets déclarés avec le vocabulaire BIO et le vocabulaire FRBRoo sont dans des fichiers prelib.ttl séparés, mais cela n’exclut pas par la suite l’utilisation combinée des deux vocabulaires.

Dans les fichiers prelib.ttl publiés sur GitHub Gist des codes de langue (language tags) ont été rajoutés sur tous les littéraux en se servant du formulaire de recherche de la page de l’ISO 639-6 sur geolang.org (champ de recherche Language Reference Name).

Saisie du décès de Théodore et de ses années collège avec BIO

Dans la version BIO de prelib.ttl, les triplets de la date et du lieu de décès de Théodore ont été rajoutés ainsi que ses études au collège des Jésuites de Keranna à Quimper entre 1825 et 1826.

BIO permet de déclarer des bio:Interval (les années d’études de Théodore au collège des Jésuites de Keranna correspondent à la ressource http://prelib.huma-num.fr/interval/1) bornées par des bio:Event (les ressources http://prelib.huma-num.fr/event/3 et http://prelib.huma-num.fr/event/4 correspondant à sont entrée en 1825 et à sa sortie en 1826 du collège). Les informations spatio-temporelles sont rattachées aux bio:Event.

Si une autre personne rentre au même moment au collège des jésuites de Keranna, faut-il créer une nouvelle ressource de type bio:Enrolment ou rattacher la personne au même événement ? Vous ne trouverez pas la réponse dans la documentation du vocabulaire BIO mais dans le schéma du vocabulaire1 où il est indiqué que la propriété bio:principal liant la personne à l’événement a une cardinalité de 1 pour les ressources de type bio:IndividualEvent (dont bio:Enrolment est une sous-classe). En d’autres termes, il ne peut y avoir qu’une seule personne liée par la propriété bio:principal à un événement de type bio:Enrolment. Il faut donc bien créer autant d’événements de type bio:Enrolment que de personnes qui seraient rentrées au collège des Jésuites de Quimperlé la même année que Théodore.

Le collège des Jésuites correspond à la ressource http://prelib.huma-num.fr/organization/1 de type foaf:Organization où le nom de l’établissement a été saisi avec dc:title et foaf:name. Mais cette saisie ne permet pas de tenir compte des éventuels changement de nom ni de statut de l’établissement ni de ses divers lieux d’enseignement. Comment modéliser par exemple l’histoire mouvementée des Écoles normales supérieures ? L’École normale supérieure de l’enseignement primaire de Fontenay-aux-Roses créée par Jules Ferry en 1880 et École normale supérieure de Fontenay-Saint-Cloud doivent-elle être représentées par la même ressource ou par des ressources différentes mais liées entre elles (de quelle manière) ?

Petite remarque en aparté : L’idée sous-jacente à la saisie des études est de savoir si des personnes ont fréquenté les mêmes lieux de sociabilité. Mais une proximité spatio-temporelle n’est pas suffisante pour attester d’une relation. Dans le cas d’études, des documents tels qu’une thèse ou des devoirs en groupe seraient des preuves plus tangibles d’une relation (de professeur à étudiant ou entre étudiants).

Les multiples implémentations de FRBR pour le web sémantique

Plus j’explore l’utilisation de FRBR pour la base de donnée, plus je m’aperçois qu’il en existe de multiples implémentations en RDFS ou dans les différentes versions de OWL2. Voici celles que j’ai trouvées jusqu’à présent :

Implémentations de FRBRER (entité-relation)

– La version de l’IFLA : http://iflastandards.info/ns/fr/frbr/frbrer/
– La version RDFS de Ian Davis (auteur également du vocabulaire BIO) : http://purl.org/vocab/frbr/core et http://purl.org/vocab/frbr/extended
– La version OWL 2 DL de Paolo Ciccarese et Silvio Peroni3 qui fait référence à la version de Ian Davis : http://purl.org/spar/frbr

Implémentations de FRBRoo (orienté objet, version dérivée de CIDOC-CRM)

– La version RDFS de la dernière version de FRBRoo (version 2.1 du modèle) édité par le groupe de travail du groupe de travail CRM-FRBR : voir en haut de la page http://www.cidoc-crm.org/frbr_drafts.html
– La version de l’IFLA : http://iflastandards.info/ns/fr/frbr/frbroo/
– La version OWL DL de l’Université d’Erlangen (version 1.0.2 du modèle) : http://erlangen-crm.org/efrbroo

Sur la page Vocabulaires du web sémantique sur le site de la BnF on trouve également un lien vers la page The FRBR Vocabularies de l’IFLA. Pas facile de s’y retrouver dans tout ça…

  1. Je mets en lien la version du schéma publié par Ian Davis sur GitHub pour faciliter sa lecture. []
  2. Pour tenter d’y voir clair dans les différentes versions de OWL, lire Difference between OWL Lite, DL, and Full. []
  3. Silvio Peroni a également développé le web service LODE permettant de créer une documentation web d’une ontologie OWL. []

Sémantiser une base de données relationnelle (2ème épisode)

Ce billet est le deuxième épisode d’une série de billets sur la sémantisation d’une base de données relationnelle des auteurs de langue bretonne issue du projet PRELIB.

Corrections et améliorations

Depuis le dernier billet, Patrick Le Boeuf de la BnF m’a apporté quelques précisions sur le modèle CIDOC-CRM et Gabriel Kepeklian d’Atos m’a aidé à connecter une copie locale de ma base de données à DataLift1. Je vous conseille à ce propos la lecture de How to import an SQL database? Si vous avez des difficultés pour utiliser DataLift ou si vous voulez signaler votre utilisation de l’outil, n’hésitez pas à le faire sur la liste de diffusion du projet DataLift. J’ai également réalisé en discutant avec mon collègue Fañch Postic qui connait très bien Théodore, que je n’avais pas très bien interprété l’écriture manuscrite de l’acte de naissance de ce dernier puisque le nom de famille de la mère de Théodore Hersart de la Villemarqué est Feydeau et non pas Kerjean, plus précisément Feydeau de Vaugien2.

Pour revenir aux exemples précédents de triplets en Turtle, j’ai un doute sur la validité des URI des classes et des propriétés du CIDOC CRM. J’avais supposé que l’URI de P96 by mother par exemple, était http://www.cidoc-crm.org/cidoc-crm/by_mother mais il s’avère que c’est plutôt http://www.cidoc-crm.org/cidoc-crm/P96_by_mother. Je modifie les triplets de l’accouchement http://prelib.huma-num.fr/event/1 en conséquence. J’en profite également pour corriger les URI préfixées. En effet, les URI prelib:event/1 ou prelib:person/1115 ne sont pas valides : Le / n’est pas reconnu après les préfixes. J’ai donc remplacé le préfixe prelib: par les préfixes event: et person:

@prefix person: <http://prelib.huma-num.fr/person/> .
@prefix event: <http://prelib.huma-num.fr/event/> .
@prefix cidoc: <http://www.cidoc-crm.org/cidoc-crm/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix dc: <http://purl.org/dc/terms/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

event:1 a cidoc:E67_Birth ;
cidoc:P98_brought_into_life person:80 ;
cidoc:P96_by_mother person:1115 ;
cidoc:P97_from_father person:1114 ;
cidoc:P1_is_identified_by _:date1 .

_:date1 a cidoc:E50_Date ;
rdfs:label “1815-07-07″^^xsd:date .

J’ai rajouté un triplet concernant le père de Théodore, Pierre Hersart de la Villemarqué (person:1114) car j’avais mal interprété l’utilisation de P97 from father. Comme me l’a expliqué Patrick Le Boeuf, cette propriété sert à désigner le père biologique et peut être utilisée même si celui-ci n’a pas assisté à l’accouchement.

Saisie du lieu de naissance

Modélisation des informations sur une personne aec le modèle CIDOC CRM. Source : http://www.cidoc-crm.org/cidoc_graphical_representation_v_5_1/person_nationality.html.
Modélisation des informations sur une personne aec le modèle CIDOC CRM. Source : http://www.cidoc-crm.org/cidoc_graphical_representation_v_5_1/person_nationality.html.

Comment saisir le lieu de naissance, c’est à dire la ville de Quimperlé ? D’après le schéma publié sur le site du CIDOC CRM et reproduit ci-dessus, il faut créer une ressource E53 Place que l’on lie à l’accouchement par la propriété P7 took place at. On crée donc une nouvelle ressource http://prelib.huma-num.fr/place/1 et on déclare à cette URI les triplets suivants :

@prefix place: <http://prelib.huma-num.fr/place/> .
@prefix cidoc: <http://www.cidoc-crm.org/cidoc-crm/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

place:1 a cidoc:E53_Place ;
rdfs:label “Quimperlé″ .

Cependant, le CIDOC-CRM incite à saisir les dénominations dans des classes dédiées afin de relater leur évolution dans le temps (par exemple, Lutèce qui devient Paris). E48 Place Name, sous-classe de E44 Place Appellation, semble la mieux indiquée dans notre cas3. Je pourrai créer une nouvelle ressource http://prelib.huma-num.fr/appellation/1 de type E48 Place Name mais je ne sais pas si celle-ci sera utilisée pour un autre usage que l’appellation de http://prelib.huma-num.fr/place/1, je me contente donc pour l’instant d’une ressource anonyme (ou blank node en anglais).

@prefix place: <http://prelib.huma-num.fr/place/> .
 @prefix cidoc: <http://www.cidoc-crm.org/cidoc-crm/> .
 @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

place:1 a cidoc:E53_Place ;
cidoc:E87_is_identified_by _place_name .

_place_name a cidoc:E48_Place_Name ;
rdfs:label “Quimperlé″ .

On peut maintenant compléter les triplets de l’accouchement avec une référence à Quimperlé :

@prefix person: <http://prelib.huma-num.fr/person/> .
@prefix event: <http://prelib.huma-num.fr/event/> .
@prefix place: <http://prelib.huma-num.fr/place/> .
@prefix cidoc: <http://www.cidoc-crm.org/cidoc-crm/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix dc: <http://purl.org/dc/terms/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

event:1 a cidoc:E67_Birth ;
cidoc:P98_brought_into_life person:80 ;
cidoc:P96_by_mother person:1115 ;
cidoc:P97_from_father person:1114 ;
cidoc:P1_is_identified_by _:date1 ;
cidoc:P7_took_place_at place:1 .

_:date1 a cidoc:E50_Date ;
rdfs:label “1815-07-07″^^xsd:date .

Retour sur la date de l’accouchement

Je ne suis toujours pas convaincu de cette saisie de la date de l’accouchement. Or, on trouve l’information suivante dans le commentaire au début du fichier http://www.cidoc-crm.org/rdfs/cidoc_crm_v6.0-draft-2015January.rdfs :

8. CRM time extension 1.0 Encoded in RDFS
Since the Time Primitive of the CRM can not directly be implemented in RDF Triple Stores, we define in this extension of 4 properties replacing P81 and P82 adequately using xsd:dateTime.
Property P81 is dedicated for modeling the Time-Span’s maximum known temporal extent i.e. ongoing_throughout. Property P82 is for modeling the minimum outer bounds of events i.e. at_some_time_within. P81 has its time interval redefined by P81a and P81b. Similarly, we redefine P82 by P82a and P82b.

Visiblement, cette implémentation en RDFS par le FORTH-ICS4 a nécessité la création de quatre propriétés RDF P81a_end_of_the_begin, P81b_begin_of_the_end, P82a_begin_of_the_begin et P82b_end_of_the_end qui sont les seules propriétés permettant explicitement la saisie de dates au format ISO 6801 (elles ont toutes les quatre pour portée (range en anglais) http://www.w3.org/2001/XMLSchema#dateTime) .

A y regarder de prêt, il semblerait que toute information temporelle est de facto une durée dont il faut saisir la date de début et la date de fin. Cela vient du fait que les concepteurs du modèle considèrent que les données temporelles sont forcément floues (fuzzy en anglais)5 et qu’ils ont voulu introduire la possibilité d’utiliser l’algèbre des intervalles d’Allen pour déduire la chronologie d’événements6.

Cela dit, dire que Théodore est né le 7 juillet 1815 signifie qu’il est né entre le 7 juillet à 0 heure et le 7 juillet à minuit… Toute « date » est en soit une durée. Mais il faut tout de même avouer que cela complique un peu la saisie.

Expression des données avec le vocabulaire BIO

Comment les mêmes informations pourraient-elles être exprimées avec le vocabulaire BIO du développeur anglais Ian Davis suggéré par Gautier Poupeau ? A la fin de la documentation de BIO, Ian Davis a illustré le vocabulaire par des données biographiques sur le roi d’Angleterre Henry VIII exprimées en RDF dont voici un extrait :

@prefix bio: <http://purl.org/vocab/bio/0.1/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

_:henryviii
  a foaf:Person
  ; foaf:name "Henry VIII, King of England"
  ; bio:father _:henryvii
  ; bio:mother _:elizplantagenet
  ; bio:child _:child1, _:child2, _:child3, _:child4, _:child5, _:child6, _:child7, _:child8
  ; bio:birth _:birth
  ; bio:death _:death
  ; bio:event _:burial, _:accession, _:coronation, _:marriage1
            , _:marriage2, _:marriage3, _:marriage4, _:marriage5, _:marriage6
  .

_:henryvii
  a foaf:Person
  ; foaf:name "Henry VII Tudor, King of England"
  ; bio:child _:henryviii
  .

_:elizplantagenet
  a foaf:Person
  ; foaf:name "Elizabeth of York"
  ; bio:child _:henryviii
  .
  
_:birth
  a bio:Birth
  ; rdfs:label "The birth of Henry VIII to Henry VII and Elizabeth Plantagenet on 28 June 1491"
  ; bio:date "1491-06-28"
  ; bio:place <http://dbpedia.org/resource/Palace_of_Placentia>
  ; bio:parent _:henryvii, _:elizplantagenet
  ; bio:principal _:henryviii
  .

_:death
  a bio:Death
  ; rdfs:label "The death of Henry VIII on 28 January 1547"
  ; bio:date "1547-01-28"
  ; bio:place <http://dbpedia.org/resource/Palace_of_Whitehall>
  ; bio:principal _:henryviii
  .

Je me suis largement inspiré de cet exemple à la seule différence que j’ai évité l’utilisation de ressources anonymes.

Les triplets associés à Théodore pourraient devenir :

@prefix person: <http://prelib.huma-num.fr/person/> .
@prefix event: <http://prelib.huma-num.fr/event/> .
@prefix place: <http://prelib.huma-num.fr/place/> .
@prefix cidoc: <http://www.cidoc-crm.org/cidoc-crm/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix dc: <http://purl.org/dc/terms/> .
@prefix bio: <http://purl.org/vocab/bio/0.1/> .

person:80 a cidoc:Person, foaf:Person ;
dc:title "Théodore-Claude-Henri Hersart de la Villemarqué (1815-1895)"@fr ;
foaf:name "Théodore-Claude-Henri Hersart de la Villemarqué"@fr ;
foaf:givenName "Théodore Claude Henri" ;
foaf:familyName "Hersart de la Villemarqué" ;
foaf:nickname "Barz Nizon", "Kervarker";
foaf:gender "male"@en, "homme"@fr ;
bio:birth  event:1 .

Et les triplets de l’accouchement deviennent :

@prefix person: <http://prelib.huma-num.fr/person/> .
@prefix event: <http://prelib.huma-num.fr/event/> .
@prefix place: <http://prelib.huma-num.fr/place/> .
@prefix cidoc: <http://www.cidoc-crm.org/cidoc-crm/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix dc: <http://purl.org/dc/terms/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix dbpedia: <http://dbpedia.org/resource/> .

event:1 a bio:Birth ;
rdfs:label "Naissance de Théodore-Claude-Henri Hersart de la Villemarqué le 7 juillet 1815 à Quimperlé"@fr ;
bio:date "1815-07-07"^^xsd:date ;
bio:place dbpedia:Quimperl%C3%A9 ; # Voir http://www.dbpedia.org/resource/Quimperl%C3%A9
bio:parent person:1115 , person:1114 ;
bio:principal person:1 .

On perd la distinction du père et de la mère du CIDOC CRM mais les informations sur la date et le lieu sont plus faciles à saisir. Notamment pour le lieu, il est possible de ne saisir non pas une valeur littérale mais l’URI d’une ressource qui permette de désambiguïser l’information et de récupérer des informations saisies par ailleurs7. Après, je ne dis pas que cela n’est pas possible avec le CIDOC CRM, je n’ai peut-être pas encore compris comment procéder. Toujours est-il que la propriété bio:place n’a pas de portée (range) et n’impose donc pas de valeur particulière à l’objet d’un triplet dans lequel la propriété est utilisée.

Pour signifier Quimperlé, j’ai suivit l’exemple de la biographie d’Henry VIII et j’ai utilisé DBpedia en anglais, mais j’aurais tout aussi bien pu utiliser DBpedia en français, voire un référentiel géographique (gazetteer en anglais) tel que Getty Thesaurus of Geographic Names et faire la déclaration suivante :

@prefix person: <http://prelib.huma-num.fr/person/> .
@prefix event: <http://prelib.huma-num.fr/event/> .
@prefix place: <http://prelib.huma-num.fr/place/> .
@prefix cidoc: <http://www.cidoc-crm.org/cidoc-crm/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix dc: <http://purl.org/dc/terms/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix tgn: <http://vocab.getty.edu/tgn/> .

event:1 a bio:Birth ;
rdfs:label "Naissance de Théodore-Claude-Henri Hersart de la Villemarqué le 7 juillet 1815 à Quimperlé"@fr ;
bio:date "1815-07-07"^^xsd:date ;
bio:place tgn:7009459 ; # Voir http://vocab.getty.edu/tgn/7009459
bio:parent person:1115 , person:1114 ;
bio:principal person:1 .

Bon, ce n’est pas tout de faire des tests de vocabulaires, mais il faudrait faire quelques premières requêtes en SPARQL pour les évaluer. Pour cela rien de tel qu’un triple store tel que Sesame RDF que vous pouvez installer en suivant les instructions de Thomas Francart. La suite au prochain épisode…

  1. Par copie locale, j’entends une copie de ma base de données installée sur mon ordinateur avec la plateforme de développement web EasyPHP. []
  2. Source : Ces Quimperlois(es) qui ont fait l’histoire (Jacques Gouriou, Alain Pennec, Fañch Postic), Amis de l’abbaye Sainte-Croix de Quimperlé / Société d’Histoire de Kemperle, décembre 2007. []
  3. Notez que la notion de sous-classe est indiquée dans le graphique ci-dessus par des doubles flèches. []
  4. Le FORTH Institute of Computer Science est un institut d’informatique grec où travaille Martin Doerr, un des co-rédacteurs du manuel de référence du CIDOC CRM []
  5. Voir à ce sujet la discussion Start/End vs Period of Existence sur le site officiel du CIDOC CRM. []
  6. Voir le chapitre 6 « Example » de Deducing Event Chronology in a Cultural Heritage Documentation System où l’on trouve un exemple de déduction de la date de construction d’une église à partir de la date à laquelle ont été approuvés les plans et la date d’un mariage célébré dans cette église. []
  7. L’intérêt de passer par des ressources externes sera plus évidente quand on fera des requêtes en SPARQL. []