Ces billets sont la seconde partie d’une trilogie consacrée au projet Sudoc21. Ils reviennent sur les enjeux de la modélisation des données posés dans le premier billet, et sur la manière dont l’équipe en charge du projet s’y est confrontée.
-
- Nom de code Sudoc21
- Les données en diptyque
- 2- 1 Le noyau de la cerise ou la culture du pivot
- 2- 2 Exercice d’apagogie négative
- Retours sur l’exploration des solutions informatiques (billet technique)
Façonner un top-modèle…
Des silos au modèle commun
Pour rappel, les enjeux du projet Sudoc21 étaient d’expérimenter à la fois comment :
- “Désiloter” les différents types de données, aujourd’hui dispersés dans des environnements et formats qui ont du mal à se parler.
- Ouvrir la voie à leur migration vers le modèle IFLA-LRM en faisant le choix d’une instanciation commune de ce modèle à tous les types de données traitées. C’est ce modèle cible que nous évoquerons plus loin sous le raccourci “pot commun”.
Dans cette première partie consacrée aux données, il sera question des choix opérés par l’équipe pour l’instanciation du modèle et le passage par un format pivot pour leur conversion.
Pour ce faire, nous avons constitué des jeux de données représentatifs de chaque source. Puis, afin de rendre tangible l’articulation qui existe entre ces données et qui n’est aujourd’hui pas exploitable, nous avons sélectionné un sous-ensemble de ressources présentes à la fois dans le Sudoc, dans BACON et en base RDF auquel est venu s’ajouter un échantillon de métadonnées TEF pour les thèses.
Du modèle LRM à un modèle de données “LRMisées”
Des cas d’usages identifiés dès le début du projet (et dont certains sont listés dans le billet précédent) nous ont servi d’objectifs et d’illustrations à ce que devrait permettre la mise en cohérence des données qui s’ignorent dans l’écosystème actuel.
Cependant, pour pouvoir mettre à l’épreuve ce « pot commun », il fallait le remplir ! Une phase préalable d’appropriation et d’interprétation du modèle LRM, très conceptuel et abstrait, a donc été nécessaire. En partant des informations contenues dans les divers formats sources, il s’agissait de trouver à quelle entité appartenaient telles informations provenant de tel format source. Puis, quelles relations cette entité entretient-elle avec telles autres entités.
Les travaux réalisés en décembre 2018 lors d’un séminaire interne consacré à la modélisation nous ont été précieux. Ils ont nourri notre réflexion et ont servi de base à nos schémas de modélisation.
Après quelques nouveaux essais graphiques dont nous vous ferons grâce ici, nous sommes parvenus à un modèle relativement clair et cohérent, mais toujours théorique.
Nous reviendrons dans la seconde partie de ce billet sur les quelques aménagements et extensions réalisés pour y parvenir. Nous sommes alors entrés dans le vif du sujet : comment transformer nos jeux de données selon nos choix d’implémentation du modèle LRM pour les charger dans les différents environnements que nous aurions à tester au fil des trois « Preuves de Concept « (POC) ?
…via un format « pivot »
Le pourquoi de ce format intermédiaire
La méthode technique s’est imposée d’elle-même. Les données sources étaient disponibles ou facilement convertibles en XML, et nous disposions au sein de l’équipe de compétences en XSL .
Dès lors, il ne restait qu’à trouver le meilleur processus de transformation des données natives. Il devait permettre à la fois de les réagencer selon le modèle cible et de les convertir dans les formats d’imports attendus par les bases de stockage à tester.
Les processus possibles :
1. Convertir chaque type de données source en modèle cible dans le format de chargement ad hoc,
2. Définir un format intermédiaire, pivot, fidèle à nos choix de modélisation et agnostique d’un point de vue technique puis le convertir dans les formats ingérables.
La solution 2, plus économique, s’est imposée : comme le montrent les illustrations ci-dessus, elle nécessite de développer moins d’XSLT : 7 contre 12 (de plus, le test d’un nouvel environnement de stockage entraînerait le développement d’un XSLT de conversion du format pivot vers son format d’import contre 4 avec la méthode 1).
Et surtout, au cours du processus de transformation, toutes nos données passant par un même format exprimé en XML, il était aisé de mettre à jour les 4 XSLT primitives (depuis les formats natifs vers le pivot) au fil des corrections et évolutions de notre modèle cible. Nous assurions ainsi le “versionning” et avions une bien meilleure visibilité sur la cohérence de nos conversions.
Le comment du format pivot
Nous avons élaboré un format XML “maison” libéré de toutes contraintes sémantiques liées au choix d’une syntaxe préexistante comme RDF/XML, et qui devait être un médium léger et générique pour nous permettre de décrire n’importe quoi. Cet “idiolecte” n’avait pas vocation à être partagé au-delà du projet et de ses membres, ainsi nous avons nommé les entités, les relations et leurs propriétés de la façon la plus transparente et explicite pour nous.
Nous attendions de ce format qu’il isole les informations dispersées issues des métadonnées natives afin que, telles des pièces de lego, elles puissent être réorganisées pour atteindre le modèle cible.
Nous sommes arrivés à cette recette simplissime : des entités, des relations et des identifiants pour lier le tout.
Exemple d’une notice de monographie du Sudoc, convertie en format pivot
<?xml version="1.0" encoding="UTF-8"?> <Wemi id="http://www.abes.fr/009034641/wemi"> <propriete nom="ID_EXTERNE">(OCoLC)489889268</propriete> <propriete nom="ID_EXTERNE">sib0328347</propriete> <propriete nom="META_NBMANIF">1</propriete> <!--- - - Oeuvre - - - - --> <Entite id="http://www.abes.fr/009034641/w"> <type lrm="OEUVRE">OEUVRE</type> <type>MONOGRAPHIE</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">009034641</propriete> <!--- - -propriétés niveau Oeuvre - - - - --> <propriete nom="LANGUE">anglais</propriete> <!--- - -relations niveau Oeuvre - - - - --> <relation xref="http://www.abes.fr/009034641/w/nomen/1"> <type>A_POUR_NOMEN</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> <!--- - -relation contributeur niveau Oeuvre - - - --> <relation xref="http://www.idref.fr/031590284"> <type>A_POUR_CONTRIBUTEUR</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ROLE">Editeur scientifique</propriete> </relation> <!--- - -relation contributeur niveau Oeuvre - - - --> <relation xref="http://www.idref.fr/031590292"> <type>A_POUR_CONTRIBUTEUR</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ROLE">Editeur scientifique</propriete> </relation> <!--- - - - relation(s) au(x) Expression(s) - - - - --> <relation xref="http://www.abes.fr/009034641/e"> <type>A_POUR_EXPRESSION</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> </Entite> <!--- - - - Expression(s) - - - - --> <Entite id="http://www.abes.fr/009034641/e"> <type lrm="EXPRESSION">EXPRESSION</type> <type>MONOGRAPHIE</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">009034641</propriete> <!--- - - propriété niveau Expression - - - - --> <propriete nom="LANGUE">anglais</propriete> <!--- - - -1 relation(s) au(x) Manifestation(s) - - - - --> <relation xref="http://www.abes.fr/009034641/m_1"> <type>A_POUR_MANIFESTATION</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> </Entite> <!--- - - -1 entite(s) Manifestation(s) - - - - --> <Entite id="http://www.abes.fr/009034641/m_1"> <type lrm="MANIFESTATION">MANIFESTATION</type> <type>IMPRIME</type> <type>MONOGRAPHIE</type> <!--- - -propriétés niveau Manifestation - - - - --> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">009034641</propriete> <propriete nom="NUM_MANIF">manifExemplaires - 1 manif(s)</propriete> <propriete nom="ANNEE_PUBLICATION">1990</propriete> <propriete nom="NOTES">Notes bibliogr. Index</propriete> <!--- - - Imprime et autres via 010 - - - --> <!--Proprietes specifiques de la manifestation 1--> <propriete nom="ISBN10">0-88318-645-4</propriete> <!--- - -relations niveau Manifestation - - - - --> <relation xref="http://www.abes.fr/009034641/m/nomen/1"> <type>A_POUR_NOMEN</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> <!--- - - - contributeur / mention niveau Manif - - - - --> <!-- valeur idMention relation : http://www.abes.fr/009034641/m/contexte/1--> <!--- - - - mention contributeur niveau Manif - - - - position : 1--> <relation> <type>A_POUR_MENTION</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <Entite id="http://www.abes.fr/009034641/m/contexte/1"> <type lrm="CONTEXTE">CONTEXTE</type> <type>CONTRIBUTION</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">009034641</propriete> <propriete nom="ROLE">Editeur commercial</propriete> <relation xref="http://www.abes.fr/009034641/m/contexte/1/contrib/nomen"> <type>A_POUR_MENTION_DE_CONTRIBUTEUR</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> </Entite> </relation> <!--- - - -relation(s) via 4XX - - - - --> <relation xref="http://www.abes.fr/009034641/m/410/1"> <type>EST_AGREGE_DANS</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="NUM_VOL">212</propriete> <bidon> <!-- passage d’infos pour un traitement postérieur des entités liées dans des zones de liens bibliographiques (4XX) sans ppn--> <lien>410</lien> <type>_AGREGATIVE</type> <titreBidon>AIP conference proceedings</titreBidon> <issnBidon>0094-243X</issnBidon> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="CITE_DANS">009034641</propriete> </bidon> </relation> <!--typeManif : manifExemplaires - - - - relation au(x) Item(s) via 930 - - - - --> <!-- EPN 638333318--> <relation xref="http://www.abes.fr/009034641/i/638333318"> <type>A_POUR_ITEM</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> </Entite> <!--- - - - Entite Item - - - - --> <Entite id="http://www.abes.fr/009034641/i/638333318"> <type lrm="ITEM">ITEM</type> <!--- - -propriétés niveau Item - - - - --> <propriete nom="CODE_PEB">u</propriete> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">009034641</propriete> <!--- - - relations niveau Item - - - - --> <!--- - - relation à la collectivité RCR détentrice via 930 $5 - - - --> <!-- - RCR en tant qu'agent (contributeur) : quel rôle : localisation, possesseur, dépositaire--> <relation xref="http://www.abes.fr/rcr/384212103"> <type>A_POUR_CONTRIBUTEUR</type> <propriete nom="ROLE">Possesseur</propriete> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> <!--- - - RCR en tant que fonds - - - --> <relation xref="http://www.abes.fr/rcr/384212103/fonds"> <type>FAIT_PARTIE_DE</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> </Entite> <!--- - - Entité RCR en tant qu'agent (établissement) - - - --> <Entite id="http://www.abes.fr/rcr/384212103"> <type lrm="AGENT">AGENT</type> <type>COLLECTIVITE</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">384212103</propriete> </Entite> <!--- - - Entité RCR en tant que fonds (ensemble, catalogue de documents) - --> <Entite id="http://www.abes.fr/rcr/384212103/fonds"> <type lrm="ENSEMBLE">ENSEMBLE</type> <type>FONDS</type> <relation xref="http://www.abes.fr/rcr/384212103"> <type>A_POUR_CONTRIBUTEUR</type> <propriete nom="ROLE">Possesseur</propriete> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">384212103</propriete> </Entite> <!--- - - - nomen titre de l'oeuvre - - - - --> <Entite id="http://www.abes.fr/009034641/w/nomen/1"> <type lrm="NOMEN">NOMEN</type> <type>TITRE</type> <propriete nom="TYPE_ACCES">ng</propriete> <propriete nom="VALEUR" >Accelerator instrumentation / [first Accelerator Instrumentation Workshop], Upton, NY, 1989 ; ed. Edward R. Beadle, Vincent J. Castillo</propriete> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">009034641</propriete> </Entite> <Entite id="http://www.abes.fr/009034641/m/nomen/1"> <type lrm="NOMEN">NOMEN</type> <type>TITRE</type> <type>TITRE_PROPRE</type> <propriete nom="TYPE_ACCES">ng</propriete> <propriete nom="VALEUR">Accelerator instrumentation</propriete> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">009034641</propriete> </Entite> <!--- - - - Relation 4XX niveau Oeuvre - - - - idSource : entite pointé citeDans : entite de départ --> <!--- Entite(s) Contributeur(s) niveau Oeuvre - Expression - Manifestation - Item- - - - --> <!-- valeur id entite nomen contrib : http://www.abes.fr/009034641/m/contexte/1--> <!--- - - - Entite NOMEN MENTION CONTRIBUTION niveau Manifestion - Item- - --> <Entite id="http://www.abes.fr/009034641/m/contexte/1/contrib/nomen"> <type lrm="NOMEN">NOMEN</type> <type>COLLECTIVITE</type> <propriete nom="TYPE_ACCES">ng</propriete> <propriete nom="VALEUR">American Institute of Physics</propriete> <propriete nom="ALPHABET">latin</propriete> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">009034641</propriete> </Entite> <!-- - - - - Entite AGENT AUTORITE niveau Oeuvre - Expression - Item- - - - --> <Entite id="http://www.idref.fr/031590284"> <type lrm="AGENT">AGENT</type> <type>PERSONNE</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">031590284</propriete> <propriete nom="CITE_DANS">009034641</propriete> <relation xref="http://www.idref.fr/031590284/nomen"> <type>A_POUR_NOMEN</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> </Entite> <!--- - - - Entite NOMEN AGENT AUTORITE niveau Oeuvre - Expression - Item- --> <Entite id="http://www.idref.fr/031590284/nomen"> <type lrm="NOMEN">NOMEN</type> <type>PERSONNE</type> <propriete nom="TYPE_ACCES">paa</propriete> <propriete nom="NOM">Beadle</propriete> <propriete nom="PRENOM">Edward R</propriete> <propriete nom="VALEUR">Beadle, Edward R</propriete> <propriete nom="ALPHABET">latin</propriete> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">031590284</propriete> <propriete nom="CITE_DANS">009034641</propriete> </Entite> <!-- - - - - Entite AGENT AUTORITE niveau Oeuvre - Expression - Item- - - - --> <Entite id="http://www.idref.fr/031590292"> <type lrm="AGENT">AGENT</type> <type>PERSONNE</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">031590292</propriete> <propriete nom="CITE_DANS">009034641</propriete> <relation xref="http://www.idref.fr/031590292/nomen"> <type>A_POUR_NOMEN</type> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> </relation> </Entite> <!--- - - - Entite NOMEN AGENT AUTORITE niveau Oeuvre - Expression - Item- - --> <Entite id="http://www.idref.fr/031590292/nomen"> <type lrm="NOMEN">NOMEN</type> <type>PERSONNE</type> <propriete nom="TYPE_ACCES">paa</propriete> <propriete nom="NOM">Castillo</propriete> <propriete nom="PRENOM">Vincent J</propriete> <propriete nom="VALEUR">Castillo, Vincent J</propriete> <propriete nom="ALPHABET">latin</propriete> <propriete nom="META_SOURCE">MARC</propriete> <propriete nom="META_ACTEUR">XSL Pivot</propriete> <propriete nom="ID_SOURCE">031590292</propriete> <propriete nom="CITE_DANS">009034641</propriete> </Entite> </Wemi>
Il est intéressant de noter que ce qui était une notice se trouve ainsi éclaté en pas moins de 14 entités (1 Oeuvre / 1 Expression / 1 Manifestation / 1 Item / 3 Agents / 5 Nomens + 1 Ensemble et 1 Contribution)
Affranchi de toute considération de formalisme, le pivot très souple, facile à modifier et à réutiliser, a trouvé rapidement sa syntaxe définitive.
Cette simplicité dans le mécanisme de manipulation des informations, nous a permis de nous concentrer sur notre objectif : une reconstruction conforme au modèle conceptuel LRM.
Restait donc à définir une instanciation capable de représenter tous les types de données présents dans notre pot commun. Comme chaque nouveau corpus apportait ses particularités à prendre en compte dans le processus de modélisation, le “format pivot”, notre médium, n’a cessé d’évoluer. Après de nombreuses itérations, alors que parallèlement s’égrènaient les trois POC, nous avons atteint la version stabilisée du modèle “LRMisé” cible et des XSLT du format pivot qui y est adossé.
Il n’est pas abusif de considérer la constitution du “pot commun” (modélisation et transformation des données) comme un projet dans le projet…
La documentation sur ces processus de transformation est disponible en ligne : https://github.com/abes-esr/abes-format-pivot
Du pot-pourri au pot commun
Les fichiers TEF des thèses et les fichiers KBart n’ont pas posé de difficultés. Les premiers, sont déjà structurés suivant les règles FRBR, Recommandation TEF (Thèses Électroniques Françaises). Les seconds, quant à eux, sont des fichiers tabulés très simples à manipuler.
Comme nous pouvions nous y attendre, la conversion des notices Unimarc a été plus consommatrice de temps et d’énergie. Elle a suscité de nombreux allers-retours, en raison de la complexité, de la richesse du format. Les fonctionnalités de statistiques et d’analyse de l’outil Catmandu nous ont aidé à sélectionner les champs et sous champs pertinents et représentatifs.
De plus, nous avons choisi de nous appuyer sur les notices de regroupement d’oeuvres créées par l’algoclc2 dans le cadre de l’expérimentation Sudoc FRBR : à chaque fois qu’une notice bibliographique était liée à une notice de regroupement (ou pré-notice d’Œuvre), celle-ci devenait la référence pour les informations du niveau Œuvre.
Les données d’articles et de chapitres en RDF ont été les dernières à remplir notre “pot commun”. Elles étaient déjà structurées suivant un modèle inspiré des règles FRBR, et avaient été obtenues par conversion en masse des métadonnées livrées dans le cadre des licences nationales et des projets ISTEX puis CollEx. Cependant la modélisation adoptée dans ce cadre s’est affranchie du niveau Expression et comporte un développement spécifique pour la représentation des affiliations des contributeurs (voir schéma).