OwlReady2 meets Oxigraph: Best of Both Worlds

Building Repolex required choosing between two excellent but different RDF tools. We ended up using both.

The Tension

OwlReady2 gives you a Pythonic object-oriented interface to RDF. You work with classes and properties, not raw triples:

repo = Repository("myrepo")
repo.hasFunction.append(func)

Clean, intuitive, type-checked.

Oxigraph is a high-performance triple store built in Rust. It scales to billions of triples with fast SPARQL queries. But you work with raw quads:

store.add(Quad(subject, predicate, object, graph))

Less ergonomic, but blazing fast.

The Solution: Use Both

We use OwlReady2 for data creation in worker processes. Python developers write clean OO code. Then we export to Oxigraph for long-term storage and queries.

Parse (OwlReady2) → Export (TriG) → Load (Oxigraph) → Query (SPARQL)

Why This Works

OwlReady2 uses SQLite with exclusive=False, allowing multi-process writes. Workers create semantic instances without manual quad construction. When parsing completes, we export the graph and bulk-load into Oxigraph.

Query time? Oxigraph handles billions of triples without breaking a sweat.

The Tradeoff

We pay a small cost in architectural complexity. But we get the best of both worlds: clean data creation and production-grade performance.

Sometimes the right answer is “both.”