---
title: "PurRDF 1.0: one RDF engine, one behavior, every language"
date: 2026-09-02
canonical: https://patrickaudley.com/#post-purrdf-1-0
cross-posted-from: https://www.linkedin.com/feed/update/urn:li:activity:7501321819077898240/
source-platform: LinkedIn
tags: [rdf, rdf-1.2, sparql, shacl, shex, semantic-web, knowledge-graphs, linked-data, rust, python, webassembly,
open-source]
mentions: [https://patrickaudley.com/#proj-purrdf]
author: Patrick Colm Audley
author-url: https://patrickaudley.com/
license: Creative Commons BY-NC-SA CAv2.5
lang: en
---

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

> PurRDF 1.0 is out: an RDF 1.2 toolkit written once in Rust and carried byte for byte into Python,
WebAssembly/JavaScript, and C. Ranked full-text search, spatial predicates, and vector similarity are answered from
SPARQL, in-process, over the same dataset — the three jobs for which an RDF project has usually run PostgreSQL beside
its triple store.

**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](https://github.com/Blackcat-Informatics/purrdf).

Discussion is open on [X](https://x.com/paudley/status/2095558962779459703) and on
[r/semanticweb](https://www.reddit.com/r/semanticweb/comments/1w6dpk3/purrdf_100_a_fromscratch_rdf_12_sparql_shacl_shex/).

---

*Originally published 2026-09-02 —
[LinkedIn](https://www.linkedin.com/feed/update/urn:li:activity:7501321819077898240/). Canonical version at
<https://patrickaudley.com/#post-purrdf-1-0>. Author: [Patrick Colm Audley](https://patrickaudley.com/). *
