open-ontologies

by fabio-rovaiVerified

AI-native ontology engine: a Rust MCP server with tools for building, validating, querying, and reasoning over RDF/OWL ontologies. In-memory Oxigraph triple store, native OWL2-DL tableaux reasoner, SHACL validation, SPARQL, versioning. Single binary, no JVM.

434
Stars
55
Forks
Rust
Language
8/23/2026
Added
View on GitHubDownload ZIP

⚠️ Third-Party Software Notice

This skill is third-party open-source software developed and hosted independently on GitHub. SkillTip is an informational directory and does not control or maintain the underlying repository. Any security checks displayed are automated and limited in scope. Review the source code before installing.

Read the Terms of Service

Installation

Add to your Claude Code skills directory:

# Add to your Claude Code skills
git clone https://github.com/fabio-rovai/open-ontologies

Getting Started

Guides for using skills like open-ontologies.

Security Report

Verified

Last scanned: —

{
  "status": "PASSED",
  "issues": []
}

README.md

Open Ontologies

Open Ontologies

A Terraforming MCP for Knowledge Graphs
Validate, classify, and govern AI-generated ontologies. Written in Rust. Ships as a single binary.

CI MIT Obsidian plugin PitchHut ClawHub Sponsor

English · 简体中文

Quick Start · Studio · Benchmarks · IES · Tools · Extending · Architecture · Docs


Open Ontologies is a Rust MCP server and desktop Studio for AI-native ontology engineering. It exposes 70+ tools that let Claude build, validate, query, diff, lint, version, reason over, align, plan, certify, and govern RDF/OWL ontologies using an in-memory Oxigraph triple store — with a full three-layer Dynamics → Causal → Planner architecture, a marketplace of 33 standard ontologies, clinical crosswalks, semantic embeddings, and a full lineage audit trail.

The Studio wraps the engine in a visual desktop environment: virtualized ontology tree with hierarchy lines, breadcrumb navigation, and connection explorer; AI chat panel with /build (IES-level deep) and /sketch (quick prototype) commands; Protégé-style property inspector; and lineage viewer.

No JVM. No Protégé.


What's New (three-layer architecture + 13 new primitives)

The full Dynamics → Causal → Planner stack plus 13 new primitives. Every piece holds the MCP-native convention: the server provides validation and scaffolding, the connected LLM (Claude over MCP) does the intelligence. No internal LLM clients, no API keys, no provider abstractions.

Three-layer architecture

LayerWhat it ships
DynamicsActionSchema + 4 MCP tools: onto_action_register / _applicable / _apply / _list. Concurrent atomic ticks, static causal laws (invariants), default-value laws, ramification via OWL-RL closure, non-deterministic outcomes with reproducible seed.
Causalonto_certify_action with optional PyWhy backdoor identification (opt-in via causal-pywhy feature). Structural-proxy default + do-calculus opt-in + graceful fallback.
Planneronto_plan_compile_pddl + onto_plan_classical (Fast Downward subprocess) + onto_plan_validate (sandbox-simulate). Solver stays client-side; server compiles + validates.

13 new primitives

  • onto_owl_shacl_coevolve_check + onto_owl_shacl_coevolve_incremental — SHACL validation against the OWL-RL closure, with dependency-graph routing so only shapes touching changed IRIs revalidate.
  • onto_segment_retrieve — TBox-slice retrieval for ontology-grounded RAG.
  • onto_extract_scaffold + onto_extract_validate — schema-guided structured extraction with typed datatype validation + conformance scoring.
  • onto_cq_run + onto_verify_cq + onto_cq_verdicts_list — competency-question runner with pitfall hints + LLM-judgement loop.
  • onto_classify_el — OWL-EL classification (transitive subsumption table, trivial pairs excluded).
  • onto_eval_alignment — P/R/F1 over reference + computed alignment sets.
  • onto_shape_combinatorics + onto_shape_induce — property-combination lattice + data-driven SHACL shape induction with support × confidence ranking.
  • borderline_partition + borderline_record_verdict — generalised two-threshold review loop for any candidate set.
  • onto_align_fuzzy — embedding-free fuzzy-logic adjudication with 10-rule Mamdani inference; HNSW is demoted to a candidate generator.
  • onto_align_flora — end-to-end alignment pipeline pairing the signal extractor to the fuzzy adjudicator.
  • onto_policy_register + onto_policy_list + onto_policy_check — authorisation gate that composes with onto_certify_action (Causal = risk; policy = authorisation).
  • eval_rag + eval_rag_mmrag — Hit@k / MRR / faithfulness / token-Jaccard / ROUGE-1 scoring for retriever pipelines, with a dataset adapter.
  • graph_projection_lossy_check — the auditor that pairs with onto_segment_retrieve.

Validating end-to-end

cargo run --example three_layer_pipeline

Walks Dynamics register → PDDL compile → Fast-Downward-shaped sas_plan parse → orchestrator-side IRI bind → sandbox validate → CIVeX certify → apply with OWL-RL ramification → final state inspection. Every layer through its public API, no external dependencies (Python, DoWhy, Fast Downward) required.

Zero new external Rust dependencies; everything optional gates behind Cargo features. Full test suite (160+ tests) green on default build; cargo clippy --lib --tests --examples -- -D warnings clean across both default and causal-pywhy configurations.


Quick Start (MCP / CLI)

Install

Pre-built binaries:

# macOS (Apple Silicon)
curl -LO https://github.com/fabio-rovai/open-ontologies/releases/latest/download/open-ontologies-aarch64-apple-darwin
chmod +x open-ontologies-aarch64-apple-darwin && mv open-ontologies-aarch64-apple-darwin /usr/local/bin/open-ontologies

# macOS (Intel)
curl -LO https://github.com/fabio-rovai/open-ontologies/releases/latest/download/open-ontologies-x86_64-apple-darwin
chmod +x open-ontologies-x86_64-apple-darwin && mv open-ontologies-x86_64-apple-darwin /usr/local/bin/open-ontologies

# Linux (x86_64)
curl -LO https://github.com/fabio-rovai/open-ontologies/releases/latest/download/open-ontologies-x86_64-unknown-linux-gnu
chmod +x open-ontologies-x86_64-unknown-linux-gnu && mv open-ontologies-x86_64-unknown-linux-gnu /usr/local/bin/open-ontologies

Docker:

docker pull ghcr.io/fabio-rovai/open-ontologies:latest
docker run -i ghcr.io/fabio-rovai/open-ontologies serve

serve starts an MCP server that speaks JSON-RPC over stdin/stdout — it is not an interactive CLI, so on launch it will appear to "hang" while it waits for an MCP client to connect. That is expected. To try the tools directly from a terminal instead, use the CLI subcommands (e.g. open-ontologies validate <file.ttl>); to use it with an LLM, wire it into an MCP client as shown under Connect to your MCP client.

From source (Rust 1.85+):

git clone https://github.com/fabio-rovai/open-ontologies.git
cd open-ontologies && cargo build --release
./target/release/open-ontologies init

For native Windows builds, see docs/windows.md.

Connect to your MCP client

Claude Code

Add to ~/.claude/settings.json:

