Reasoning & Validation
A knowledge graph earns its keep when it can tell you things nobody explicitly wrote down, and refuse to accept things that contradict the model. Those are the two halves of this page: inference (derive) and SHACL validation (check).Inference Levels
Every SPARQL query can request a reasoning level:
Configure the default with
RDF_DEFAULT_INFERENCE_LEVEL, and enable inference at all with RDF_INFERENCE_ENABLED. Callers can override per query (inference= on the REST endpoint, inferenceLevel on the MCP tool).
GET /api/v1/rdf/status reports which levels are available and what the default is.
Two Execution Strategies
In-process inference builds a Jena inference model over the dataset in memory at query time. Accurate for any level, but bounded: if the store exceedsRDF_MAX_IN_MEMORY_INFERENCE_TRIPLES (default 100,000), the query silently falls back to direct execution without inference and returns a warning field saying so. Enable cacheInferredTriples to reuse bounded in-memory models for 60 seconds.
Materialized inference (RDF_MATERIALIZED_INFERENCE_ENABLED=true) runs each rule as a SPARQL CONSTRUCT inside the triple store and writes the results to a durable named graph, one per rule. Queries then read materialized triples with no in-memory model at all.
Materialized Inference Rules
A rule is a SPARQLCONSTRUCT query with a name, priority, and enabled flag. Its output lands in https://open-metadata.org/graph/inferred/{rule}.
The Starter Pack
Four rules ship and are always present:transitive-lineage-closure, priority 100, tag: lineage
transitive-lineage-closure, priority 100, tag: lineage
Materializes indirect lineage by walking
prov:wasDerivedFrom transitively, so SPARQL can answer “all upstream tables of dashboard X” without users writing property paths.schema-tag-inheritance, priority 300, tag: governance
schema-tag-inheritance, priority 300, tag: governance
Propagates tags down the containment hierarchy: a tag on a
DatabaseSchema is inherited by every Table in it, and a tag on a Table by every Column. Inferred tags carry om:inferredTagSource.domain-membership-inheritance, priority 400, tag: governance
domain-membership-inheritance, priority 400, tag: governance
If a
Table belongs to a Domain, every Column of that table inherits the membership, so om:belongsToDomain queries return both table- and column-level results without a separate lookup.Managing Rules
All admin-only.
Dirty tracking: when source RDF changes after a successful materialization, the rule is flagged
dirty, and GET /api/v1/rdf/rules reports that flag alongside tripleCount and lastMaterializedAt. Staleness is therefore always visible rather than silent.
Running the Materializer
Materialization is done by an application, not by the query path. RDF Inference Materialization (RdfInferenceApp) appears under Settings → Applications once RDF is enabled.
- Schedule: every 5 minutes by default. It picks up rules whose dirty flag is set and rebuilds only those.
- Execution: each rule runs as a SPARQL
CONSTRUCTinside Fuseki, writing to that rule’s named graph. No triples pass through the Collate JVM, so materialization cost does not scale with server heap.
Writing Your Own Rule
Explaining an Inference
When materialized inference is on, the Ontology Studio relation panel shows an inference explanation for a derived relation, which rules contributed, how many triples each produced, and when they last ran.POST /api/v1/ontology/reasoning/explanations exposes the same thing over the API.
This matters more than it sounds. An inferred PII tag that nobody can explain is a compliance problem, not a feature.
Custom Ontology Extensions
Extend the canonical ontology with your own classes and properties without forking it. Extensions live in a reserved namespace,https://open-metadata.org/ontology-extension/, so a custom class can never collide with a core om: term or be mistaken for one.
Each extension declares custom OWL classes and properties (object or datatype) with a description explaining why they are needed. Validation rejects URIs outside the extension namespace.
Prefer modeling in the ontology (concepts and relationship types) over extending the catalog vocabulary. Extensions are for describing kinds of metadata Collate does not have, not for describing your business, which is what the ontology is for.
SHACL Validation
SHACL (Shapes Constraint Language) is the graph equivalent of a schema check. Collate ships canonical shapes atrdf/shapes/openmetadata-shapes.ttl, loaded into https://open-metadata.org/graph/shapes, covering base entity constraints (every entity has exactly one id, one name matching ^[a-zA-Z0-9_-]+$, one FQN, at most one description, a positive version) plus per-class shapes for tables, columns, and the rest.
Running It
sh:ValidationReport in Turtle (default) or JSON-LD. An OM-SHACL-Conforms response header carries the boolean verdict, so CI can gate on it without parsing the body.
Agents call the same thing through the shacl_validate MCP tool, which additionally returns conforms and violationCount in full even when the report body is truncated.
Validation Modes
RDF_SHACL_VALIDATION_MODE controls the policy:
Validation never blocks the write path. SHACL here is a diagnostic, not a gate on entity creation, a platform that refuses to ingest a table because of a shape violation is worse than one that ingests it and tells you.
ENFORCE_IMPORTS is the one place strictness is opt-in, because a malformed imported ontology corrupts a model rather than one row.OWL Profile Guardrails
RDF_STRICT_OWL_PROFILE=true (the default) makes Collate reject authored axioms outside the supported OWL 2 DL profile. This is not pedantry: OWL Full is undecidable, and a reasoner over an undecidable ontology can run forever. The guardrail is what keeps OWL_DL inference a bounded operation.
Next
Graph Insights
Centrality, communities, and paths over the materialized graph.
Knowledge Graph API
Every endpoint, with parameters.