An ontology is a formal description of the kinds of things in a domain and the relationships among them. Ontology design patterns are reusable templates for common modelling situations — taxonomies, parts-of-things, time-stamped facts, n-ary relationships.
Most knowledge-graph projects in 2026 don't use formal ontologies (OWL, RDFS) directly. They use lighter property-graph schemas with informal modelling guidelines. But the patterns from the formal-ontology tradition still inform good schema design.
Specific cases:
Most enterprise knowledge graphs don't fit these cases. They benefit from ontology-style thinking without ontology-style formalism.
The simplest pattern: types organised in an is-a hierarchy.
Vehicle
├── Car
│ ├── Sedan
│ ├── SUV
│ └── Hatchback
├── Truck
└── Motorcycle
In RDFS / OWL, rdfs:subClassOf. In a property graph, multiple labels or a parent_class relationship.
Patterns to follow:
(:Car {fuel:'electric'}) rather than :ElectricCar if "electric" is a property.Modelling parts of things:
Engine -[:PART_OF]-> Car
Wheel -[:PART_OF]-> Car
Cylinder -[:PART_OF]-> Engine
Subtleties:
Things belonging to groups, roles, categories:
Alice -[:MEMBER_OF]-> EngineeringTeam
Alice -[:HAS_ROLE]-> Manager
Alice -[:WORKS_FOR]-> Anthropic
Pattern: use distinct relationship types for distinct membership concepts. Don't overload MEMBER_OF to mean both "is in this team" and "has this role."
Most facts are true at a particular time. The CEO of a company changes; the price of a product changes; a relationship is established and ended.
Three approaches:
A relationship becomes its own node:
(Dario)-[:HOLDS_POSITION]->(position_1)
position_1 :Position {role:'CEO', company:'Anthropic', from:2021}
Pros: time, source, confidence all attached cleanly. Cons: more nodes; queries are more verbose.
Properties on the edge:
(Dario)-[:CEO_OF {since:2021, until:NULL, source:'web'}]->(Anthropic)
Pros: less verbose; queries simpler. Cons: limited support for time-querying patterns.
Each fact gets a separate row with valid_from / valid_until. See DatabaseDesign.
For most modern KGs, edge properties suffice. Reified relationships are formally cleaner but heavier.
A relationship that involves more than two things:
"In 2021, Anthropic, with Series A funding from Google, founded its San Francisco office."
Two entities (Anthropic, Google), a relation (funded), a year (2021), an event (founding office).
Modelling options:
(event_1) -[:HAPPENED_IN]-> (2021)
(event_1) -[:INVOLVES]-> (Anthropic)
(event_1) -[:FUNDED_BY]-> (Google)
(event_1) -[:ESTABLISHED]-> (SF_office)
Reified n-ary relationships are how RDF/OWL handle this; property graphs increasingly adopt the same pattern.
Where did this fact come from? Critical for any KG that ingests from multiple sources.
Patterns:
since, source, confidence, extraction_method, extracted_at.For agentic / RAG use cases, provenance is non-negotiable. Without it, you can't tell "the model said this from training data" from "the KG said this from a verified source."
Same entity in different sources, or the same entity referred to differently:
owl:sameAs in RDF: declares two URIs refer to the same thing.This is also where the "open-world" vs "closed-world" assumption matters. Open world: absence of a fact doesn't mean it's false. Closed world: everything I haven't said is false. KGs typically operate open-world; SQL databases closed-world. Mismatching produces bugs.
For most teams in 2026 building a KG, the formal-ontology toolkit (OWL, RDF, SPARQL) is overkill. Lighter alternatives:
Document your KG's vocabulary in a wiki or schema-as-code (a Markdown file, a YAML schema, dbt docs).
node_types:
Person:
description: A natural person
properties: [name, email, birth_year]
Company:
description: A legal entity
properties: [name, founded_year, headquarters]
edge_types:
WORKS_AT:
description: Employment
source: Person
target: Company
properties: [role, start_date, end_date]
Enforced by code at ingestion. No reasoner required; constraints are concrete.
For structured KGs, validate insertions against the schema:
Tools: pydantic for Python; JSON Schema; custom validators. Reject malformed data at insertion.
If you need some formal-ontology benefits without full RDF/OWL:
This gives interoperability and shared vocabulary without committing to the full semantic-web stack.
Thing → Object → ... → SmartphoneCase. The deeper the hierarchy, the less it helps.For a new KG project:
You'll have an ontology, just an informal one. That's usually enough.