holosdb
An RDF 1.2 triplestore with SPARQL 1.2, where access policy is enforced at the index scan rather than by rewriting queries.
pip install holosdb
from holosdb import Store, Principal, Policy
store = Store() # in memory
store = Store("./var/db") # persistent
store.load("data.trig")
store.load("dump.nq.gz") # gzip: streamed, multi-member safe
for row in store.query("SELECT ?s ?name WHERE { ?s <http://example.com/name> ?name }"):
print(row["s"], row["name"])
Asking a question as somebody
This is the part no other binding in this ecosystem has. A query can carry a principal and a policy, and the answer comes back filtered to what that principal may see:
policy = (Policy()
.deny_predicate("http://example.com/salary", except_role="hr")
.label_graph("http://example.com/reviews", 3))
anyone = Principal.anonymous()
hr = Principal("urn:user:alice", roles=["hr"], clearance=3)
store.query(q, principal=anyone, policy=policy) # no salaries, no reviews
store.query(q, principal=hr, policy=policy) # both
Because the filtering happens at the scan and not above it:
the answer to Q equals the answer Q would have over the sub-dataset the principal may see.
That holds for every query shape without anyone enumerating them. A COUNT cannot leak
the existence of hidden rows, and a FILTER NOT EXISTS cannot probe for them.
Use Policy().fail_closed() when a partial answer would be misread as a complete one — a
compliance report, a reconciliation total — and an error is better than a quiet omission.
What else is here
store.update("INSERT DATA { ... }") # SPARQL Update: all or nothing, policy applies
store.validate("shapes.ttl") # SHACL: conforms, violations, and each result
store.named_graphs()
store.predicate_counts() # [(iri, quads), ...]: the store owner's view
store.dictionary_size # smaller than you expect: see below
holosdb.geosparql_functions() # 45 of them
holosdb.has_rocksdb() # what this wheel actually contains
Queries a program writes
For a query you did not write yourself — an agent's, a user's, a notebook's — the store can bound it and explain it:
store.query(q, timeout=5.0) # QueryTimeoutError past five seconds
store.query(q, limit=100) # at most 100 rows; the evaluation stops there
store.query(q, reorder=True) # plan with statistics over the store
store.explain(q) # the plan, with each operator's row count and time
reorder=True is the one to reach for on a large store. It builds statistics once per
write — or loads the snapshot a persistent store keeps — and plans each query by them, which
for a badly ordered pattern is the difference between milliseconds and minutes. It also
lets a DISTINCT, ORDER BY or GROUP BY estimated at over ten million rows be refused at
once with QueryRefusedError rather than discovered by the operating system.
Failures come as types you can tell apart without reading the message: SyntaxError,
PolicyError, QueryRefusedError and QueryTimeoutError, all of them HolosError.
validate() returns every result, not just a count:
>>> store.validate("shapes.ttl")["results"][0]
{'focus': 'http://example.com/bob', 'path': 'http://example.com/name', 'value': None,
'severity': 'Violation', 'component': 'http://www.w3.org/ns/shacl#MinCountConstraintComponent',
'shape': '_:...', 'message': '...'}
There is no memory ceiling here, unlike holos-server: enforcing one needs a counting
allocator, and a library does not install one in somebody else's process. A timeout and
reorder=True cover the runaway cases a ceiling would.
GeoSPARQL works through the ordinary query path, so it composes with policy — denying
geo:asWKT makes a spatial join find nothing:
store.query("""
PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX uom: <http://www.opengis.net/def/uom/OGC/1.0/>
SELECT ?site WHERE {
?site <http://www.opengis.net/ont/geosparql#asWKT> ?g .
FILTER(geof:sfWithin(?g, geof:buffer(?depot, 5, uom:kilometre)))
}
""")
dictionary_size is reliably smaller than the number of terms — every integer, float,
dateTime and short string is packed into its own 64-bit id and never reaches the dictionary.
A million triples produced 489,479 dictionary entries.
Threading
A Store is safe to share across threads, and the GIL is released around every query
and every load. Concurrent readers genuinely run concurrently rather than taking turns.
What is not here
Persistence is compiled into the wheel rather than installed beside it, so
pip install holosdb[rocksdb] is accepted but installs nothing; the published wheels already
have it. PACKAGING.md explains why a Python extra cannot do otherwise, and
has_rocksdb() reports what you actually got.
Licence
MIT or Apache-2.0, at your option.
Metadata
Release files for holosdb 0.25.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| holosdb-0.25.0.tar.gz | 675.7 kB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| holosdb-0.25.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| holosdb-0.25.0-cp39-abi3-manylinux_2_28_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| holosdb-0.25.0-cp39-abi3-manylinux_2_28_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| holosdb-0.25.0-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details |
| holosdb-0.25.0-cp39-abi3-macosx_10_13_x86_64.whl | CPython 3.9 | abi3 | macOS 10.13+ x86-64 | Details |
Total release size: 31.2 MB
Release files / holosdb-0.25.0.tar.gz
| Download URL | holosdb-0.25.0.tar.gz |
|---|---|
| Size | 675.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f760193da98636ca0eff536d9e9551a539f1e70428c561e16606bf8a4366d193
|
|
BLAKE2b-256 checksum How to use checksums |
a2021b581313b42647741d20ac5fd72d6b0ff938834c6afdb6cda5396dafbf74
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logRelease files / holosdb-0.25.0-cp39-abi3-win_amd64.whl
| Download URL | holosdb-0.25.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 5.7 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
89a2003b9eadec7062b7852bccce0ef3136e4408ebf2fec3d543bf1e5258844d
|
|
BLAKE2b-256 checksum How to use checksums |
89947b0e9204a343e8f934f3fb344c52c8732a201105a8ce26fca7d6090ac723
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logRelease files / holosdb-0.25.0-cp39-abi3-manylinux_2_28_x86_64.whl
| Download URL | holosdb-0.25.0-cp39-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 7.0 MB |
| Tags | CPython 3.9 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
31ec74fd7a3f0020dd5f40a77bba1cb56f7efda49c18445611c4673458bf7c5b
|
|
BLAKE2b-256 checksum How to use checksums |
6a20b661a3612f555bbb2981b121aa95c64c6e82d36c46bd678ee428131b66e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logRelease files / holosdb-0.25.0-cp39-abi3-manylinux_2_28_aarch64.whl
| Download URL | holosdb-0.25.0-cp39-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.9 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
46d119d43c52a426154ce387eeb417774fbc33f47449de2481e9ae35da3f2f31
|
|
BLAKE2b-256 checksum How to use checksums |
9cbbcece5a3c8f22c6b175ae5b8a9aac31e23bc78ed2470967b005eb6f2f9d77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logRelease files / holosdb-0.25.0-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | holosdb-0.25.0-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.5 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c98bbf03ce80acaba822b5f8a61ceb4ed95efbdda0fd5b27c8d546858fec15b6
|
|
BLAKE2b-256 checksum How to use checksums |
9b45127104645470664a38cdf253c84dc2d9f27142c0ec70c112ebb38e076278
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logRelease files / holosdb-0.25.0-cp39-abi3-macosx_10_13_x86_64.whl
| Download URL | holosdb-0.25.0-cp39-abi3-macosx_10_13_x86_64.whl |
|---|---|
| Size | 6.0 MB |
| Tags | CPython 3.9 abi3 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
14adbfb91482bf47f05af3237b897b316132f6ae9526215722d0ece817938f95
|
|
BLAKE2b-256 checksum How to use checksums |
2ef6bf6bde95e7d8f8307d8a4b671be02bb08452f85c17155d99762ea7a34397
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logSecurity for holosdb 0.25.0
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.
Full provenance
All 6 files in this release have been uploaded with provenance metadata.
Attestation for holosdb-0.25.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logA 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.