Skip to main content
Patrick Colm Audley

Patrick Colm Audley

Hacker · Full-Spectrum Technologist · Polymath

PurRDF 1.0: one RDF engine, one behavior, every language

PurRDF 1.0.0 is out. It is an RDF 1.2 toolkit written once as a from-scratch Rust core and carried verbatim into Python, WebAssembly/JavaScript, and C.

The problem it exists for is that RDF tooling fragments along two axes. Across languages, every ecosystem has its own parser, with its own bugs and its own subset of the spec, so moving a graph from a Rust service to a Python pipeline to a browser silently changes what the data means three times. Across time, RDF 1.2 — triple terms, reifiers, base-direction literals — is the current revision of the standard, and almost no incumbent library carries it.

So the engine is implemented once. Every published crate builds for wasm32-unknown-unknown, and there are deliberately no Cargo feature flags anywhere in the workspace: a data carrier must not have optional behavior.

The part I find most useful in practice is what it removes from an architecture. The three jobs that usually keep a PostgreSQL instance running beside a triple store — ranked full-text search, spatial predicates, and vector similarity — are answered inside PurRDF: in-process, over the same dataset, from the same SPARQL query, with no second database and no sync job. Full-text ranking is exact fixed-point BM25 with no floating point in the crate. GeoSPARQL 1.1 reads geometry as exact rationals and decides every topological relation over an exact DE-9IM, with no GEOS and no PROJ. Nearest-neighbour search is exact, not approximate. All three are deterministic, which means the same rows in the same order on a server and in a browser tab — a guarantee the Postgres stack does not make across machines.

Also in the box: native codecs for nine syntaxes, RDFC-1.0 canonicalization, SPARQL 1.1/1.2 with full Update and governed execution that returns certified partial answers rather than a wrong one, SHACL Core plus SHACL-SPARQL and SHACL-AF, ShEx 2.1, entailment regimes from RDFS through OWL 2 RL to an OWL 2 Direct-Semantics tableau — each closure returned with a reasoning report, so an incomplete answer can never be delivered as a complete one — and the GTS single-file graph transport.

Two honest notes. First, 1.0.0 is not a feature release: it is the same tree as 0.13.0, republished across all 21 crates through Trusted Publishing. What changed is the commitment. From 1.0.0 a breaking change bumps the major version, a minor bump is additive, and a patch bump is bugfix-only. Second, the C ABI is versioned separately and stays 0.x; the workspace's 1.0.0 makes no promise about it. GTS reaches Rust, the CLI, Python and C, and is not exposed by the WebAssembly package.

Every engine is gated by its official test suite, vendored and frozen in-repo: 1,105 of 1,105 shexTest validation tests, 129 of 129 W3C SHACL, 862 passing SPARQL evaluation tests, 264 of 264 syntax round-trips, and frozen cross-language GTS vectors.

There is a browser playground if you want to try RDF 1.2 without installing anything, and a book if you want the guided tour. The repo is open: PurRDF.

Discussion is open on X and on r/semanticweb.

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