Skip to main content
A minimal guide to using OWL ontologies to ground Cognee’s knowledge graphs. You’ll point Cognee at an ontology file during cognify and then ask ontology-aware questions. Before you start:
  • Complete Quickstart to understand basic operations
  • Read Ontologies to understand the concepts
  • Ensure you have LLM Providers configured
  • Have an OWL ontology file (.owl) in RDF/XML format
  • Have some text or files relevant to the ontology’s domain

What Ontology Support Does

  • Grounds entities and relations to your OWL ontology (classes, individuals, properties)
  • Validates types via ontology domains/ranges and class hierarchy
  • Improves graph completion answers for domain-specific queries

Step 1: Prepare an Ontology File

Start from a simple OWL file. Minimal ingredients:
  • Classes (e.g., TechnologyCompany, Car)
  • Individuals (e.g., Apple, Audi)
  • Object properties with domain/range (e.g., produces with domain=CarManufacturer, range=Car)
Example ontology files:
  • examples/python/ontology_input_example/basic_ontology.owl
  • examples/python/ontology_input_example/enriched_medical_ontology_with_classes.owl
Use any RDF/OWL editor (Protégé) to edit .owl files.
This example uses a simple ontology for demonstration. In practice, you can work with larger, more complex ontologies - the same approach works regardless of ontology size or complexity.

Step 2: Add Your Data

Add either raw text or a directory. Keep it relevant to your ontology.
import cognee

texts = [
    "Audi produces the R8 and e-tron.",
    "Apple develops iPhone and MacBook."
]

await cognee.add(texts)
# or: await cognee.add("/path/to/folder/of/files")
This simple example uses a list of strings for demonstration. In practice, you can add multiple documents, files, or entire datasets - the ontology processing works the same way across all your data.

Step 3: Cognify Your Data + Ontologies

Create the config which contains the information about the ontology, to ground extracted entities/relations to the ontology. Then, simply pass the config to the cognify operation.
import os
from cognee.modules.ontology.ontology_config import Config
from cognee.modules.ontology.rdf_xml.RDFLibOntologyResolver import RDFLibOntologyResolver

ontology_path = os.path.join(
    os.path.dirname(os.path.abspath(__file__)), "ontology_input_example/basic_ontology.owl"
)

# Create full config structure manually
config: Config = {
    "ontology_config": {
        "ontology_resolver": RDFLibOntologyResolver(ontology_file=ontology_path)
    }
}

await cognee.cognify(config=config)
If omitted, Cognee builds a graph without ontology grounding. With an ontology, Cognee aligns nodes to classes/individuals and enforces property domain/range.

Step 4: Ask Ontology-aware Questions

Use SearchType.GRAPH_COMPLETION to get answers that leverage ontology structure.
from cognee.api.v1.search import SearchType

result = await cognee.search(
    query_type=SearchType.GRAPH_COMPLETION,
    query_text="What cars and their types are produced by Audi?",
)
print(result)
Phrase questions using ontology terms (class names, individual names, property language like “produces”, “develops”). If results feel generic, check that the ontology contains the expected classes/individuals and that your data mentions them.

Hot Reload and File Updates

Ontology files are parsed once at initialization — when RDFLibOntologyResolver is constructed, it reads and parses the file with RDFLib and caches the result in memory. There is no automatic file system monitoring, so changes to the .owl file on disk are not picked up while a session or server is running.

Code in Action

  • Basic ontology demo script can be found on the following link
  • Advanced ontology demo script can be found on the following link

Core Concepts

Understand ontology fundamentals

API Reference

Explore ontology API endpoints