Sound, performant OWL 2 DL (SROIQ) reasoner in Rust — Python bindings
Project description
rustdl
Sound, performant OWL 2 DL (SROIQ) reasoner in Rust, with Python bindings. No JVM, no subprocess — native classification via PyO3.
rustdl beats HermiT on every measured ORE workload and wins outright against
Konclude on Horn-fragment ontologies. See the
project README for the full
benchmark table.
Install
pip install rustdl
Wheels are published for CPython 3.10+ on Linux (x86_64, aarch64), macOS (Apple Silicon), and Windows (AMD64). Other platforms build from the sdist (needs a Rust toolchain).
Quick start
import rustdl
# Classify an ontology. Format auto-detected from the extension:
# .ofn (OWL Functional), .owx (OWL/XML), .rdf / .owl (RDF/XML).
result = rustdl.classify("pizza.ofn")
print(f"{len(result.classes)} classes, {len(result.unsatisfiable)} unsatisfiable")
# Query the computed hierarchy
result.is_subclass("http://ex.org/Margherita", "http://ex.org/Pizza") # -> bool
result.subclasses_of("http://ex.org/Pizza") # -> list[str]
result.superclasses_of("http://ex.org/Margherita") # -> list[str]
result.equivalent_classes("http://ex.org/Pizza") # -> list[str]
result.direct_subsumers("http://ex.org/Margherita") # -> list[str] (Hasse-direct parents)
API
Classification
result = rustdl.classify(path, *, per_pair_timeout_ms=1000, saturation_only=False)
result = rustdl.classify_bytes(data, format="ofn", *, per_pair_timeout_ms=1000, saturation_only=False)
per_pair_timeout_ms— bound each subsumption test (default 1000;0= unbounded). A pair that exceeds the budget is recorded as "not subsumed": sound (never a false subsumption) but the result may be incomplete. When that happens, anIncompleteClassificationWarningis emitted andresult.completeisFalse. Pass0for the complete, unbounded classification. The default bounds pathological SROIQ inputs so classification can't hang silently.saturation_only— skip the tableau entirely; EL-closure-only under-approximation. Dramatically faster on mostly-EL ontologies, and alwayscomplete(no tableau ⇒ no timeout).
classify / classify_bytes return a Classification:
| member | type | meaning |
|---|---|---|
.classes |
list[str] |
all declared class IRIs |
.unsatisfiable |
list[str] |
classes proved ⊑ ⊥ |
.inconsistent |
bool |
whole ontology unsatisfiable |
.complete |
bool |
False if any pair hit the timeout (result may miss edges) |
.timed_out_pairs |
int |
how many pairs hit the timeout |
.is_subclass(sub, sup) |
bool |
is sub ⊑ sup entailed? |
.subclasses_of(cls) |
list[str] |
every D with D ⊑ cls |
.superclasses_of(cls) |
list[str] |
every D with cls ⊑ D |
.equivalent_classes(cls) |
list[str] |
classes equivalent to cls |
.direct_subsumers(cls) |
list[str] |
Hasse-direct parents of cls |
One-shot queries
Each parses the file, answers one question, and returns:
rustdl.is_consistent(path) # -> bool
rustdl.is_class_satisfiable(path, class_iri) # -> bool
rustdl.is_subclass_of(path, sub_iri, sup_iri) # -> bool
rustdl.is_instance_of(path, class_iri, indiv_iri) # -> bool
rustdl.instances_of(path, class_iri) # -> list[str]
rustdl.realize(path) # -> dict[str, list[str]]
realize returns each individual IRI mapped to its most-specific entailed
class IRIs.
For repeated queries over the same ontology, prefer
classify(path)once and query the returnedClassification— each top-level function re-parses.
Inference materialization
rustdl.materialize_inferred_subclass_axioms(path) # -> list[tuple[str, str]]
rustdl.materialize_inferred_class_assertions(path) # -> list[tuple[str, str]]
materialize_inferred_subclass_axioms yields (sub, sup) pairs for every
entailed subsumption (excluding reflexive, owl:Thing/owl:Nothing, and
unsatisfiable classes). materialize_inferred_class_assertions yields
(class, individual) pairs. Useful for writing an inferred ontology back to
disk.
Errors
rustdl.RustdlError # base — catches everything from the library
rustdl.ParseError # the OWL file couldn't be parsed
rustdl.UnsupportedAxiomError # HasKey, role chains > length 2, etc.
rustdl.UnknownClassError # an IRI argument isn't a declared class
try:
result = rustdl.classify("ontology.ofn")
except rustdl.ParseError as e:
print(f"bad input: {e}")
except rustdl.RustdlError as e:
print(f"reasoning failed: {e}")
Soundness & coverage
rustdl is sound: every reported subsumption is a genuine entailment
(FP=0 against Konclude on the validation corpus). Completeness is partial — the
default classifier is empirically near-complete across the measured corpus but
not provably complete on all of SROIQ. saturation_only and
per_pair_timeout_ms are sound-but-incomplete by construction.
Data-property and datatype axioms outside the recognized preprocessing patterns
are silently dropped (a sound under-approximation). HasKey and role chains
longer than length 2 raise UnsupportedAxiomError. SWRL rules are skipped.
See the project documentation for the full coverage matrix, soundness contract, and architecture notes.
License
Apache-2.0 OR MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rustdl-0.3.0.tar.gz.
File metadata
- Download URL: rustdl-0.3.0.tar.gz
- Upload date:
- Size: 536.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7636dcf2147d915df87472d87acea009b9f8180274f0d00a9a041307160d0f48
|
|
| MD5 |
709c0fedfbe68c202ffd34ca3b4b31b1
|
|
| BLAKE2b-256 |
6ebde913010fba620ac910b429cec93755b2e93978049ccb6fae6100c0dbbcea
|
Provenance
The following attestation bundles were made for rustdl-0.3.0.tar.gz:
Publisher:
release-python.yml on MaastrichtU-IDS/rustdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rustdl-0.3.0.tar.gz -
Subject digest:
7636dcf2147d915df87472d87acea009b9f8180274f0d00a9a041307160d0f48 - Sigstore transparency entry: 1731789175
- Sigstore integration time:
-
Permalink:
MaastrichtU-IDS/rustdl@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/MaastrichtU-IDS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Trigger Event:
push
-
Statement type:
File details
Details for the file rustdl-0.3.0-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: rustdl-0.3.0-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fba5a8941e9177ac1e83eb9ace6f595e11474f1db5d4f8bbe079113b4fd924de
|
|
| MD5 |
8e7008dcc200effc2dee97e198c04024
|
|
| BLAKE2b-256 |
7877ade679fa9f0d99ccbdc974cdba144571b008c52be90f066ad466f465ca73
|
Provenance
The following attestation bundles were made for rustdl-0.3.0-cp310-abi3-win_amd64.whl:
Publisher:
release-python.yml on MaastrichtU-IDS/rustdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rustdl-0.3.0-cp310-abi3-win_amd64.whl -
Subject digest:
fba5a8941e9177ac1e83eb9ace6f595e11474f1db5d4f8bbe079113b4fd924de - Sigstore transparency entry: 1731789951
- Sigstore integration time:
-
Permalink:
MaastrichtU-IDS/rustdl@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/MaastrichtU-IDS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Trigger Event:
push
-
Statement type:
File details
Details for the file rustdl-0.3.0-cp310-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: rustdl-0.3.0-cp310-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a004d772f8d2229012365b40762906e2490d468d2b7b00a72c15b8186d4e7b4
|
|
| MD5 |
82de7658493af09b38d75e72303428e9
|
|
| BLAKE2b-256 |
3851276f0ea3e4f6edcb78839dfd601cc301e633f64843b9d40db3e2891f04b2
|
Provenance
The following attestation bundles were made for rustdl-0.3.0-cp310-abi3-musllinux_1_2_x86_64.whl:
Publisher:
release-python.yml on MaastrichtU-IDS/rustdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rustdl-0.3.0-cp310-abi3-musllinux_1_2_x86_64.whl -
Subject digest:
4a004d772f8d2229012365b40762906e2490d468d2b7b00a72c15b8186d4e7b4 - Sigstore transparency entry: 1731789274
- Sigstore integration time:
-
Permalink:
MaastrichtU-IDS/rustdl@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/MaastrichtU-IDS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Trigger Event:
push
-
Statement type:
File details
Details for the file rustdl-0.3.0-cp310-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: rustdl-0.3.0-cp310-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 1.4 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c52e6c376591d8bb99ccd1b2e2f0867d6a79d8bc68814637bfc3b3449ba319b
|
|
| MD5 |
4a93aa409716b5e458a675b95904484c
|
|
| BLAKE2b-256 |
ea3f51f9be2720c6bb329dc2ae4e66e6ab2cbe3a7b4cbfd0b4c09fbc550ba897
|
Provenance
The following attestation bundles were made for rustdl-0.3.0-cp310-abi3-musllinux_1_2_aarch64.whl:
Publisher:
release-python.yml on MaastrichtU-IDS/rustdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rustdl-0.3.0-cp310-abi3-musllinux_1_2_aarch64.whl -
Subject digest:
1c52e6c376591d8bb99ccd1b2e2f0867d6a79d8bc68814637bfc3b3449ba319b - Sigstore transparency entry: 1731789626
- Sigstore integration time:
-
Permalink:
MaastrichtU-IDS/rustdl@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/MaastrichtU-IDS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Trigger Event:
push
-
Statement type:
File details
Details for the file rustdl-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: rustdl-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88be3721160af54b56795b7058f82677e74da51ab4070eb2e583f9f364319672
|
|
| MD5 |
ad217d56da80f7bc7e5f0e45df86da4e
|
|
| BLAKE2b-256 |
20e4c8fe8e3d075c22b5c0b030c44b84a27be4587253e4792975f57e9b1f05ba
|
Provenance
The following attestation bundles were made for rustdl-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release-python.yml on MaastrichtU-IDS/rustdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rustdl-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
88be3721160af54b56795b7058f82677e74da51ab4070eb2e583f9f364319672 - Sigstore transparency entry: 1731789815
- Sigstore integration time:
-
Permalink:
MaastrichtU-IDS/rustdl@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/MaastrichtU-IDS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Trigger Event:
push
-
Statement type:
File details
Details for the file rustdl-0.3.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: rustdl-0.3.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 1.4 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e85a3c5fcc682489e8f0b5188a0fa1c4eaec00c572c2d678964a52c6831598ce
|
|
| MD5 |
3e5434098d3511971b147959dfd5a8a1
|
|
| BLAKE2b-256 |
37f5d846b0f02e8d406ecac2e1f557655f778ad1657ff0ce3a1065b5af77f5cd
|
Provenance
The following attestation bundles were made for rustdl-0.3.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release-python.yml on MaastrichtU-IDS/rustdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rustdl-0.3.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
e85a3c5fcc682489e8f0b5188a0fa1c4eaec00c572c2d678964a52c6831598ce - Sigstore transparency entry: 1731790062
- Sigstore integration time:
-
Permalink:
MaastrichtU-IDS/rustdl@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/MaastrichtU-IDS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Trigger Event:
push
-
Statement type:
File details
Details for the file rustdl-0.3.0-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: rustdl-0.3.0-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.3 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
69dac966a2f557962817e53bcb016d762d38b7d09eae0ed0e152ce5e93442159
|
|
| MD5 |
d2a10b0e3a12f47e4d1814048fef27e0
|
|
| BLAKE2b-256 |
85a54d2abd0ae2620ac5820f0a3d29aeec743c5909776a5f6bb6684e17b8aaf9
|
Provenance
The following attestation bundles were made for rustdl-0.3.0-cp310-abi3-macosx_11_0_arm64.whl:
Publisher:
release-python.yml on MaastrichtU-IDS/rustdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rustdl-0.3.0-cp310-abi3-macosx_11_0_arm64.whl -
Subject digest:
69dac966a2f557962817e53bcb016d762d38b7d09eae0ed0e152ce5e93442159 - Sigstore transparency entry: 1731789433
- Sigstore integration time:
-
Permalink:
MaastrichtU-IDS/rustdl@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/MaastrichtU-IDS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@6b06b1d86aa1956ce9b9296be1d94766d8334d6c -
Trigger Event:
push
-
Statement type: