rete ISWC 2026 · demonstration snapshot

ISWC 2026 · Posters & Demos · Bari, Italy

.rete — browser-native SPARQL over
static, range-addressable RDF files

Three knowledge graphs — up to 60 GB and 3.8 billion triples — published as plain files on static hosting, with no server behind them. Query them here, three ways, and watch what each answer physically cost.

The rete SPARQL console showing a Crossref query and its run strip: 100 rows, 162 range requests, 96 MB of 57 GB fetched.

aIn the browser

A static page with the engine compiled to WebAssembly. Open a graph you did not build, read its card, run a summary-safe query that never touches the index, then a selective one — and watch the run strip report the requests issued, the bytes moved, the permutation chosen and the exact byte ranges read.

A JupyterLite notebook running the rete-graph Python client on a Pyodide kernel.

bIn a notebook

The same URLs, from Python — no kernel, no server, no local install. Pyodide runs in the page and rete-graph installs from PyPI; results land in pandas, and stats() keeps counting the bytes and range requests each step actually spent.

An assistant's tool trace showing four Run SPARQL calls against a remote .rete file.

cFrom an agent

A packaged MCP extension puts the same engine inside an MCP-capable assistant: nine tools over these files, among them the card, the schema and SPARQL. It reads the card to learn the vocabulary before querying — which is what stops a model inventing predicate names.

0 servers 3 graphs 4.0 B triples 62 GB published 49 KB to open the 2.09 GB one

How one file answers a query

Publishing an RDF graph for interactive use normally means running a SPARQL endpoint or shipping the whole dataset to whoever asks. These three take a third route: the graph, its dictionary, its six permutation indexes and its own description are packed into one immutable file whose sections are addressed by byte range. A .rete opens with a 1 KB header holding a typed section directory — the offset and length of everything else — so nothing later in the file is ever found by scanning and every read is a bounded HTTP Range request.

Anatomy of a .rete file: a browser reads the dataset card in three requests, or routes a selective query into one index permutation. Browser · WebAssembly engine static hosting · no server Header · section directory Dataset card · 47 KB Dictionary · 395 MB SPO · POS · OSP · SOP · PSO · OPS tiled permutation indexes · 1.70 GB Schema pyramid · 371 KB cold start 3 requests · 49 KB index never read selective query 41 requests · 7.6 MB one permutation, tiled zenodo-records.rete · 2.09 GB · 215,396,999 triples · CC-BY-4.0

The dataset card and the schema pyramid sit before the dictionary, so a visitor can learn what a graph contains — title, licence, provenance, exact per-predicate and per-class histograms, runnable starter queries — without opening a triple index at all. Because all six permutations exist, a triple pattern with bound terms resolves to a contiguous range with its bound components leading, which is what keeps remote routing bounded.

The three graphs

All three are plain objects on Cloudflare R2 behind a CDN — 206 Partial Content, CORS, no token, no redirect. The same URLs feed all three stations.

GraphTriplesFile LicenceSource
crossref The complete Crossref March 2026 citation graph: 179.5M registered works and 2.0B cites edges — the largest single .rete published. 3,777,727,30360.2 GB CC BY 4.0 Public Data File
zenodo-records Every published Zenodo record (7.76M) as a DataCite scholarly graph, with ORCID creators and version chains. 215,396,9992.09 GB CC-BY-4.0 Zenodo exporter
open-pulse The EPFL/SDSC research-software graph — repositories, people, labs and their ROR institutions. A third-party graph, not ours. 3,697,82949 MB GitHub metadata · ontology © SDSC-ORDES Open Pulse

They share canonical IRIs — a work is https://doi.org/…, a person is https://orcid.org/… — so Crossref and Zenodo join on DOIs and ORCIDs without any owl:sameAs reconciliation.

What it costs

Measured on 2026-07-24 against the public files, over a residential link, end to end — process start and TLS included. Reproducible with the shipped rete card-url, sparql-url, why-url and cost commands.

Interaction on zenodo-records.rete RequestsBytes read % of fileIndex readTime
Dataset card349,4520.002%no0.7 s
Predicate histogram, exact349,4520.002%no0.7 s
Selective pattern, 19 triples417,602,1760.36%partial5.7 s
Join: version chain → title3017,825,7920.85%partial4.3 s
Join: ORCID author → works5018,743,2960.89%partial7.3 s
Join: cited-by, empty result244,980,7360.24%partial3.4 s

The card's 36 per-predicate counts sum to exactly 215,396,999 — the histogram is exact, not sampled. And the entry cost barely grows with the graph: the same three requests return 2.6–2.8 KB on the 17.5 GB ORCID and 35.9 GB OpenCitations files.

Where the model stops paying off. Bounded, kilobyte-scale access is guaranteed for summary-safe questions and typical for selectively routed ones. An unselective aggregate over a whole graph must read the index and will move a large fraction of the file — the demonstration lets you trigger that too, and watch it happen.

Snapshots are also immutable: updates mean a rebuild. This is a publication format, not a transactional one.

One engine, many clients

The core is a single Rust library compiled natively and to WebAssembly. These wrap it. They differ in language and runtime but not in what they do: each opens a local .rete or a remote URL through the same range interface, and none of them needs a server.

pip install rete-graph

…or in Pyodide — JupyterLite, marimo, any browser kernel:

%pip install rete-graph

CPython ≥ 3.9 everywhere. In Pyodide the same package resolves a PyEmscripten wheel straight from PyPI and runs in the page — no kernel, no server. That is exactly what station (b) above is doing.

npm install rete-graph

Node ≥ 18 and browsers, via a bundler or one <script> tag. This is the engine the console runs.

cargo add rete-core --git https://github.com/caviri/rete

The core library and the CLI. Anywhere Rust runs, native or wasm.

mvn -f clients/java install

io.github.caviri:rete-client (wasm on Chicory) and rete-rdf4j, a read-only RDF4J Repository. Not on Maven Central yet.

remotes::install_github("caviri/rete", subdir = "clients/r")

R ≥ 4.2 plus a Rust toolchain. Results come back as data frames.

Agents — MCP

the demo bundle →
/plugin marketplace add caviri/rete

Nine tools over these files in any MCP host. Or install the packaged .mcpb from station (c) above.

Download the add-on zip, then in Blender: Edit → Preferences → Add-ons → Install… and pick rete-*.zip. Enable it and the panel appears in the 3D view's sidebar.

Get the add-on ↗

Blender ≥ 4.2, engine bundled. SPARQL results become 3D scenes.

Registries where they exist, source where they do not — the Rust crate, the Java modules and the R package are built from the repository until their first release. The full matrix, with API docs for each, is on the project site.

The paper

.rete: Browser-Native SPARQL over Static, Range-Addressable RDF Files. ISWC 2026 Posters & Demonstrations Track, Bari, Italy, 25–29 October 2026.

Read the paper (PDF) Source code (Apache-2.0) Full project site

This site is a frozen snapshot built for the demonstration: three graphs, one console, one notebook, one extension. The live project — 80+ published graphs, the CLI, and clients for JavaScript, Python, R, Java and Blender — continues at caviri.github.io/rete.