# Oxiland
[](https://github.com/eddiethedean/oxiland/actions/workflows/ci.yml)
[](https://crates.io/crates/oxiland)
[](https://pypi.org/project/oxiland/)
[](https://docs.rs/oxiland)
[](https://oxiland.readthedocs.io/en/latest/)
[](https://crates.io/crates/oxiland)
[](LICENSE-APACHE)
[](https://github.com/eddiethedean/oxiland)
> **Release status:** repository tip **0.13.0** retains demonstrated Redland
> parity and carries the performance-optimized C compatibility paths.
>
> **Performance:** tip closed the ADR-028 competitive-parity gate and the
> ADR-029 suite-wide faster-than-Redland gate (Linux, macOS, and Windows ×
> three independent strict runs). See [Performance](docs/users/performance.md).
Oxiland is an embedded RDF toolkit for Rust and Python. It provides validated
RDF terms, in-memory and persistent datasets, named graphs, SPARQL 1.1, and
streaming RDF input and output through a compact, typed API—without running a
database server.
Tip **0.13.0** retains the demonstrated Redland-parity gate defined in the
[0.11 milestone](docs/milestones/0.11.md) and adds the optimized performance
candidate. See the [parity report](docs/reports/0.11.md),
[0.12 performance report](docs/reports/0.12.md),
[0.13 suite-wide report](docs/reports/0.13.md), and [parity ledger](PARITY.md).
| Rust library | `oxiland = "0.13.0"` from crates.io, or path/git for tip | Native applications and services |
| Python package | `python -m pip install oxiland` | Python data pipelines and embedded RDF applications |
| Command line | `cargo install oxiland-cli` | Store inspection, imports, exports, and scripted queries |
| C ABI | Build from this repo: `cargo build -p oxiland-capi` | Redland-shaped C source + librdf-compat packaging (not on crates.io) |
Oxiland uses [Oxigraph](https://oxigraph.org/) 0.5.9 for standards-oriented RDF
and SPARQL execution and Fjall for its supported durable store. The primary
Rust crate forbids unsafe code.
## Capabilities
- RDF named nodes, blank nodes, literals, triples, quads, and graph names;
- default-graph and named-graph CRUD with lazy pattern matching;
- process-local in-memory models and local persistent format-v1 stores;
- atomic write transactions, explicit sync, read-only open, and N-Quads backup;
- SPARQL ASK, SELECT, CONSTRUCT, DESCRIBE, and Update;
- streaming Turtle, N-Triples, N-Quads, TriG, and RDF/XML parsing;
- RDF and SPARQL result serialization;
- digest, IRI, file-URI, Unicode, namespace, vocabulary, and logging utilities;
- Python wheels for CPython 3.10–3.14 with bundled type information;
- C Redland-shaped surface (`oxiland-capi`) with librdf-compat packaging;
- Redland workflow migration guidance and inventory-backed compatibility claims.
## Install
### Rust
Oxiland requires Rust **1.87 or newer**.
**Published release (crates.io):**
```toml
[dependencies]
oxiland = "0.13.0"
```
**This repository tip (0.13.0 APIs and qualification tooling):**
```toml
[dependencies]
oxiland = { git = "https://github.com/eddiethedean/oxiland" }
```
Enable `tracing` only when `World` log records should also be emitted as
`tracing` events:
```toml
[dependencies]
oxiland = { version = "0.13.0", features = ["tracing"] }
```
### Python
```console
python -m pip install oxiland
```
Released wheels support CPython 3.10–3.14 on the published platform matrix and
have no required Python dependencies. See the
[Python installation guide](docs/users/python-installation.md).
### Command line
```console
cargo install oxiland-cli
oxiland-cli --help
```
Installs the latest published CLI from crates.io.
### C ABI (tip only)
Not published to crates.io (`publish = false`). Clone this repository, then:
```console
cargo build -p oxiland-capi --release
```
See the [C ABI guide](docs/users/c-abi.md).
## Rust quick start
```rust
use oxiland::terms::{Literal, Triple, named_node};
use oxiland::{Model, Query, QueryResults};
fn main() -> oxiland::Result<()> {
let model = Model::new()?;
model.add(Triple::new(
named_node("https://example.com/alice")?,
named_node("https://schema.org/name")?,
Literal::new_simple_literal("Alice"),
))?;
let result = Query::new("ASK { ?s ?p ?o }").execute(&model)?;
assert!(matches!(result, QueryResults::Boolean(true)));
Ok(())
}
```
`Model::add` returns `true` when the dataset changed and `false` when the same
statement was already present.
## Python quick start
```python
from oxiland import Literal, Model, NamedNode, Triple, query
model = Model()
model.add(
Triple(
NamedNode("https://example.com/alice"),
NamedNode("https://schema.org/name"),
Literal("Alice"),
)
)
assert query(model, "ASK { ?s ?p ?o }") is True
```
The [Python documentation track](docs/users/python.md) covers installation,
models, RDF I/O, SPARQL, production operations, and the complete public API.
## Persistence and transactions
```rust,no_run
use oxiland::terms::{Literal, Triple, named_node};
use oxiland::Model;
fn main() -> oxiland::Result<()> {
let model = Model::open("./data/catalog")?;
model.transaction(|tx| {
tx.add(Triple::new(
named_node("https://example.com/item/42")?,
named_node("https://schema.org/name")?,
Literal::new_simple_literal("Desk lamp"),
))?;
Ok(())
})?;
model.sync()?;
model.export_nquads_to_path("./backups/catalog.nq")?;
Ok(())
}
```
Persistent stores are embedded local state, not a network database. Applications
own store-directory permissions, lifecycle, capacity, backups, and service-level
concurrency. Read the [Rust production guide](docs/users/rust-production.md)
before deploying a durable model.
## RDF formats
| Turtle | `turtle` | `text/turtle` | `.ttl` | No |
| N-Triples | `ntriples` | `application/n-triples` | `.nt` | No |
| N-Quads | `nquads` | `application/n-quads` | `.nq` | Yes |
| TriG | `trig` | `application/trig` | `.trig` | Yes |
| RDF/XML | `rdfxml` | `application/rdf+xml` | `.rdf` | No |
Unknown formats and ambiguous aliases fail with `Error::Unsupported`. Oxiland
does not silently guess syntax from document contents.
## Documentation
| Python | [Overview](docs/users/python.md) · [Installation](docs/users/python-installation.md) · [API](docs/users/python-api.md) · [Production](docs/users/python-production.md) |
| Rust | [Overview](docs/users/rust.md) · [Getting started](docs/users/getting-started.md) · [API on docs.rs](https://docs.rs/oxiland) · [Production](docs/users/rust-production.md) |
| Command line | [CLI guide](docs/users/cli.md) |
| C ABI | [C guide](docs/users/c-abi.md) · [Limitations](docs/users/c-abi-limitations.md) |
| Examples | [Runnable examples](docs/users/examples.md) |
| Troubleshooting | [FAQ](docs/users/faq.md) · [Known limitations](docs/users/limitations.md) · [Upgrading](docs/users/upgrading.md) |
| Evaluation | [Positioning](docs/evaluators/positioning.md) · [Compatibility contract](docs/COMPATIBILITY.md) |
| Project | [Support](SUPPORT.md) · [Security](SECURITY.md) · [Contributing](CONTRIBUTING.md) |
Published guides are available at
[oxiland.readthedocs.io](https://oxiland.readthedocs.io/).
## Compatibility and scope
Oxiland supports Redland-shaped concepts and migration workflows. Tip **0.13.0**
ships `oxiland-capi` with demonstrated source and librdf-compat binary evidence
on the frozen matrix—see [limitations](docs/users/c-abi-limitations.md) for
remaining behavioral gaps. The Python package is not an rdflib adapter. Every
compatibility statement is scoped by subsystem, platform, and evidence in the
[parity ledger](PARITY.md).
Choose Oxigraph directly when only its native engine API is required. Choose
Oxiland when its stable facade, explicit unsupported errors, persistent-store
contract, Python package, CLI, C surface, or Redland migration evidence adds
value.
## Stability and support
Oxiland is pre-1.0. Minor 0.x releases may contain documented public API
changes. Persistent format v1 is reopen-compatible across 0.4.x–0.13.x patch
lines; export N-Quads before any future format-v2 migration. See the
[support policy](SUPPORT.md) and [changelog](CHANGELOG.md).
Milestone 0.11 demonstrated Redland parity on the frozen matrix. Tip closed
the ADR-028 competitive-parity gate and the ADR-029 suite-wide
faster-than-Redland gate (three independent corrected-runner passes on Linux,
macOS, and Windows). See [performance](docs/users/performance.md) and the
[ROADMAP](docs/ROADMAP.md) for version 1.0 readiness.
Report suspected vulnerabilities privately according to
[SECURITY.md](SECURITY.md), not in a public issue.
## Development
```console
cargo fmt --all --check
cargo fmt --manifest-path python/Cargo.toml --check
cargo fmt --manifest-path fuzz/Cargo.toml --check
cargo clippy --workspace --all-targets --all-features --locked -- -D warnings
cargo clippy --manifest-path python/Cargo.toml --all-targets --locked -- -D warnings
cargo clippy --manifest-path fuzz/Cargo.toml --all-targets --locked -- -D warnings
cargo test --workspace --all-features --locked
cargo doc --workspace --all-features --no-deps --locked
python3 scripts/check-inventory.py
python3 scripts/check-docs.py
scripts/generate-public-api.sh check
```
Python contributors should also run the package's pytest, Pyright, examples,
and wheel checks described in [CONTRIBUTING.md](CONTRIBUTING.md).
## License
Licensed under either [Apache-2.0](LICENSE-APACHE) or [MIT](LICENSE-MIT), at
your option.