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. []

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *