14 releases
| new 0.5.0-a9 | Feb 22, 2026 |
|---|---|
| 0.5.0-a8 | Feb 19, 2026 |
| 0.5.0-a4 | Jan 16, 2026 |
| 0.5.0-a2 | Dec 23, 2025 |
| 0.4.0-a14 | Oct 29, 2025 |
#247 in Science
1MB
7.5K
SLoC
OntoEnv Python Bindings
Installation
pip install ontoenv
Usage
from ontoenv import OntoEnv
from rdflib import Graph
# creates a new environment in the current directory, or loads
# an existing one. To use a different directory, pass the 'path'
# argument: OntoEnv(path="/path/to/env")
# OntoEnv() will discover ontologies in the current directory and
# its subdirectories
env = OntoEnv()
# add an ontology from a file path.
# env.add returns the name of the ontology, which is its URI
# e.g. "https://brickschema.org/schema/1.4-rc1/Brick"
brick_name = env.add("../brick/Brick.ttl")
print(f"Added ontology {brick_name}")
# When you add from a URL whose declared ontology name differs (for example a
# versioned IRI served at a versionless URL), ontoenv records that alias. You
# can later refer to the ontology by either the canonical name or the original
# URL when resolving imports or querying.
# get the graph of the ontology we just added
# env.get_graph returns an rdflib.Graph
brick_graph = env.get_graph(brick_name)
print(f"Brick graph has {len(brick_graph)} triples")
# get the full closure of the ontology, including all of its imports
# returns a tuple (rdflib.Graph, list[str])
brick_closure_graph, _ = env.get_closure(brick_name)
print(f"Brick closure has {len(brick_closure_graph)} triples")
# you can also add ontologies from a URL
rec_name = env.add("https://w3id.org/rec/rec.ttl")
rec_graph = env.get_graph(rec_name)
print(f"REC graph has {len(rec_graph)} triples")
# you can add an in-memory rdflib.Graph directly
in_memory = Graph()
in_memory.parse(data="""
@prefix owl: <http://www.w3.org/2002/07/owl#> .
<http://example.com/in-memory> a owl:Ontology .
""", format="turtle")
in_memory_name = env.add(in_memory)
print(f"Added in-memory ontology {in_memory_name}")
# if you have an rdflib.Graph with an owl:Ontology declaration,
# you can transitively import its dependencies into the graph
g = Graph()
# this graph just has one triple: the ontology declaration for Brick
g.parse(data="""
@prefix owl: <http://www.w3.org/2002/07/owl#> .
<https://brickschema.org/schema/1.4-rc1/Brick> a owl:Ontology .
""")
# this will load all of the owl:imports of the Brick ontology into 'g'
env.import_dependencies(g)
print(f"Graph with imported dependencies has {len(g)} triples")
Namespace prefixes
OntoEnv can extract namespace prefix mappings from ontology source files.
Prefixes come from both parser-level declarations (@prefix in Turtle,
PREFIX in SPARQL-style syntaxes) and SHACL sh:declare entries.
# Get all namespaces across the entire environment
all_ns = env.get_namespaces()
# {'owl': 'http://www.w3.org/2002/07/owl#', 'brick': 'https://brickschema.org/schema/Brick#', ...}
# Get namespaces for a single ontology
ns = env.get_namespaces("https://brickschema.org/schema/1.4-rc1/Brick")
# Include namespaces from transitive owl:imports
ns_with_imports = env.get_namespaces("https://brickschema.org/schema/1.4-rc1/Brick", include_closure=True)
From the CLI:
ontoenv namespaces # all namespaces
ontoenv namespaces https://example.org/my-ontology # single ontology
ontoenv namespaces https://example.org/my-ontology --closure # with imports
ontoenv namespaces --json # JSON output
Custom graph store
If you want OntoEnv to write graphs into an existing Python-backed store, pass a graph_store
object that implements a small protocol:
class GraphStore:
def add_graph(self, iri: str, graph: Graph, overwrite: bool = False) -> None: ...
def get_graph(self, iri: str) -> Graph: ...
def remove_graph(self, iri: str) -> None: ...
def graph_ids(self) -> list[str]: ...
def size(self) -> dict[str, int]: ... # optional, returns {"num_graphs": ..., "num_triples": ...}
Example:
store = DictGraphStore()
env = OntoEnv(graph_store=store, temporary=True)
graph_store is currently incompatible with recreate and create_or_use_cached.
CLI Entrypoint
Installing ontoenv also provides the Rust-backed ontoenv command-line tool:
pip install ontoenv
ontoenv --help
The CLI is identical to the standalone ontoenv-cli binary; see the top-level README for usage.
Dependencies
~38–59MB
~1M SLoC