{
  "mcpServers": {
    "open-ontologies": {
      "command": "/path/to/open-ontologies/target/release/open-ontologies",
      "args": ["serve"]
    }
  }
}

Restart Claude Code. The onto_* tools are now available.

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "open-ontologies": {
      "command": "/path/to/open-ontologies/target/release/open-ontologies",
      "args": ["serve"]
    }
  }
}
Cursor / Windsurf / any MCP-compatible IDE

Add to .cursor/mcp.json or equivalent:

{
  "mcpServers": {
    "open-ontologies": {
      "command": "/path/to/open-ontologies/target/release/open-ontologies",
      "args": ["serve"]
    }
  }
}
Docker
{
  "mcpServers": {
    "open-ontologies": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/fabio-rovai/open-ontologies", "serve"]
    }
  }
}
Obsidian

The Open Ontologies plugin for Obsidian runs this engine as a managed sidecar inside Obsidian: ontology tree, SPARQL console, validation panel, validate-on-save for Turtle files, and a vault-to-RDF mapper so your notes become a graph the reasoners can work on. It also exposes the engine over MCP on a stable authenticated loopback port, so Claude Code or Claude Desktop can query the reasoned vault graph. Desktop only; the plugin auto-downloads the pinned engine release, or point it at an existing binary.

See docs/obsidian.md for the settings reference and the agent-access model.

HTTP transport (serve-http)

For clients that speak MCP over HTTP rather than stdio:

open-ontologies serve-http --host 127.0.0.1 --port 8080
RouteAuthPurpose
/mcpbearer, if a token is configuredMCP Streamable HTTP — the onto_* tools
/api/stats, /api/lineagebearer, if a token is configuredread-only introspection
/api/querybearer, if a token is configuredSPARQL SELECT
/api/update, /api/load, /api/load-turtle, /api/savebearer, if a token is configuredmutating — SPARQL UPDATE, and /load / /save read and write files on the server at a path taken from the request body
/healthneverliveness probe

The HTTP surface is not read-only. When no token is configured the bearer layer is not installed at all, so every route above — including the ones that write to the server's filesystem — is reachable by anyone who can open the port. Set a token, or bind to a loopback address, whenever the port is reachable by anything other than the local process.

/health returns {"status":"ok","version":"<crate version>"} and is deliberately outside the bearer layer, so an orchestrator can probe the process without holding API credentials. It reports nothing about loaded state — use /api/stats for that.

Build your first ontology

Build me a Pizza ontology following the Manchester University tutorial.
Include all 49 toppings, 24 named pizzas, spiciness value partition,
and defined classes (VegetarianPizza, MeatyPizza, SpicyPizza).
Validate it, load it, and show me the stats.

Claude generates Turtle, then runs the full pipeline automatically:

onto_validateonto_loadonto_statsonto_reasononto_statsonto_lintonto_enforceonto_queryonto_saveonto_version

Every build includes OWL reasoning (materializes inferred triples), design pattern enforcement, and automatic versioning.


Studio (Desktop App)

The Studio is a native desktop application that wraps the same engine in a visual environment — no browser, no server to manage. It runs entirely on your machine: the engine sidecar handles RDF/OWL operations while the UI renders the graph in real time.

Think of it as Protege meets an AI copilot. Type "build ontology about cats" and watch a 1,400-class ontology appear in the tree — classes, properties, individuals, and axioms built automatically across 13 pipeline steps. Click any node to inspect its triples, trace connections via clickable pills, and follow every change through the lineage panel.

Why virtualized tree (not 3D graph)

Prior to v0.1.12, the Studio used a D3.js horizontal tree and a 3D force-directed graph (Three.js / WebGL). Both worked for small ontologies (~100 classes) but became unusable at IES-level depth: the D3 tree couldn't handle 500+ nodes without layout thrashing, and the 3D graph froze the WebKit webview above 1,000 nodes.

The v2 deep builder changed the equation — a single /build command now produces 1,400+ classes. We replaced both views with a virtualized DOM tree: only visible rows exist in the DOM (constant memory regardless of ontology size), with hierarchy connector lines, type-filtered legend, search, breadcrumb navigation, and a connections panel. This handles the full IES Common (511 classes) and deep-built ontologies (1,400+ classes) without lag.

How it works

The Studio launches three processes that communicate locally:

  1. Tauri 2 shell — native window (macOS/Linux/Windows) with a WebKit webview
  2. Engine sidecar — the same Rust binary, running as an HTTP MCP server on localhost:8080
  3. Agent sidecar — Node.js process running Claude via the Agent SDK, connected to the engine over MCP

When you type in the chat panel, your message goes to the Agent sidecar, which sends it to Claude. Claude decides which onto_* tools to call, the engine executes them, and the UI refreshes the graph. The entire loop — prompt to visual update — takes seconds.

Install and run

Prerequisites: Rust + Cargo · Node.js 18+

# 1. Build the engine binary (from repo root)
cargo build --release

# 2. Install JS dependencies
cd studio && npm install

# 3. Run
PATH=/opt/homebrew/bin:~/.cargo/bin:$PATH npm run tauri dev

The first launch compiles the Tauri shell (~2 min). Subsequent launches start in seconds.

Features

FeatureDescription
Virtualized TreeOntology explorer that handles 1,500+ classes without lag. Hierarchy connector lines, collapsible branches, type-filtered legend (Class/Property/Individual), search with auto-expand, breadcrumb path navigation, and a connections panel showing domain/range relationships as clickable pills. Only visible rows are in the DOM — constant memory regardless of ontology size.
AI Agent ChatNatural language ontology engineering via Claude Opus 4.8 + Agent SDK. Two build modes: /build runs a 13-step pipeline producing IES-level ontologies (500-1,500+ classes, 100-200+ properties), /sketch runs 3 steps for quick prototyping (~80 classes). Each tool call is shown in real time.
Property InspectorProtege-style inline triple editor. Click any node to see its rdfs:subClassOf, rdfs:label, rdfs:domain, rdfs:range and all other triples. Edit in place, hover to delete, + Add for new triples. Changes are immediately reflected in the graph.
Lineage PanelFull audit trail from SQLite: every plan, apply, enforce, drift, monitor, and align event, grouped by session with timestamps. See exactly what Claude did and in what order.
Named Save⌘S to save as ~/.open-ontologies/<name>.ttl. Auto-saves to studio-live.ttl after every mutation so you never lose work.

Keyboard shortcuts

ShortcutAction
⌘JToggle AI chat panel
⌘IToggle property inspector
⌘SSave ontology
FFit graph to viewport (tree view)
RReset zoom (tree view)
EscDeselect node
Shift+clickCollapse/expand branch (tree view)
ScrollZoom in/out
Click + dragPan

Research Questions

The benchmarks below are not a feature tour. Each one exists to answer a specific question, and the answers include the unflattering ones.

