Skip to main content

rete-graph — Python client for .rete files

Query local and remote .rete graph files with SPARQL from Python. A .rete file is a single, immutable, range-queryable RDF graph file (rete): drop it on any HTTP host that supports Range requests and query it in place — the client fetches only the byte ranges a query touches, never the whole file.

These are native bindings (PyO3) to the same Rust engine that powers the rete CLI and the browser playground.

Install

uv pip install rete-graph        # or: pip install rete-graph

Wheels cover Linux (x86_64/aarch64), macOS, Windows — and, from 0.2.0, browser Python: in JupyterLite or marimo's WASM playground, %pip install rete-graph resolves a Pyodide (PyEmscripten) wheel and remote graphs are queried over sync-XHR range requests, no server anywhere.

A runnable tour with captured outputs lives in examples/tutorial.ipynb, and examples/agents/ turns a graph into agent tools for LangChain and Pydantic AI.

Use

import rete_graph as rete

# Remote: lazy HTTP range reads — a selective query over a multi-GB file
# fetches KBs. Any S3/R2/CDN/GitHub URL with Range + CORS works.
g = rete.open("https://data.graphplaza.com/boe/boe.rete")

rows = g.query("""
    SELECT ?s ?label WHERE {
        ?s <http://www.w3.org/2000/01/rdf-schema#label> ?label
    } LIMIT 10
""")
for row in rows:
    print(row["s"].value, "→", row["label"].to_python())

print(g.stats())   # {'fileLength': ..., 'bytes': ..., 'requests': ...}

query() returns {variable: Term} rows for SELECT, a bool for ASK, and (s, p, o) triples for CONSTRUCT/DESCRIBE. A Term carries .kind / .value / .datatype / .lang, plus .to_python() (int/float/bool for common XSD types) and .n3.

More:

g = rete.open("data/example.rete")            # local file, opened lazily too
g = rete.open(rete.build(nt_text))            # build a graph in memory ("nt"/"nq"/"ttl"/"trig"/"rdfxml")
g = rete.open(rete.build(rdflib_graph))       # or straight from an rdflib Graph/Dataset
g = rete.open(url, headers={"Authorization": "Bearer ..."})   # authed hosts

g.examples()                                  # SPARQL examples embedded in the file — run as-is
g.query(q, reason=True)                       # OWL 2 QL entailment (query rewriting)
g.query_df("SELECT ...")                      # pandas DataFrame (pip install rete-graph[pandas])
g.schema()                                    # class/predicate profile
g.prefix_search("Berl")                       # label autocomplete
g.text_search("volcano eruption")             # full-text (files built with --text-index)
g.info(), g.quads, g.content_hash()

SPARQL 1.1 SERVICE federation works out of the box — join a .rete file against any public SPARQL endpoint in one query.

Stream every quad out

iter_quads() is a generator over the whole dataset — default graph first, then each named graph — walked in batches, so peak memory is bounded by one batch no matter how big the file is:

for s, p, o, graph in g.iter_quads():        # N-Triples term tokens; graph is
    ...                                      # None for the default graph

to_nquads() serializes the same walk to a path or any open stream, which is what makes handing a .rete to another RDF toolchain a three-liner:

g.to_nquads("out.nq")                        # or a StringIO / gzip.open(...) / sys.stdout
store = pyoxigraph.Store()
store.bulk_load(path="out.nq", format=pyoxigraph.RdfFormat.N_QUADS)

Measured on figshare.rete (221 MB, 15.9 M quads): to_nquads streams the whole file in 941 MiB peak RSS in 25 s, of which only ~20 MiB is the batch — the rest is the engine's faulted index/dictionary, and it is flat in the quad count. list(g.iter_quads()) on the same file needs many GB, and rete export needs > 1.1 GiB. Pass batch_size= to trade: a small batch makes a peek at a remote graph much cheaper (5 quads for 1.1 MB of range reads at batch_size=1, versus 44 MB at the default 10 000), a large one speeds up a full walk. Scope with graph=: rete.DEFAULT_GRAPH for the unnamed default graph alone, or an IRI for one named graph.

RDF 1.2 and quoted triples

The same --quoted-triple-syntax vocabulary and defaults as the CLI, in both directions:

# Reading: what Turtle/TriG `<< s p o >>` means. "rdf-star" (default) = a quoted
# triple, as before; "rdf12" = RDF 1.2 (`<<( s p o )>>` triple terms, `<< … >>`
# reifiers, `{| … |}` annotations). N-Triples/N-Quads/RDF-XML ignore it.
g = rete.open(rete.build(ttl_text, "ttl", quoted_triple_syntax="rdf12"))
rete.Builder().add_file("data.trig", quoted_triple_syntax="rdf12")

# Writing: to_nquads spells a quoted triple as the RDF 1.2 triple term
# `<<( s p o )>>` by default, which pyoxigraph / Oxigraph 0.5 and Jena 5 read;
# "rdf-star" writes rete's stored `<<s p o>>`. RDF 1.2 has no subject-position
# triple term, so such a statement raises ValueError under "rdf12".
g.to_nquads("out.nq")                                    # rdf12
g.to_nquads("out.nq", quoted_triple_syntax="rdf-star")

# The card says whether a file holds any, from its header (so old files answer):
g.card()["signals"]["quoted_triples"]
# {"present": True, "export_surfaces": ["rdf12", "rdf-star"], "export_default": "rdf12"}

The Pyodide wheel has no RDF 1.2 Turtle/TriG reader and refuses quoted_triple_syntax="rdf12" for those formats by name.

Prepare a .rete step by step

The lazy Builder configures a build — sources, embedded Dataset Card, pyramid, full-text index — then run() / export():

builder = (
    rete.Builder()
    .add_file("people.ttl")                    # or .add(text) / .add(rdflib_graph)
    .card(title="People", license="CC0-1.0", created="2026-07-16")
    .pyramid(algo="louvain")                   # or "types", or .pyramid(False)
    .text_index()
)
builder.run()                                  # bytes; counts in builder.stats
builder.export("people.rete")                  # immutable, host-anywhere file
builder.graph().card()                         # read the embedded card back

See the "Python: build a .rete" tutorial in the docs for the full walkthrough.

Custom storage (fsspec, S3, GCS, …)

Anything that can serve byte ranges can back a graph — pass an object with read_at(offset, length) -> bytes and len():

import fsspec, rete_graph as rete

class FsspecReader:
    def __init__(self, url, **kw):
        self.f = fsspec.open(url, "rb", **kw).open()
        self.size = self.f.size
    def len(self):
        return self.size
    def read_at(self, offset, length):
        self.f.seek(offset)
        return self.f.read(length)

g = rete.open(reader=FsspecReader("s3://my-bucket/data.rete", anon=False))

Building from source

The package is a maturin project; the repo convention is to build in Docker (nothing on the host):

# from the repository root
docker run --rm -v "$PWD":/io ghcr.io/pyo3/maturin build \
    --release -m clients/python/Cargo.toml --out clients/python/dist

