00:07Il y a un parti pris fort dans l'architecture de Garance,
00:10c'est que Garance, ce n'est pas une application qui diffuse des données,
00:14c'est une chaîne de production de documents.
00:17En fait, on pré-génère, on pré-calcule toutes les pages de notice
00:23des entités d'agents et de lieux qu'a décrites Florence plus tôt,
00:27afin de produire un ensemble de pages, un site web statique
00:32qui est ensuite diffusé via un simple serveur.
00:36Donc ça, c'est un parti pris très fort.
00:40C'est ce qu'on voit ici sur ce petit diagramme
00:42qui va me servir de fil conducteur sur la partie technique.
00:45On part des données de notice en RDF qui sont là-haut,
00:48on part aussi de contenu éditorial,
00:50parce qu'il y a une partie éditoriale en Garance pour donner du contexte,
00:53et puis on prend aussi l'ontologie Rico qui a été mentionnée,
00:56et on génère un ensemble de pages.
00:58Donc on va générer les notices, on va générer les fichiers de téléchargement,
01:01on va générer les pages éditoriales,
01:03et on va même générer des index qui permettent de rechercher à l'intérieur de Garance.
01:07Et tout ça, c'est un ensemble de documents statiques
01:09qu'il suffit de poser sur un serveur.
01:11Il y a aussi dans Garance une partie plus dynamique
01:14qui va s'appuyer sur la base de graphes Clever
01:19dans laquelle on est venu charger les mêmes fichiers de données.
01:24Donc voilà, c'est Garance, c'est un site statique
01:26couplé à cette base RDF SparkQL.
01:29Il n'y a pas de serveur applicatif pour naviguer dans les pages,
01:32c'est seulement un serveur de fichiers.
01:34Donc on est vraiment sur une approche documentaire,
01:36on vient générer des documents, on vient générer des pages HTML.
01:40Alors bien sûr, quand on veut interroger en SparkQL,
01:43il faut avoir la base disponible et accessible dynamiquement,
01:48mais c'est une partie qui est découplée du site lui-même,
01:50qui n'est pas un prérequis.
01:52Les avantages et les inconvénients de ça, c'est quoi ?
01:54Donc les avantages de cette approche-là,
01:55c'est un avantage de performance.
01:58Les pages, les documents qu'on a produits
02:00sont renvoyés dans les navigateurs
02:03qui les demandent sans calcul.
02:04On renvoie juste le document.
02:06Ça, c'est intéressant pour l'optimisation des moteurs de recherche.
02:09Puisque les pages sont très rapides à charger.
02:11Il y a des avantages de sécurité,
02:13parce qu'il n'y a pas ou il y a moins de possibilités
02:15de failles de sécurité,
02:15parce qu'il n'y a pas de serveur applicatif.
02:18Il n'y a pas d'application.
02:19Il y a des avantages en termes de robustesse et de coût,
02:21parce qu'il n'y a pas de maintenance à prévoir,
02:23ou simplement la maintenance d'un serveur web
02:24qui est plutôt facile.
02:26Et il y a moins de risque de panne.
02:28Et puis il y a des avantages en termes de possibilités d'archivage,
02:31parce que l'ensemble de ces documents,
02:32l'ensemble de ces pages de notice,
02:34peut être archivé comme un tout.
02:36Ça forme un ensemble documentaire.
02:38Alors il y a des inconvénients aussi à cette approche-là.
02:40Il y a des inconvénients sur la fraîcheur des données,
02:42puisqu'on n'a pas de mise à jour en temps réel
02:44par rapport aux notices.
02:45Il faut régénérer le site.
02:47Là, ce n'est pas tellement un souci,
02:49parce que les données sont relativement statiques.
02:51Elles bougent peu dans le temps.
02:53Mais ce ne serait pas pareil sur des données
02:55qui seraient plus dynamiques.
02:59C'est du tout ou rien.
03:00Quand on republie,
03:01on republie l'ensemble des sites
03:02et l'ensemble des pages,
03:03seulement si une partie a changé.
03:07Il y a des inconvénients sur la partie plus technique,
03:10qui s'appelle la négociation de contenu.
03:11La négociation de contenu,
03:12c'est le fait de renvoyer soit la page
03:15qui peut s'afficher dans le navigateur,
03:17soit un fichier technique,
03:19le fichier RDF qui contient les données brutes,
03:22parce que le fichier de données brutes,
03:24il faut aussi le pré-générer.
03:26Ce qui n'est pas tellement un problème aussi ici,
03:29puisque ces fichiers individuels existent déjà
03:32comme des fichiers individuels
03:33et donc on peut s'appuyer dessus.
03:35La complexité par rapport à une application dynamique
03:38est identique.
03:39La complexité ne disparaît pas.
03:41C'est simplement que la logique de génération des documents
03:44est déportée dans la chaîne qui pré-génère le site
03:47et pas calculée à la volée
03:50au moment de l'affichage de la page.
03:52Cette chaîne de génération de sites,
03:54qui est la partie la plus...
03:54là où il y a le plus d'intelligence là-dedans,
03:57elle est ici dans mon petit diagramme,
03:58en fait, elle se séquence comme ça.
04:02On part des 75 000 fichiers RDF,
04:05environ 75 000,
04:06plus des fichiers de relations,
04:08plus quelques autres fichiers,
04:10et on vient lire l'ensemble de ces fichiers
04:14qu'on remet dans un seul grand fichier
04:17qui contient tout ce graphe d'entités
04:19dans lequel on va avoir les relations
04:22entre les agents, les lieux
04:23et les vocabulaires contrôlés.
04:24On met tout ça dans un seul grand fichier
04:27qui va être sérialisé dans un format
04:29qui s'appelle JSON-LD.
04:30Et puis ce grand format qui est une liste à plat,
04:33c'est une liste à plat d'entités,
04:34on vient le hiérarchiser.
04:36Donc on passe d'une structure de graphe
04:38à une structure d'arbres.
04:39Et donc là, on va dire comment on veut
04:42que les informations se structurent
04:44en termes arborescentes.
04:46On va dire qu'on veut certaines propriétés
04:47au premier niveau,
04:48puis qu'on va inclure les relations dedans,
04:49puis qu'on va inclure les références
04:51au vocabulaire contrôlé, etc.
04:52Donc là, on vient définir
04:55comment on veut que ces documents,
04:58comment on veut que ces pages se structurent.
05:01Et donc on fait ça séparément
05:03pour les agents d'un côté,
05:05les lieux de l'autre,
05:05et les vocabulaires dans une troisième partie.
05:08Et donc là, on a une sérialisation
05:11JSON arborescente contrôlée.
05:13Et ça, ça se fait à partir d'une technique
05:15qui s'appelle le JSON-LD framing.
05:17Donc on gardera un petit fichier de spécification
05:20de comment on dit ça.
05:22Et puis à partir de ces fichiers hiérarchisés,
05:26on vient ensuite générer les pages.
05:27Donc la génération des pages proprement dites
05:29arrive ici, en plus des comptes méditoriaux
05:33et de l'ontologie.
05:34Et on s'appuie pour ça sur un outil
05:35qui s'appelle Eleventy,
05:37qui est un générateur de sites statiques.
05:39Et on vient produire en sortie
05:4075 000 pages HTML environ.
05:43Et les relations, par exemple,
05:46les entités de relations RICO,
05:48sont incluses dans les pages des agents
05:51ou des lieux qui référencent ces entités.
05:54Également, les libellés sont aussi inclus,
05:57sont comme des sous-sections,
05:58on va le voir juste après,
05:59des sous-sections dans ces pages.
06:01Cette technique de framing,
06:03qui permet de contrôler, de sérialiser,
06:06de produire des documents à partir de graphes,
06:08c'est un standard, W3C,
06:10ce n'est pas quelque chose qu'on a inventé.
06:12C'est un langage de sérialisation déclaratif.
06:15Donc, on vient spécifier, déclarer
06:17la façon dont on veut produire ces documents.
06:19On ne contrôle pas tout avec cette déclaration.
06:22On ne peut pas jouer sur tout.
06:24On ne peut pas vraiment tout à fait filtrer des valeurs.
06:27Des fois, on a envie de filtrer des choses,
06:28de ne pas montrer des choses.
06:30On n'a pas une complète liberté là-dessus.
06:33Donc, ça veut dire qu'on a aussi
06:34des pré-traitements sur les fichiers
06:37qui viennent les nettoyer
06:39ou enlever certaines choses.
06:41On ne contrôle pas non plus l'ordre des valeurs
06:43puisqu'il s'agit de structure JSON
06:45et dans les JSON, on n'a pas de notion d'ordre.
06:48Donc, l'ordre de ce qui s'affiche à l'écran
06:50est contrôlé par d'autres fichiers de configuration.
06:54Sans rentrer dans les détails,
06:57ces déclarations de framing
07:00pour les agents ressemblent à des fichiers comme ça.
07:03Donc là, on dit que ça va s'appliquer
07:04à tous les reco-agents.
07:06Et puis, dans tous les reco-agents,
07:07voilà toutes les propriétés qu'on va vous inclure
07:09dans ces documents,
07:10les reco-identifiers,
07:12les names,
07:13les agent names,
07:14autorised by,
07:14et puis, par exemple,
07:15les other ad corporate body type.
07:17Et là, on a une sous-section
07:19qui me dit,
07:20dans les other ad corporate body type,
07:22on dit,
07:23tu ne me mets pas cette section
07:25s'il n'y a pas de valeur.
07:26tu ne me prends que
07:29que le scope-pref label
07:30que j'ai indiqué ici
07:31et tu vas toujours m'imbriquer
07:35cette partie-là
07:36hiérarchiquement en dessous.
07:39Et donc,
07:40ce qu'on va obtenir en repas,
07:41c'est un fichier season,
07:41on va voir ces entrées,
07:43rico,
07:43other ad corporate body type,
07:45la référence
07:46à l'identifiant
07:47dans le vocabulaire contrôlé,
07:48et puis le libellé correspondant,
07:50ici,
07:50service d'administration centrale,
07:51qui sera celui qui sera affiché à l'écran
07:53dans les pages de documents.
07:55Ensuite,
07:56la génération des pages de documents,
07:58en fait,
07:59utilise deux techniques.
08:01On a une mise en forme
08:03complètement générique
08:03qui va simplement reprendre
08:05la structure des données
08:06et on a des mises en forme spécifiques
08:08qui sont appliquées
08:09sur les vocabulaires contrôlés.
08:12Les mises en forme génériques,
08:13en fait,
08:14elles sont composées,
08:14et vous le verrez tout de suite après
08:15dans la démo,
08:17elles sont composées
08:18d'une entête de métadonnées
08:19avec les identifiants.
08:21Donc, cette entête de métadonnées
08:22qui comprend la date de dernière mise à jour,
08:25les liens d'équivalence,
08:26les liens vers la salle d'inventaire virtuelle,
08:28la salle de lecture virtuelle,
08:30en fait,
08:30ont été isolées dans un fichier à part
08:32et donc,
08:32à partir de ce fichier,
08:33on génère la partie en tête.
08:34Et puis,
08:34on a la partie de corps de page
08:36où on reprend tous les attributs
08:39de l'entité dans le graphe,
08:42mais pas seulement,
08:43puisque vous voyez
08:44qu'on a parfois des relations
08:45qui sont des sous-blocs.
08:46Donc,
08:47on a la cible de la relation,
08:48puis on a un sous-bloc
08:49qui est la relation elle-même
08:53avec la date de début,
08:55la date de fin de la relation
08:56et une note associée.
08:58Et puis,
08:59qui contient encore un autre sous-bloc.
09:00Donc,
09:00on a une indentation
09:01à plusieurs niveaux de profondeur.
09:03On n'a pas que les liens directs dans le graphe.
09:05L'ordre d'affichage de tout ça
09:07et des informations de style spécifique,
09:10par exemple,
09:11le fait d'avoir ces listes de type d'occupation
09:14comme une liste horizontale
09:16sont contrôlées par un fichier de configuration
09:18qui nous permet de dire,
09:20qui nous permet un peu de déterminer
09:23comment vont s'afficher certains types d'attributs.
09:28Je passe rapidement là-dessus.
09:31L'idée,
09:31c'est que cette mise en forme générique,
09:33elle soit vraiment pour l'humain,
09:36entre guillemets.
09:38L'idée,
09:39c'est de la rendre la moins technique possible,
09:40même si il y a une technicité
09:40dans le graphe RDF sous-jacent.
09:44L'idée,
09:45c'est de ne pas montrer cette technicité.
09:47Donc,
09:47il n'y a aucun identifiant technique
09:48irrévisible
09:49ou vraiment le moins possible.
09:51On a des notices riches
09:52avec du contexte à plusieurs niveaux.
09:54On a des mises en forme spécifiques
09:56qui nous permettent
09:57d'avoir un affichage sympathique,
09:58y compris avec des affichages cartographiques
10:00que vous verrez dans la démo,
10:01je pense.
10:03à comparer avec d'autres solutions existantes
10:05qui n'offrent pas du tout
10:08ce même genre d'avantages.
10:10Les affichages spécifiques
10:12pour les vocabulaires contrôlés,
10:13là,
10:13je passe rapidement,
10:14vous les verrez aussi dans la démo,
10:15mais on a des sections dans les pages
10:17où on va retrouver
10:18l'entrée dans le vocabulaire contrôlé,
10:21son information de hiérarchie,
10:22ses synonymes,
10:23ses définitions,
10:24ses concepts plus spécifiques,
10:25ses renvois,
10:26ses alignements exacts,
10:27etc.
10:29Il y a une partie intéressante
10:32dans ce site statique,
10:33c'est que malgré le fait
10:35qu'on a simplement un ensemble de pages,
10:38on arrive tout de même
10:39à pouvoir rechercher,
10:40à pouvoir offrir
10:40des fonctionnalités de recherche
10:42dans ces ensembles de documents.
10:45Et c'est offert par un composant
10:46qui s'appelle PageFind,
10:47qui est un composant open source
10:48de création d'index de recherche
10:50sur des sites statiques.
10:52Ça veut dire quoi ?
10:53Ça veut dire que la recherche
10:53que l'on fait,
10:54elle est donc effectuée
10:55dans le navigateur.
10:56Côté client,
10:56il n'y a pas de serveur.
10:58Et malgré tout,
10:58on arrive à obtenir
10:59des capacités de recherche,
11:02y compris avec des facettes
11:03qui sont assez surprenantes.
11:06Le principe,
11:07c'est qu'une fois que l'ensemble
11:08de ces 75 000 documents
11:11a été fait,
11:13eh bien PageFind
11:14va reparcourir
11:15tous ces 75 000 documents
11:17et construire un index
11:18de recherche spécifique.
11:19Cet index,
11:20il est dirigé
11:21par des annotations particulières
11:22qu'on a été mettre
11:23dans les pages HTML.
11:25Quelle partie des documents
11:27doivent être indexées,
11:28quelles valeurs
11:29correspondent à des facettes
11:29de recherche,
11:30par exemple.
11:33PageFind,
11:33ensuite,
11:33il offre son propre,
11:35sa propre interface
11:36de recherche
11:37qu'on a déployée
11:39dans Garance.
11:40Le déploiement de tout ça
11:40est très simple,
11:41les recherches
11:42sont vraiment rapides
11:43pour quelque chose
11:44qui se fait côté client
11:45et la configuration
11:46était vraiment très aisée.
11:47Ça a été assez bluffant
11:49d'une façon générale.
11:51vous verrez aussi
11:52tout ça dans la démo,
11:53mais voilà à quoi ça ressemble.
11:54On a une zone de recherche
11:55où on vient taper
11:57le texte que l'on recherche,
11:59des filtrages à facettes
12:00ici en fonction
12:02des facettes
12:02que l'on a paramétré,
12:03les résultats de recherche,
12:05du surlignage
12:06du mot qu'on a cherché,
12:07des métadonnées
12:08supplémentaires
12:09sur chaque résultat.
12:10Ici, on voit
12:11des dates de naissance,
12:12des dates de décès
12:12et des types d'occupation.
12:16Et puis,
12:17il y a une partie
12:17de page HTML éditoriale
12:19dans ce site statique
12:21que vous verrez aussi
12:22simplement pour
12:23pointer le fait
12:24que dans ce contenu éditorial,
12:25on a aussi inséré
12:26des diagrammes
12:27dont le contenu
12:32et la répartition
12:33a été calculé
12:34à partir de l'analyse
12:35des données.
12:35Donc, on fait des calculs,
12:36on fait des requêtes
12:38sur le graphe
12:39pour pouvoir fournir
12:40les informations
12:41qui permettent
12:42de générer
12:43ces camemberts
12:43que vous allez voir.
12:46Un petit mot
12:47sur les performances
12:48de génération du site.
12:49La génération,
12:50c'est environ 75 000 pages,
12:52prend un peu plus
12:54de 40 minutes maintenant.
12:56Alors, 40 minutes,
12:56c'est à la fois peu,
12:57à la fois beaucoup.
12:59Dans ces 40 minutes,
13:00il y a une bonne partie,
13:02un bon quart d'heure,
13:04un petit quart d'heure ici
13:05qui s'est maintenant
13:05transformé en bon quart d'heure,
13:07qui est simplement
13:08la première étape
13:09de lecture des fichiers.
13:11Parce que,
13:12on a,
13:14là,
13:15on fait avec
13:17les capacités
13:18des bibliothèques
13:19de lecture
13:20de fichiers RDF
13:21qui sont un peu littéraires
13:23pour ce qu'on veut faire.
13:25Et du coup,
13:25ça prend beaucoup de temps.
13:26Donc, simplement,
13:27relire les fichiers
13:28nous prend une quinzaine
13:29de minutes.
13:30La génération des pages
13:31elle-même,
13:31nous prend neuf minutes.
13:33Donc, c'est pas beaucoup.
13:35Simplement,
13:36la production des pages,
13:37c'est vraiment,
13:39c'est pas la majeure partie
13:40du travail.
13:41Et puis,
13:42on a une autre partie
13:43du temps
13:43qui sont sur la construction
13:44de l'index de recherche
13:45et puis le transfert
13:46de ces fichiers
13:47vers le serveur final.
13:50Cette approche,
13:51donc voilà,
13:51elle a une certaine limite.
13:54il nous semble que c'est scalable
13:56jusqu'à 100 000 pages.
13:58Après, on arrive sur
13:59des nombres de pages
14:01où là,
14:02il faudrait se poser la question
14:04de savoir si un site statique
14:06continuait à être parti.
14:08On a rencontré
14:09des difficultés techniques
14:10dans cette mise en place.
14:12Donc, ces problèmes
14:12de performance
14:13sur la partie lecture,
14:15notamment liés
14:15à la manipulation
14:17de gros fichiers JSON
14:19avec vraiment des limites
14:20techniques bêtes
14:20dont je vous passe le détail.
14:23L'utilisation du visionnel
14:24des framings
14:24est intéressante
14:26par son approche déclarative
14:27parce que c'est que
14:28sur des fichiers de config
14:28mais ça ne permet pas
14:30de faire tout ce qu'on voudrait faire
14:31en termes de mise en forme
14:32des données.
14:34Et puis,
14:34on s'est confronté
14:35à un manque de robustesse
14:36des outils
14:38quand il s'est agi
14:39de débloquer
14:40la production de ces pages.
14:42C'était parfois compliqué
14:44de comprendre
14:44où étaient les problèmes
14:46ce qui nous a fait perdre
14:48un temps significatif
14:49sur le développement
14:51de tout ça.
14:54Et donc,
14:54parfois,
14:55aussi avec des variantes
14:57infimes dans les données
14:58où il pouvait manquer
14:59une information,
15:00ça peut faire planter
15:01la génération
15:02de toute ou partie du site.
15:04Un tout petit mot
15:05pour finir sur Qlever,
15:06la base
15:07qui sert
15:08d'interrogation des données.
15:10Qlever,
15:11c'est l'outil
15:11qui a été utilisé
15:13pour l'interrogation.
15:14C'est une base de graphes
15:15RDF récente
15:16optimisée
15:16pour les requêtes en lecture.
15:17Vous aurez les liens ici
15:18si vous voulez aller voir.
15:19C'est un outil open source
15:20qui est développé
15:21à l'Université de Fribourg.
15:23Il y a un mini-benchmark
15:24de comparaison
15:25de performances
15:26qui a été réalisé
15:27par le Lab
15:27à l'été 2025
15:28sur les données de garance
15:30entre GraveDB
15:31et Qlever
15:31qui a validé le fait
15:33que Qlever
15:34était performant
15:34escalable.
15:36Les résultats
15:37de ce benchmark
15:37sont disponibles
15:38sur demande
15:38au Lab des AN.
15:40L'installation
15:40et la maintenance
15:41de Qlever
15:41a été prise en charge
15:42par les sociétés
15:43Zazoco
15:43et donc
15:44la quantité
15:45de données chargées
15:45dedans
15:45a été mentionnée
15:46par Florent
15:47c'était 16,5 millions
15:48de triplés.
15:49C'est parti.
Commentaires