#QuestionWhere it is measuredAnswer as measured
RQ1Does structured tool access give an LLM a materially different mode of access to an ontology than handing it the raw OWL file, or than giving it nothing but class and property names?OntoAxiom, 3 conditions, 2 modelsPartly. Both beat name lists decisively. Tool extraction and raw-file reading are at parity with each other: raw OWL wins the macro average, extraction wins the micro. The tools' remaining advantage is that every pair traces to a query against real triples.
RQ2When two evaluation conditions disagree, how much of the gap is the method and how much is the scorer?OntoAxiom, legacy vs unified evaluatorEnough to invert the finding. Three scorer asymmetries, all pointing one way, produced a reported result whose sign reverses under a shared evaluator, on both models and under both averages.
RQ3In ontology alignment, which carries the result: how the similarity signals are weighted, or the constraint that the matching be 1-to-1?OAEI Anatomy, 5 weight configurations vs stable-matching ablationThe constraint, overwhelmingly. Removing stable matching as the only variable drops F1 from 0.829 to 0.728; the five-weight-configuration spread is 0.0033, and even that overstates it (the zero-structural-signal branch bypasses the weights entirely).
RQ4How far does an alignment system get on a biomedical track with no domain background knowledge (no UMLS, no BioPortal, no LLM oracle)?OAEI Anatomy and Conference, full 2025 fieldNot far enough. 9th of 13 on Anatomy, level with the lightweight lexical matcher and +0.063 F1 over a string-equality baseline. Below every system and both baselines on Conference. Precision is competitive; recall is the failure.
RQ5Does a closed-world vocabulary check catch generated terms that open-world SHACL validation silently accepts?onto-correctness-bench: 3 vocabularies, 418 fabricated terms, 300 graphsYes, completely. SHACL returned conforms=true on 300/300 graphs containing a fabricated term. The closed-world gate flagged 300/300, with zero false positives on clean graphs. Open-world semantics treat an undeclared predicate as merely unknown, so SHACL is structurally unable to see it.
RQ6Can the SHACL-SPARQL governance rules an ontology ships actually be executed as written at national scale, or does the reference store force a workaround?investment-fund-ontology: 1.29M-triple US fund universe, 4 layer-3 rules, rdflib 7.6.0 A/BStore-specific. rdflib finishes the anti-join (0.1s) and nested aggregate (0.8s) but times out (>300s) on both multi-way self-joins — exactly the cross-source reconciliation rules the ontology exists for. This repo's Oxigraph engine runs load + all four rules, unmodified, in 2.1s, reproducing the reference pipeline's published counts (73 / 0 / 214 / 2,148) exactly. The shapes also forced two validator fixes here: sh:inversePath support and sh:severity reporting.