uv pip install clients/python/dist/*.whl

Tests: uv pip install pytest && pytest clients/python/tests.

Wheels are abi3 (>= 3.9): one wheel per platform covers every CPython. Releases are published to PyPI by .github/workflows/python-client-publish.yml on the v* tag that releases every rete channel.

Metadata

Release files for rete-graph 0.5.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rete-graph 0.5.3
File Size Uploaded Provenance Actions
rete_graph-0.5.3.tar.gz 1.2 MB Without provenance Details for rete_graph-0.5.3.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for rete-graph 0.5.3
File Actions
rete_graph-0.5.3-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details for rete_graph-0.5.3-cp39-abi3-win_amd64.whl
rete_graph-0.5.3-cp39-abi3-pyemscripten_2026_0_wasm32.whl CPython 3.9 abi3 PyEmscripten 2026.0+ WebAssembly Details for rete_graph-0.5.3-cp39-abi3-pyemscripten_2026_0_wasm32.whl
rete_graph-0.5.3-cp39-abi3-pyemscripten_2025_0_wasm32.whl CPython 3.9 abi3 PyEmscripten 2025.0+ WebAssembly Details for rete_graph-0.5.3-cp39-abi3-pyemscripten_2025_0_wasm32.whl
rete_graph-0.5.3-cp39-abi3-manylinux_2_28_aarch64.whl CPython 3.9 abi3 Linux glibc 2.28+ ARM64 Details for rete_graph-0.5.3-cp39-abi3-manylinux_2_28_aarch64.whl
rete_graph-0.5.3-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.9 abi3 Linux glibc 2.17+ x86-64 Details for rete_graph-0.5.3-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
rete_graph-0.5.3-cp39-abi3-macosx_10_12_universal2.macosx_10_12_x86_64.macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 10.12+ x86-64, macOS 10.12+ universal2 (ARM64, x86-64), macOS 11.0+ ARM64 Details for rete_graph-0.5.3-cp39-abi3-macosx_10_12_universal2.macosx_10_12_x86_64.macosx_11_0_arm64.whl

Total release size: 23.7 MB

Release files / rete_graph-0.5.3.tar.gz

Download URL rete_graph-0.5.3.tar.gz
Size 1.2 MB
Tags Source
SHA-256 checksum
How to use checksums
c9d3a28c6532e5e7ff7b0d1171551af7edb5cd352cb74e77d31befea7478e189
BLAKE2b-256 checksum
How to use checksums
c84bbc08bb4da7922b88dfae1ac6d9cf64632c4dbcc8b41adff60fd45426a64d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / rete_graph-0.5.3-cp39-abi3-win_amd64.whl

Download URL rete_graph-0.5.3-cp39-abi3-win_amd64.whl
Size 3.9 MB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
91c208a31ce515d0cce460d110c351238b7698c750f78370aacc483460d1f3c6
BLAKE2b-256 checksum
How to use checksums
10ba4b1030202ccab5bb12551c12d06b256d0e3c690ef804aa599b69ada61b47
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / rete_graph-0.5.3-cp39-abi3-pyemscripten_2026_0_wasm32.whl

Download URL rete_graph-0.5.3-cp39-abi3-pyemscripten_2026_0_wasm32.whl
Size 1.4 MB
Tags CPython 3.9 PyEmscripten 2026.0+ WebAssembly abi3
SHA-256 checksum
How to use checksums
142eff4e51ae75c5232e489b98fa3a2b6dd06eeed797cde340982ca20cf51317
BLAKE2b-256 checksum
How to use checksums
12b743a8e65efc659e698495e1443f07f3be1054887c984dc2e50b8ca09e42ca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / rete_graph-0.5.3-cp39-abi3-pyemscripten_2025_0_wasm32.whl

Download URL rete_graph-0.5.3-cp39-abi3-pyemscripten_2025_0_wasm32.whl
Size 1.4 MB
Tags CPython 3.9 PyEmscripten 2025.0+ WebAssembly abi3
SHA-256 checksum
How to use checksums
e659cd6f29c9b242f31714c99fcf5bd9fd5251c1ad8db5a5c5ffc3a6c627d168
BLAKE2b-256 checksum
How to use checksums
5667dc8ff3f57fdde4f134b8760e1ac99bd35b592130a866fe8484dd6c7449a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / rete_graph-0.5.3-cp39-abi3-manylinux_2_28_aarch64.whl

Download URL rete_graph-0.5.3-cp39-abi3-manylinux_2_28_aarch64.whl
Size 3.9 MB
Tags CPython 3.9 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
a8aaa7ce34e170287b10228384e2694e3262ef7309237e6b1eaa44bc1e0406de
BLAKE2b-256 checksum
How to use checksums
fa096ef6257a0ac36079b43e4d07dc3cc4b5a668cf1e9cef701c17cda3bcd403
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / rete_graph-0.5.3-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL rete_graph-0.5.3-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 4.3 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
254771bdb2c0d659a78e322f8197be8644b58e38c9b72c0e701c8bc1aa9e6e62
BLAKE2b-256 checksum
How to use checksums
fc1dbedba773d61e530fd4e0376328604b2fb6f4db07828ef4b66387cefaa7b2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / rete_graph-0.5.3-cp39-abi3-macosx_10_12_universal2.macosx_10_12_x86_64.macosx_11_0_arm64.whl

Download URL rete_graph-0.5.3-cp39-abi3-macosx_10_12_universal2.macosx_10_12_x86_64.macosx_11_0_arm64.whl
Size 7.6 MB
Tags CPython 3.9 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
bdf67bd8de5d870cac9e55581d219c177e1013909cee754d79cb352237a2887f
BLAKE2b-256 checksum
How to use checksums
a4186f4e5360ca8bc8546669b41a2ed4e2d13e92c74624a3433e3e4d3475c39e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for rete-graph 0.5.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page