Aller au contenu principal
Patrick Colm Audley

Patrick Colm Audley

Hacker · Full-Spectrum Technologist · Polymath

PurRDF 1.0 : un seul moteur RDF, un seul comportement, tous les langages

PurRDF 1.0.0 est disponible. C'est une boîte à outils RDF 1.2 écrite une seule fois sous la forme d'un noyau Rust conçu à partir de zéro, puis portée telle quelle vers Python, WebAssembly/JavaScript et C.

Le problème qui la justifie tient à une double fragmentation de l'outillage RDF. Entre les langages, chaque écosystème a son propre analyseur, avec ses propres bogues et son propre sous-ensemble de la spécification : déplacer un graphe d'un service Rust vers un pipeline Python puis vers un navigateur change silencieusement trois fois le sens des données. Dans le temps, RDF 1.2 — termes-triplets, réificateurs, littéraux à direction de base — est la révision courante de la norme, et presque aucune bibliothèque établie ne la porte.

Le moteur est donc implémenté une seule fois. Chaque crate publiée se compile pour wasm32-unknown-unknown, et le dépôt n'expose délibérément aucun feature flag Cargo : un porteur de données ne doit pas avoir de comportement optionnel.

Ce que je trouve le plus utile en pratique, c'est ce que cela retire d'une architecture. Les trois tâches qui maintiennent d'ordinaire une instance PostgreSQL à côté d'un triple store — recherche plein texte classée, prédicats spatiaux et similarité vectorielle — sont répondues à l'intérieur de PurRDF : dans le même processus, sur le même jeu de données, depuis la même requête SPARQL, sans seconde base ni tâche de synchronisation. Le classement plein texte est un BM25 en virgule fixe exacte, sans aucun flottant dans la crate. GeoSPARQL 1.1 lit la géométrie comme des rationnels exacts et décide chaque relation topologique sur un DE-9IM exact, sans GEOS ni PROJ. La recherche de plus proches voisins est exacte, non approchée. Les trois sont déterministes : les mêmes lignes, dans le même ordre, sur un serveur comme dans un onglet de navigateur — une garantie que la pile Postgres n'offre pas d'une machine à l'autre.

Également inclus : des codecs natifs pour neuf syntaxes, la canonicalisation RDFC-1.0, SPARQL 1.1/1.2 avec Update complet et une exécution gouvernée qui rend des réponses partielles certifiées plutôt qu'une réponse fausse, SHACL Core ainsi que SHACL-SPARQL et SHACL-AF, ShEx 2.1, des régimes d'inférence allant de RDFS et OWL 2 RL jusqu'à un tableau OWL 2 à sémantique directe — chaque clôture étant rendue avec un rapport de raisonnement, de sorte qu'une réponse incomplète ne puisse jamais être présentée comme complète — et le transport de graphes GTS en fichier unique.

Deux précisions honnêtes. D'abord, 1.0.0 n'est pas une version de fonctionnalités : c'est l'arbre de 0.13.0, republié sur les 21 crates via Trusted Publishing. Ce qui change, c'est l'engagement. À partir de 1.0.0, une rupture incrémente la version majeure, une version mineure est additive et une version corrective ne corrige que des bogues. Ensuite, l'ABI C est versionnée séparément et reste en 0.x ; le 1.0.0 du dépôt ne promet rien à son sujet. GTS atteint Rust, la ligne de commande, Python et C, mais n'est pas exposé par le paquet WebAssembly.

Chaque moteur est verrouillé par sa suite de tests officielle, figée dans le dépôt : 1 105 tests de validation shexTest sur 1 105, 129 sur 129 pour SHACL W3C, 862 tests d'évaluation SPARQL réussis, 264 aller-retours de syntaxe sur 264, et des vecteurs GTS multi-langages figés.

Il existe un bac à sable dans le navigateur pour essayer RDF 1.2 sans rien installer, et un livre pour la visite guidée. Le dépôt est ouvert : PurRDF.

La discussion est ouverte sur X et sur r/semanticweb.

Lien permanent: https://patrickaudley.com/posts/purrdf-1-0.html · Markdown