| RQ7 | When the graph is register-scale (276k triples) rather than fund-universe-scale (1.29M), does the reference store still force the set-based workaround, and do the rule counts survive entity resolution? | insurance-register-ontology: 276,683-triple EEA insurance register, 6 layer-3 rules, rdflib 7.6.0 A/B | The workaround becomes speed, not survival. At this scale rdflib completes all six rules (133.2s total, 97s of it in one double anti-join) against 2s to 9s for the Oxigraph engine; nothing times out. Counts match the reference pipeline exactly on R1-R4 (643 / 4 / 118 / 42). R5 falls from 227 to 20 and R6 rises from 283 to 291 because the graph runs the same rule text after entity resolution, which absorbs the legitimate branch shares and attributes 8 more zombie passports via the LEI join; both differences were verified set-based. The shapes forced two more validator fixes: sh:pattern and sh:hasValue. | | RQ8 | When a published standard ships a validator but no RDF binding, does a green SHACL result mean the data is valid, or that nothing was checked? | dcat-us-binding: DCAT-US 3.0, the US federal metadata profile, 115 published examples, pySHACL vs this engine | It means nothing was checked, and the distinction is invisible without reporting reach. The corpus as published expands to 76 triples, 1 predicate, 0 DCAT, so the shapes GSA deleted select 0 focus nodes and return conforms=True. Generating a JSON-LD context from the same JSON Schema that already carries the RDF terms (231 of 270 properties) lifts the corpus to 1,510 triples and 228 DCAT statements, and the same deleted shapes, unchanged, then select 228 focus nodes and report 287 violations. This is why onto_shacl reports focus_nodes next to the verdict. The run also cost us two defects here: sh:class and sh:nodeKind are not evaluated at all (287 of pySHACL's 316 findings invisible), and sh:datatype rejects "1024"^^xsd:nonNegativeInteger against sh:datatype xsd:nonNegativeInteger. |

RQ2 and RQ4 are the ones worth reading if you are deciding whether to trust this repo. Both are negative results about work done here.

Benchmarks

How to read these numbers. Unless stated, LLM results are single-run (not averaged over seeds) and use Claude Opus 4.8. Several benchmark ontologies (Pizza, FOAF, Schema.org, OWL-Time) are widely published and may appear in an LLM's pretraining data, so a bare-LLM score is a contamination-inclusive baseline, not a clean measure of reasoning — the contribution is the delta the MCP tools add on top of that baseline, and whether that delta reproduces across models. To check exactly that, the repo ships a cross-model ablation driving the same tasks with a local Qwen3-Coder-30B as well as Claude — see benchmark/ontoaxiom/. If the tool-augmented gain holds on a second, open model, the gain is a property of the tooling, not of one vendor's model.

OntoAxiom — LLM Axiom Identification

OntoAxiom tests axiom identification across 9 ontologies and 3,042 ground truth axioms.

All conditions below are scored by a single evaluator (benchmark/ontoaxiom/score_all_conditions.py) with one shared normalizer, and both averages are reported, because the original scripts disagreed on all of that. macro = mean of per-(ontology, axiom) F1; micro = F1 over pooled TP/FP/FN.

ApproachInputmacro F1micro F1
o1 (paper's best)Name lists0.197
Bare Claude OpusName lists0.4510.397
Bare Qwen3-Coder-30BName lists0.2230.176
Claude Opus, raw OWL fileFull Turtle0.7680.686
Qwen3-Coder-30B, raw OWL fileFull Turtle0.6730.667
MCP extractionFull OWL0.7130.717

The paper's "raw OWL hurts" result is a scoring artifact. OntoAxiom reports that an LLM given the full OWL file (F1 = 0.323) does worse than one given only class/property name lists (0.431). Those two numbers came from scripts that disagreed on three axes: the name-list scorer splits camelCase and the raw-OWL scorer only lowercases; the first reports a macro mean and the second a micro F1; and they flip pair order on different axiom types. Every one of those differences penalizes the raw-OWL condition, because that is the one where the model reads real Turtle and therefore answers in QNames (foaf:Person) and rdfs:label text ("personal mailbox" for mbox) rather than bare local names. 0.431 and 0.323 were never the same statistic.

Rescoring the same stored predictions under one evaluator flips the sign on both models and under both averages: Claude 0.451 → 0.768 macro (0.397 → 0.686 micro), Qwen 0.246 → 0.673 macro, winning 33/43 and 33/38 cells respectively. score_condition_d.py --legacy reproduces the broken 0.323 exactly, so the bug is demonstrated rather than asserted. The correction moves 0 of 5,083 name-list pairs, so it cannot flatter the baseline, and it still under-credits raw OWL: 51.8% of Claude's pairs are label text no normalizer here can match. Full analysis and reproduction: benchmark/ontoaxiom/ONTOAXIOM_SHOWDOWN.md.

Corrected, reading the ontology and SPARQL-extracting it are at parity — raw OWL wins macro (0.768 vs 0.713), extraction wins micro (0.717 vs 0.686). So the tools' edge is auditability, not F1: every MCP pair traces to a query against real triples, whereas an LLM reading a file can still hallucinate a plausible pair and no F1 score will say which.

Pizza Ontology — Manchester Tutorial

One sentence input: "Build a Pizza ontology following the Manchester tutorial specification."

MetricReference (Protégé, ~4 hours)AI-Generated (~5 min)Coverage
Classes999596%
Properties88100%
Toppings4949100%
Named Pizzas2424100%

/sketch vs /build — Two Build Modes

The Studio provides two build commands for different use cases. Both take the same input — "build ontology about cats" — but produce very different results:

Metric/sketch (3 steps, ~2 min)/build (13 steps, ~15 min)IES Common (reference)
Classes951,433511
Object properties15218162
Datatype properties510144
Individuals335821
Disjoints660+
Max hierarchy depth5118
Build time~2 min~15 min— (hand-built)

/sketch runs 3 steps: classes + properties in one Turtle block, axioms + individuals, then save. Good for quick domain exploration or demo prototyping. Produces a complete ontology with hierarchy, properties, and individuals — but at a fraction of the depth.

/build runs a 13-step pipeline within a single persistent Claude session: foundation classes → per-branch deepening (4 passes) → gap filling → object properties (2 batches) → datatype properties → disjoints → individuals → reason → save. Each step focuses on one aspect of the ontology, staying within output token limits while building on the previous step's context. The result exceeds IES Common on every metric.

/sketch is comparable to the Pizza benchmark (95 classes, 8 properties). /build produces IES-level ontologies — deep enough for production use.

Mushroom Classification — OWL Reasoning vs Expert Labels

Dataset: UCI Mushroom Dataset — 8,124 specimens classified by mycology experts.

MetricResult
Accuracy98.33%
Recall (poisonous)100% — zero toxic mushrooms missed
False negatives0
Classification rules6 OWL axioms

Ontology Marketplace — 33 Standard Ontologies

The 29 general-purpose marketplace ontologies (the four IES entries are covered separately under IES Support) fetched, owl:imports resolved, loaded, and reasoned over with both RDFS and OWL-RL profiles. Regenerate with python3 benchmark/marketplace_benchmark.py:

OntologyClassesPropertiesTriples+ RDFS+ OWL-RLFetchRDFSOWL-RL
OWL 2290537+230+230276ms1ms1ms
RDF Schema4087+35+35268ms0ms0ms
RDF Concepts130127+31+31175ms0ms0ms
BFO (ISO 21838)3521,221+186+186254ms2ms1ms
DOLCE/DUL791181,917+666+692181ms7ms8ms
Schema.org1,0321,67417,949+4,082+14,236679ms56ms136ms
FOAF1562631+4+31656ms1ms1ms
SKOS528252+55+5581ms1ms1ms
Dublin Core Elements015107+0+0315ms1ms0ms
Dublin Core Terms2370700+256+261129ms2ms2ms
DCAT491102,841+223+254356ms7ms8ms
VoID727216+0+0333ms0ms0ms
DOAP2245741+0+0352ms1ms1ms
PROV-O31591,146+202+203204ms3ms2ms
OWL-Time29581,296+165+165206ms3ms2ms
W3C Organization1738748+9+21259ms2ms2ms
SSN23381,815+84+84262ms2ms2ms
SOSA1723396+0+0323ms1ms1ms
GeoSPARQL1554796+4+12227ms1ms1ms
LOCN315206+0+0363ms1ms1ms
SHACL481011,128+268+268277ms2ms2ms
vCard6484882+0+46316ms1ms1ms
ODRL31582,157+73+76212ms3ms3ms
Creative Commons2113115+0+49564ms1ms1ms
SIOC1786615+0+2364ms1ms1ms
ADMS816151+0+0377ms1ms1ms
GoodRelations431021,834+15+42303ms3ms4ms
FIBO (metadata)0048+0+0505ms4ms4ms
QUDT991962,434+1,574+1,5812,100ms50ms49ms
Total1,7793,09243,093+8,162+18,560

29/29 ontologies loaded, imports resolved, and reasoned. RDFS adds 18% more triples. OWL-RL adds 43% — transitive/symmetric/inverse properties and equivalentClass expansion discover significantly more implicit knowledge. Schema.org jumps from +4,082 (RDFS) to +14,236 (OWL-RL) inferred triples in 136ms.

Class and property counts are structural, not declaration-only: a term counts if it is typed (owl:Class, rdfs:Class, owl:ObjectProperty, owl:DatatypeProperty, rdf:Property) or used as one (rdfs:subClassOf/subPropertyOf/domain/range position). Vocabularies that never issue OWL type declarations, such as Schema.org, are therefore counted rather than reported as empty. Terms in the rdf:, rdfs: and owl: namespaces are excluded so a vocabulary is not credited with the meta-vocabulary it is written in. That exclusion is why OWL 2, RDF Schema and RDF Concepts report 0 properties: every property they define is, by definition, in an excluded namespace. FIBO's marketplace entry is the metadata module only (48 triples), which declares no terms of its own.

Compiled Claim Verification — measured vs HermiT

The claimcheck module compiles an ontology once (inferred hierarchy + disjointness, including pairs derived by sound propagation rules) into per-class token bitsets, then verifies candidate claims — the "is this set of triples consistent with the ontology?" question — with no reasoning at query time: two 64-bit ANDs per class pair, witness axiom extracted for the explanation.

Same ontology (canonical pizza.owl), same task, same machine, verdicts cross-checked against HermiT 1.4.3.456:

Per-claim consistency checkmedianp95throughput
HermiT (warm JVM, ontology pre-loaded)4,936 µs~200/s
open-ontologies compiled check0.3 µs0.4 µs3.1M/s (11.2M/s batched)

Correctness before speed:

  • 0 disagreements with HermiT across 78,884 exhaustively-audited class pairs (13 ontologies) and 793 structurally adversarial claims.
  • Sound by construction: a Rejected verdict is backed by a derivable contradiction and names the witnessing axiom. 100% contradiction recall on both fully-audited ontologies.
  • Explicit incompleteness envelope: anything the compiled surface cannot decide returns Undetermined and routes to a reasoner-backed residual tier — it is never guessed.
  • Closed-world vocabulary checks catch hallucinated classes/properties that open-world OWL semantics structurally cannot flag.

Offline compile: one classification pass (~120 ms for Pizza) via any complete OWL reasoner; the shipped hot path is pure Rust with no JVM dependency. Reproduction scripts: benchmark/layer3-prototype/.

Design, measurements and envelope: docs/layer3-compiled-reasoning.md. Full benchmark methodology: docs/benchmarks.md

OAEI Ontology Alignment — Anatomy Track

OAEI is the standard benchmark for ontology alignment systems. The Anatomy track aligns the mouse anatomy ontology (2,744 classes) to the human anatomy fragment of the NCI Thesaurus (3,304 classes) against 1,516 reference mappings.

The comparison below is the complete OAEI 2025 Anatomy field, reproduced from Table 9 of the official results paper (Vol-4144, om2025-oaei-paper0), including both baselines. Open Ontologies is inserted at its measured rank. Nothing is filtered.

SystemPrecisionRecallF1
Matcha0.9510.9310.941
Agent-OM0.9590.8830.920
ALIN0.9420.8840.912
LogMapLLM0.9640.8420.899
LogMap-Bio0.8850.9110.898
MDMapper0.8990.8790.889
LogMap0.9170.8480.881
LogMapKG0.9170.8480.881
Open Ontologies0.9600.7300.829
DRAL-OA0.8300.8270.828
LogMapLt0.9620.7280.828
StringEquiv (baseline)0.9970.6220.766
LSMatch0.9520.6340.761

Read this honestly. Open Ontologies ranks 9th of 13 on F1. Its precision (0.960) is third in the field, but its recall (0.730) is second-from-bottom among non-baseline systems, and the resulting F1 sits level with LogMapLt, the deliberately lightweight lexical matcher, and 0.112 below the leader. The StringEquiv baseline reaches 0.766 by normalised string equality alone, so the margin this system earns over pure string matching is +0.063 F1. That is the number to beat, and it is not yet a competitive result.

The gap is recall, and its cause is identifiable: this system carries no domain background knowledge. Anatomy is a track where UMLS and BioPortal lookups are what separate the 0.88+ band from the rest, and every system above Open Ontologies in the table either uses biomedical background knowledge, an LLM oracle, or both. Alignment here uses 7 weighted signals (label similarity, property/parent/instance/restriction/neighbourhood overlap, embedding similarity), stable 1-to-1 matching, and a label penalty when no structural evidence is available.

The defensible finding from this track is therefore not the headline F1. It is the ablation: stable 1-to-1 matching is what makes the difference, and the signal weights are nearly irrelevant once it is applied.

ConfigurationPrecisionRecallF1
With stable matching0.9600.7300.829
Without stable matching0.1020.8460.182

Removing stable matching produces 12,557 candidates against a 1,516-mapping reference. See issues #8, #9, #10; background-knowledge integration is the open work.

OAEI Ontology Alignment — Conference Track

15 of the 21 conference-track pairs, micro-averaged:

SystemPrecisionRecallF1
ALIN0.620.680.65
LogMap0.760.560.64
Matcha0.770.530.63
Agent-OM0.640.590.61
MDMapper0.690.500.58
edna (baseline)0.740.450.56
LogMapLt0.680.470.56
LSMatch0.830.410.55
StringEquiv (baseline)0.760.410.53
Open Ontologies0.6930.3200.438

Not comparable like-for-like, and worse than it looks. The OAEI rows are Table 10 of the 2025 results paper, evaluated over all 21 pairs against the rar2 reference at each system's F1-optimal threshold. The Open Ontologies row covers 15 pairs at a fixed confidence threshold. With that caveat stated, the result is unambiguous: below every participating system and below both baselines. Best pairs are ekaw-iasted (0.588) and ekaw-sigkdd (0.533); worst is edas-sigkdd (0.211). Conference is a track where the same recall failure that costs Anatomy its rank costs more, because there is no lexical redundancy to fall back on.


IES Support

IES (Information Exchange Standard) is the UK National Digital Twin Programme's core ontology framework. It uses a 4D extensionalist (BORO) approach for modelling entities, events, states, and relationships. Open Ontologies supports the full IES stack — all three layers, SHACL shapes, and example datasets from the IES-Org GitHub repositories.

The IES Layers

The marketplace includes all three tiers of the IES framework:

onto_marketplace install ies-top     # ToLO — BORO foundations (~22 classes)
onto_marketplace install ies-core    # Core — persons, states, events (~131 classes)
onto_marketplace install ies         # Common — full ontology (511 classes, 206 properties)

Benchmark

MetricIES Common
Classes511
Object properties162
Datatype properties44
Total properties206
Triples loaded4,041
+ RDFS inferred+3,094 (+77%)
Fetch time911ms
RDFS reasoning63ms
Lint issues0

IES is the second-largest ontology in the marketplace by class count (after Schema.org). RDFS reasoning produces the richest inference gain of any non-general ontology — State, ClassOfEntity, and Event subclasses all generating deep transitive chains.

Example Data

Load IES example datasets directly from the official repositories:

onto_pull https://raw.githubusercontent.com/IES-Org/ont-ies/main/docs/examples/sample-data/event-participation.ttl
onto_pull https://raw.githubusercontent.com/IES-Org/ont-ies/main/docs/examples/sample-data/hospital.ttl
onto_pull https://raw.githubusercontent.com/telicent-oss/ies-examples/main/additional_examples/ship_movement.ttl

SHACL Validation

onto_pull https://raw.githubusercontent.com/IES-Org/ont-ies/main/docs/specification/ies-common.shacl
onto_shacl

Data Mapping: EPC → IES

The repo includes a sample of real UK Energy Performance Certificates (benchmark/epc/epc-sample.csv) with a mapping config that transforms tabular EPC data into IES-shaped RDF:

onto_load benchmark/generated/ies-building-extension.ttl
onto_ingest benchmark/epc/epc-sample.csv --mapping benchmark/epc/epc-ies-mapping.json
onto_reason --profile rdfs

This mirrors NDTP's actual pipeline: CSV → IES RDF → validate → reason → query.

IES Building Extension — Comparison with NDTP/IRIS

The repo includes an IES Building Extension built from the UK EPC data schema and building science fundamentals, using IES 4D patterns. It was built independently — without reference to any existing implementation — then compared against the NDTP/IRIS production building ontology used in government data pipelines.

MetricNDTP/IRIS (hand-built)Open Ontologies (AI-built)
Schema
Classes244525
Properties34104
Triples (raw)1,3463,229
Lint issues20
Reasoning
RDFS inferred621662
Triples after RDFS1,9673,891
Max hierarchy depth710
Avg hierarchy depth2.892.02
EPC Coverage
EPC columns covered18/36 (50%)36/36 (100%)
4D Pattern
Complete triads (Entity+State+ClassOf)14129
Enumerated individuals2214

Built blind from the 105-column EPC schema, SAP methodology, and BORO 4D extensionalism — zero reference to the IRIS implementation. The two ontologies make different trade-offs: IRIS is more tightly curated with higher average hierarchy depth (2.89 vs 2.02), reflecting deliberate grouping by domain experts. Open Ontologies covers more of the EPC data schema and applies the BORO 4D pattern more systematically across the domain.

How the hierarchy emerges from building science

The ontology's depth (max 10 levels) is not hand-tuned — it follows the natural classification that building scientists use. The EPC data schema describes heating systems as flat text fields ("Condensing gas boiler with radiators"), but the underlying domain has layered structure:

graph TD
    HS[Heating System] --> CH[Central Heating]
    HS --> NC[Non-Central / Room Heating]

    CH --> WET[Wet Central Heating<br/><i>hydronic distribution</i>]
    CH --> WA[Warm Air Central Heating<br/><i>ducted air</i>]
    CH --> EC[Electric Central Heating<br/><i>storage / underfloor</i>]

    WET --> BB[Boiler-Based]
    WET --> HP[Heat Pump]
    WET --> DH[Community / District]

    BB --> CB[Combustion Boiler]
    BB --> CHP[Micro-CHP]

    CB --> GAS["Gas boiler"]
    CB --> OIL["Oil boiler"]
    CB --> LPG["LPG boiler"]
    CB --> COND["Condensing boiler"]
    CB --> COMBI["Combi boiler"]
    CB --> BACK["Back boiler"]

    HP --> ASHP["Air source"]
    HP --> GSHP["Ground source"]
    HP --> WSHP["Water source"]

    EC --> STOR["Storage heaters"]
    EC --> PNL["Panel heaters"]
    EC --> UF["Underfloor electric"]

    NC --> FIX[Fixed Room Heater]
    NC --> PORT[Portable Heater]

    FIX --> GROOM["Gas room heater"]
    FIX --> EROOM["Electric room heater"]
    FIX --> SFROOM["Solid fuel room heater"]

    style HS fill:#1a1a2e,color:#fff
    style CH fill:#16213e,color:#fff
    style NC fill:#16213e,color:#fff
    style WET fill:#0f3460,color:#fff
    style WA fill:#0f3460,color:#fff
    style EC fill:#0f3460,color:#fff
    style BB fill:#533483,color:#fff
    style HP fill:#533483,color:#fff
    style DH fill:#533483,color:#fff
    style CB fill:#e94560,color:#fff
    style CHP fill:#e94560,color:#fff

The same pattern applies to the building fabric — heat transfer physics dictates the grouping:

graph TD
    TE[Building Thermal Envelope] --> OP[Opaque Elements<br/><i>conduction-dominated</i>]
    TE --> TR[Transparent Elements<br/><i>radiation + conduction</i>]

    OP --> WALL[Walls]
    OP --> ROOF[Roofs]
    OP --> FLOOR[Floors]

    TR --> WIN[Windows]
    TR --> DOOR[Doors]

    WALL --> MAS[Masonry Walls<br/><i>thermal mass</i>]
    WALL --> FRM[Framed Walls<br/><i>stud bridges</i>]

    MAS --> CAV["Cavity wall"]
    MAS --> SOL["Solid brick"]
    MAS --> SND["Sandstone"]
    MAS --> GRN["Granite"]
    MAS --> COB["Cob"]

    FRM --> TF["Timber frame"]
    FRM --> SYS["System-built"]
    FRM --> PH["Park home"]

    ROOF --> PIT[Pitched Roof]
    ROOF --> FLT[Flat Roof]

    PIT --> COLD["Cold roof<br/><i>insulation at ceiling</i>"]
    PIT --> WARM["Warm roof<br/><i>insulation at rafter</i>"]
    PIT --> THATCH["Thatched"]

    WIN --> SGL["Single glazed"]
    WIN --> DBL["Double glazed"]
    WIN --> TPL["Triple glazed"]
    WIN --> SEC["Secondary glazing"]

    style TE fill:#1a1a2e,color:#fff
    style OP fill:#16213e,color:#fff
    style TR fill:#16213e,color:#fff
    style WALL fill:#0f3460,color:#fff
    style ROOF fill:#0f3460,color:#fff
    style FLOOR fill:#0f3460,color:#fff
    style WIN fill:#0f3460,color:#fff
    style DOOR fill:#0f3460,color:#fff
    style MAS fill:#533483,color:#fff
    style FRM fill:#533483,color:#fff
    style PIT fill:#533483,color:#fff
    style FLT fill:#533483,color:#fff

Each level in the tree is a real building science distinction — central vs room heating, hydronic vs warm air, combustion vs electric, masonry vs framed, cavity vs solid. An independent building scientist, given the same EPC data values, produces these same intermediate groupings (verified by clean-room reproduction). RDFS reasoning traverses these chains transitively, which is why a 10-level hierarchy generates 662 inferred triples from 3,229 raw.

EPC Column Coverage Benchmark

Both ontologies tested against 36 key EPC data columns — can each ontology receive and represent the data from that column?

MetricNDTP/IRISOpen Ontologies
EPC columns covered18/36 (50%)36/36 (100%)
Triples1,3463,229

Queries derived from published DESNZ/ONS EPC statistical reports — not from either ontology's class structure. Full benchmark: benchmark/epc/

Use onto_align to map it to other domain ontologies:

onto_load benchmark/generated/ies-building-extension.ttl
onto_align <other-ontology.ttl>

Hierarchy Enforcement — Automated Inference Improvement

The hierarchy enforce pack detects flat spots in any ontology and suggests intermediate grouping classes. This is the same process used to deepen the building extension — now codified as a repeatable tool:

onto_load my-ontology.ttl
onto_enforce --pack hierarchy
# → flags classes with >5 direct children
# → reports max depth, avg depth, hierarchy density

Tested on IES Common (511 classes), the tool found 24 flat spots. A clean-room agent — with no prior context — proposed 38 intermediate grouping classes based solely on the domain meaning of the flagged children:

graph LR
    subgraph Before["IES Common — before"]
        EP1[EventParticipant] --> P1["Prosecutor"]
        EP1 --> P2["Observer"]
        EP1 --> P3["Driver"]
        EP1 --> P4["Supplier"]
        EP1 --> P5["WeaponLocation"]
        EP1 --> P6["...52 direct children"]
    end

    subgraph After["IES Common — after hierarchy enforce"]
        EP2[EventParticipant] --> R[RoleInEvent]
        EP2 --> L[LocationInEvent]
        EP2 --> A[AssetInEvent]
        R --> LR2[LegalRole]
        R --> IR[InvestigativeRole]
        R --> CR[CommercialRole]
        LR2 --> Q1["Prosecutor"]
        LR2 --> Q2["Signatory"]
        IR --> Q3["Observer"]
        IR --> Q4["Investigator"]
        CR --> Q5["Supplier"]
        CR --> Q6["Negotiator"]
        L --> Q7["WeaponLocation"]
        L --> Q8["TargetLocation"]
        A --> Q9["VehicleUsed"]
    end

    style EP1 fill:#e94560,color:#fff
    style EP2 fill:#1a1a2e,color:#fff
    style R fill:#16213e,color:#fff
    style L fill:#16213e,color:#fff
    style A fill:#16213e,color:#fff
    style LR2 fill:#0f3460,color:#fff
    style IR fill:#0f3460,color:#fff
    style CR fill:#0f3460,color:#fff
MetricBeforeAfterChange
Classes511549+38
RDFS inferred3,0943,422+328 (+10.6%)

The same tool, applied to any ontology, produces the same kind of improvement. The intermediate classes emerge from domain knowledge — not from reference to any other implementation.

Further Reading

TopicLink
IES Ecosystem Demodocs/ies-ecosystem.md
SPARQL Examplesdocs/ies-examples.md
Building Alignmentdocs/ies-alignment.md

Tools

70+ tools organized by function — available as MCP tools (prefixed onto_) and CLI subcommands:

CategoryToolsPurpose
Corevalidate load save clear stats query diff lint convert statusRDF/OWL validation, querying, and management
Repositoryrepo_list repo_loadBrowse and load ontologies from configured [general] ontology_dirs directories
Cachecache_status cache_list cache_remove unload recompileOn-disk N-Triples compile cache, idle-TTL eviction, per-name management (details)
MarketplacemarketplaceBrowse and install 33 curated W3C/ISO/industry ontologies + open community packs
Pluginsplugin_list plugin_callDiscover and invoke sandboxed community WASM plugins (--features plugins, details)
Remotepull push importFetch/push ontologies, resolve owl:imports
Schemaimport-schema sql-ingestPostgres + DuckDB → OWL + SQL → RDF ingest
Datamap ingest shacl shacl_check vocab_check reason extendStructured data → RDF pipeline; vocab_check = closed-world check that generated data uses only ontology-declared terms (catches what open-world SHACL misses)
Versioningversion history rollbackNamed snapshots and rollback
Lifecycleplan apply lock drift enforce monitor monitor-clear lineageTerraform-style change management with webhook alerts and OpenCheir governance integration
Alignmentalign align_feedback align_fuzzy align_floraCross-ontology class matching with self-calibrating weights + fuzzy-logic adjudication and end-to-end signal-driven pipeline
HNSWhnsw_buildPersisted HNSW indices (cosine + Poincaré) over class embeddings
Clinicalcrosswalk enrich validate_clinicalICD-10 / SNOMED / MeSH crosswalks (93-row sample ships in data/crosswalks.parquet; run python scripts/build_crosswalks.py to rebuild or extend)
Feedbacklint_feedback enforce_feedbackSelf-calibrating suppression
Embeddingsembed search similarityDual-space semantic search (text + Poincaré structural)
Reasoningreason dl_explain dl_check classify_elNative OWL2-DL SHOIQ tableaux + OWL-EL classification
Dynamicsaction_register action_applicable action_apply action_list action_apply_concurrent invariant_register invariant_list invariant_remove invariant_check default_register default_applyAction schemas + concurrent atomic ticks + static causal laws + default values
Causalcertify_actionFour-verdict causal certificate (EXECUTE / REJECT / EXPERIMENT / ABSTAIN); optional causal-pywhy feature enables backdoor identification
Plannerplan_compile_pddl plan_classical plan_validateCompile + validate on the server; solver (Fast Downward) is a client-side subprocess
Governancepolicy_register policy_list policy_checkAuthorisation rules; composes with certify_action
RAGsegment_retrieve graph_projection_lossy_checkTBox-slice retrieval + projection-loss auditor
Extractionextract_scaffold extract_validateSchema-guided structured-extraction prompt + validator
CQscq_run verify_cq cq_verdicts_listCompetency-question runner with pitfall hints + judgement loop
Shape inductionshape_combinatorics shape_induceProperty-combination lattice + data-driven SHACL induction
Borderline loopborderline_partition borderline_record_verdictGeneralised two-threshold review pattern for any candidate set
SQL syncsql_sync_state sql_sync_reset sql_sync_states_listCDC watermark tracking for incremental SQL ingest
Evaluationeval_alignment eval_rag eval_rag_mmragAlignment P/R/F1 + RAG Hit@k / MRR / faithfulness + dataset adapter

Extending Open Ontologies

Four extension surfaces, in increasing order of coupling — full map in ECOSYSTEM.md:

SurfaceContribution isHow
Community packsData — an ontology manifest in an open registry, installable via onto_marketplace the moment the PR merges (no release)PR to community/registry.json
Community skillsMarkdown — workflow recipes teaching agents to chain onto_* toolsPR a SKILL.md directory
Companion serversAn independent MCP server composing with this one in-session (lineage webhook, pack interchange, SPARQL endpoints) — OpenCheir is the referenceFollow the five-rule contract, PR an ECOSYSTEM.md row
WASM pluginsCode — sandboxed wasm32 tools run in-process with fuel metering, no imports, no IO, per-call capability grantsImplement ABI v1 (reference: examples/plugins/)

Everything holds the MCP-native convention: extensions provide validation and scaffolding; the connected LLM does the intelligence.


Architecture

Engine

flowchart TD
    subgraph Clients["Clients"]
        Claude["Claude / LLM\nMCP stdio"]
        CLI["CLI\nonto_* subcommands"]
        Studio["Studio\nHTTP REST"]
    end

    subgraph Server["Open Ontologies Server"]
        direction TB

        subgraph Transport["Transport Layer"]
            MCP_HTTP["MCP Streamable HTTP\n/mcp"]
            REST["REST API\n/api/query · /api/update\n/api/save · /api/load · /api/lineage"]
        end

        subgraph ToolGroups["70+ Tools"]
            direction LR
            Core["Core\nvalidate · load · save · clear\nstats · query · diff · lint\nconvert · status"]
            DataPipe["Data Pipeline\nmap · ingest · shacl\nreason · extend · import-schema"]
            Lifecycle["Lifecycle\nplan · apply · lock · drift\nenforce · monitor · lineage"]
            Advanced["Alignment + Clinical\nalign · crosswalk · enrich\nenrich · embed · search · similarity\ndl_explain · dl_check"]
            Version["Versioning\nversion · history · rollback"]
        end

        subgraph Core2["Core Engine"]
            GraphStore["Oxigraph Triple Store\nRDF/OWL in-memory\nSPARQL 1.1"]
            SQLite["SQLite\nlineage events\nversion snapshots\nlint/enforce feedback\nembedding vectors"]
            Reasoner["OWL2-DL Reasoner\nSHOIQ tableaux\nRDFS · OWL-RL"]
            Embedder["Embedding Engine\ntract-onnx (ONNX)\ntext + Poincaré structural"]
        end
    end

    subgraph External["External Sources"]
        PG["PostgreSQL\nschema import"]
        SPARQL["Remote SPARQL\nendpoints"]
        OWL["OWL URLs\nowl:imports chains"]
        Parquet["Parquet / Arrow\nclinical crosswalks\nICD-10 · SNOMED · MeSH"]
        Files["Files\nCSV · JSON · XML\nYAML · XLSX · Parquet"]
    end

    Claude -->|"MCP stdio"| MCP_HTTP
    CLI -->|"subcommands"| MCP_HTTP
    Studio -->|"sessionless"| REST

    MCP_HTTP --> ToolGroups
    REST --> ToolGroups

    ToolGroups --> GraphStore
    ToolGroups --> SQLite
    ToolGroups --> Reasoner
    ToolGroups --> Embedder

    Reasoner --> GraphStore
    Embedder --> SQLite

    DataPipe --> Files
    Advanced --> Parquet
    Core --> OWL
    Core --> SPARQL
    DataPipe --> PG

Studio

flowchart TD
    subgraph UI["React UI (Vite + Tailwind CSS)"]
        Graph["Virtualized Tree\nDOM + virtual scroll"]
        Chat["AI Chat Panel\nZustand store"]
        Inspector["Property Inspector\nInline SPARQL edit"]
        Lineage["Lineage Panel\nAudit trail"]
        Save["Named Save\n⌘S → ~/.open-ontologies/"]
    end

    subgraph Tauri["Tauri 2 Shell (Rust)"]
        IPC["Tauri IPC\ninvoke / event"]
        ChatState["ChatState\nstdin/stdout pipe"]
    end

    subgraph Engine["Engine Sidecar (Rust / Axum)"]
        MCP["/mcp — MCP Streamable HTTP\nonto_* tools"]
        REST2["/api/query · /api/update\n/api/save · /api/load-turtle\n/api/stats · /api/lineage"]
        Store["Arc&lt;GraphStore&gt;\nOxigraph"]
        DB["SQLite"]
    end

    subgraph Agent["Agent Sidecar (Node.js)"]
        SDK["Claude Opus 4.8\nAgent SDK"]
        Proto["stdin/stdout JSON protocol"]
    end

    Graph -->|"SPARQL SELECT/UPDATE · REST"| REST2
    Inspector -->|"SPARQL UPDATE · REST"| REST2
    Lineage -->|"GET /api/lineage"| REST2
    Save -->|"POST /api/save"| REST2
    Chat -->|"invoke send_chat_message"| IPC
    IPC --> ChatState
    ChatState -->|"stdin { type: chat }"| Proto
    Proto --> SDK
    SDK -->|"MCP tools/call"| MCP
    SDK -->|"stdout { type: text/tool_call/done }"| Proto
    Proto -->|"Tauri emit agent-message"| Chat
    MCP --> Store
    REST2 --> Store
    Store --> DB

Design decisions

DecisionReason
UI reads use sessionless RESTNo MCP session management needed for SPARQL queries or stats
UI writes use REST /api/update + /api/saveAvoids session lifecycle issues in the Tauri WebKit webview
Agent writes go through MCP tools/callThe Agent SDK manages its own MCP session; Claude needs the full tool set
Shared Arc<GraphStore>All MCP sessions and REST handlers share the same in-memory triple store
Agent sidecar over stdin/stdoutKeeps Node.js isolated; Tauri manages the full lifecycle

Stack

LayerTech
Engine languageRust (edition 2024) — single binary, no JVM
Triple storeOxigraph 0.4 — pure Rust RDF/SPARQL 1.1 engine
MCP protocolrmcp — Streamable HTTP transport
State / lineage / feedbackSQLite (rusqlite)
Clinical crosswalksApache Arrow / Parquet
Embeddings runtimetract-onnx — pure Rust ONNX (optional)
Desktop shellTauri 2
FrontendReact 19, Vite 7, TypeScript 5.8, Tailwind CSS 4
Tree viewVirtualized DOM tree with virtual scroll (no canvas/WebGL dependencies)
UI stateZustand 5
AI agentClaude Opus 4.8 via Agent SDK (Node.js sidecar)

Documentation

TopicLink
Quickstartdocs/quickstart.md
Data Pipelinedocs/data-pipeline.md
Ontology Lifecycledocs/lifecycle.md
Schema Alignmentdocs/alignment.md
OWL2-DL Reasoningdocs/reasoning.md
Semantic Embeddingsdocs/embeddings.md
Clinical Crosswalksdocs/clinical.md
IES Ecosystemdocs/ies-ecosystem.md
IES SPARQL Examplesdocs/ies-examples.md
IES:Building Alignmentdocs/ies-alignment.md
Benchmarksdocs/benchmarks.md
Determinism & corrected resultsdocs/determinism.md
ContributingCONTRIBUTING.md
ChangelogCHANGELOG.md

Citation

Open Ontologies is described in a preprint. The alignment engine implements the stable-matching method introduced there; the Causal layer builds on the intervention-verification framework of CIVeX.

  • Open Ontologies: Tool-Augmented Ontology Engineering with Stable Matching Alignment. Fabio Rovai, 2026. arXiv:2605.09184
  • CIVeX: Causal Intervention Verification for Language Agents. Fabio Rovai, 2026. arXiv:2605.09168
@article{rovai2026openontologies,
  title   = {Open Ontologies: Tool-Augmented Ontology Engineering with Stable Matching Alignment},
  author  = {Rovai, Fabio},
  journal = {arXiv preprint arXiv:2605.09184},
  year    = {2026},
  doi     = {10.48550/arXiv.2605.09184},
  url     = {https://arxiv.org/abs/2605.09184}
}

See CITATION.cff for machine-readable metadata. It powers GitHub's "Cite this repository" button.


Maintainer

Maintained by The Tesseract Academy (Kampakis and Co Ltd), a UK research and data-science practice. Applied case studies built with this toolkit are published in the Tesseract Foundational Research programme.

License

MIT

Open Ontologies on Glama


Sponsor

If this work is useful to you, you can support its continued development through GitHub Sponsors.

Frequently Asked Questions

What is open-ontologies?

open-ontologies is an open-source mcp servers skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by fabio-rovai. AI-native ontology engine: a Rust MCP server with tools for building, validating, querying, and reasoning over RDF/OWL ontologies. In-memory Oxigraph triple store, native OWL2-DL tableaux reasoner, SHACL validation, SPARQL, versioning. Single binary, no JVM. It has 434 GitHub stars.

Is open-ontologies safe to use?

Yes. open-ontologies passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.

How do I install open-ontologies?

Clone the repository with "git clone https://github.com/fabio-rovai/open-ontologies" and add it to your Claude Code skills directory (see the Installation section above). open-ontologies ships a SKILL.md manifest, so compatible agents can discover and load it automatically.

What programming language is open-ontologies written in?

open-ontologies is primarily written in Rust. It is open-source under fabio-rovai on GitHub, so you can review or fork the full source.

Are there alternatives to open-ontologies?

Yes. SkillsLLM lists many other MCP Servers skills you can browse and compare side by side. Open the MCP Servers category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh open-ontologies against similar tools.

Comments (0)

No comments yet. Be the first to share your thoughts!

n8n

by n8n-io

12

Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.

201,88160,308TypeScript
MCP Serversapisai-tools
View details

Scrapling

by D4Vinci

🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!

75,9137,581Python
MCP Servers
View details

TrendRadar

by sansan0

⭐AI-driven public opinion & trend monitor with multi-platform aggregation, RSS, and smart alerts.🎯 告别信息过载,你的 AI 舆情监控助手与热点筛选工具!聚合多平台热点 + RSS 订阅,支持关键词精准筛选。AI 智能筛选新闻 + AI 翻译 + AI 分析简报直推手机,也支持接入 MCP 架构,赋能 AI 自然语言对话分析、情感洞察与趋势预测等。支持 Docker ,数据本地/云端自持。集成微信/飞书/钉钉/Telegram/邮件/ntfy/bark/slack 等渠道智能推送。

61,65224,883Python
MCP Servers
View details

context7

by upstash

Context7 Platform -- Up-to-date code documentation for LLMs and AI code editors

61,0602,938TypeScript
MCP Servers
View details

High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph — average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

39,9393,219C
MCP Servers
View details

Developers Also Liked

Based on votes and bookmarks from developers who liked this skill

ECC

by affaan-m

10

The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

242,21936,702JavaScript
AI Agentsai-agentsanthropicclaude-code
View details
15

An agentic skills framework & software development methodology that works.

234,96620,863Shell
AI Agentsai-agentsbrainstorming
View details

n8n

by n8n-io

12

Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.

201,88160,308TypeScript
MCP Serversapisai-tools
View details

The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

185,94028,768JavaScript
AI Agentsai-agentsanthropicclaude-code
View details

cc-switch

by farion1231

3

A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io

128,8688,826Rust
AI Agentsclaude-codeai-tools
View details