Eunomia is a linked-data-first model for physical archival storage. It keeps archival descriptions separate from the physical units that instantiate them and models boxes, shelves, cabinets, racks and depots as a current direct-location chain. Applications can derive a record's full location without copying depot data onto the record. *NOTE* this is still in very early development
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-23 12:01:13 +02:00
docs Initial commit 2026-08-23 12:01:13 +02:00
examples Initial commit 2026-08-23 12:01:13 +02:00
ontology Initial commit 2026-08-23 12:01:13 +02:00
queries Initial commit 2026-08-23 12:01:13 +02:00
shapes Initial commit 2026-08-23 12:01:13 +02:00
tests Initial commit 2026-08-23 12:01:13 +02:00
vocab Initial commit 2026-08-23 12:01:13 +02:00
.gitignore Initial commit 2026-08-23 12:01:13 +02:00
AGENTS.md Initial commit 2026-08-23 12:01:13 +02:00
pyproject.toml Initial commit 2026-08-23 12:01:13 +02:00
README.md Initial commit 2026-08-23 12:01:13 +02:00

Eunomia archival storage model

Eunomia is a linked-data-first model for physical archival storage. It keeps archival descriptions separate from the physical units that instantiate them and models boxes, shelves, cabinets, racks and depots as a current direct-location chain. Applications can derive a record's full location without copying depot data onto the record.

The namespace is temporary:

https://example.org/eunomia/

Replace it with a persistent institutional HTTP namespace before publishing production data.

Package contents

  • ontology/eunomia.ttl — core OWL/RDFS vocabulary.
  • ontology/eunomia-navigation.ttl — minimal pathing-ready extension.
  • vocab/eunomia-vocab.ttl — bilingual SKOS value schemes and an illustrative Amsterdam box profile.
  • shapes/eunomia-core.shacl.ttl — non-waivable integrity validation.
  • shapes/eunomia-operations.shacl.ttl — waivable bounds, overlap, orientation and stack validation.
  • examples/depot-k.trig — complete example with public and restricted named graphs.
  • examples/invalid/ — focused validation failures and one approved-waiver case.
  • queries/ — competency SPARQL queries.
  • tests/test_model.py — parsing, SHACL and query assertions.
  • docs/model.md — model decisions and extension guidance.

Install and verify

Python 3.12 is required.

python -m venv .venv
.venv\Scripts\python -m pip install -e .
.venv\Scripts\python -m unittest discover -s tests -v

Validate a Turtle graph directly:

.venv\Scripts\python -m pyshacl -s shapes/eunomia-core.shacl.ttl -e ontology/eunomia.ttl -i rdfs -m -a -f human your-data.ttl
.venv\Scripts\python -m pyshacl -s shapes/eunomia-operations.shacl.ttl -e ontology/eunomia.ttl -i rdfs -m -a -f human your-data.ttl

Production validation should also load vocab/eunomia-vocab.ttl; the test suite does so without network access.

Core pattern

:record200 a rico:RecordResource ;
    rico:hasOrHadInstantiation :unit200 .

:unit200 a eun:PhysicalUnit ;
    eun:directlyLocatedIn :box17 ;
    eun:hasCurrentPlacement :unit200Placement .

:box17 eun:directlyLocatedIn :shelf3 .
:shelf3 eun:directlyLocatedIn :cabinet2 .
:cabinet2 eun:directlyLocatedIn :rack1 .
:rack1 eun:directlyLocatedIn :depotK .

The current depot is obtained with eun:directlyLocatedIn+. Historical locations are represented by eun:HistoricalPlacement and do not participate in that current path.

Important boundaries

  • Linked data does not mean all data must be public. Exact addresses, geometry and placement history belong in an access-controlled named graph.
  • OWL states semantics; SHACL provides the closed-world registration contract.
  • V1 calculations support millimetres, centimetres and metres and orthogonal orientations.
  • Weight/load limits, environmental observations, arbitrary geometry and route optimization are extension points, not v1 constraints.
  • vocab:AmsterdamseArchiefdoos asserts only the supplied 12.5 cm width. Its unknown depth and height are deliberately not guessed.