Ontolearn
OWL Class Expressions Learning in Python
Install / Use
/learn @dice-group/OntolearnREADME

Ontolearn: Learning OWL Class Expressions
Ontolearn is an open-source software library for learning owl class expressions at large scale.
Given positive and negative OWL named individual examples $E^+$ and $E^-$, learning OWL Class expression problem refers to the following supervised Machine Learning problem
$$\forall p \in E^+\ \mathcal{K} \models H(p) \wedge \forall n \in E^-\ \mathcal{K} \not \models H(n).$$
To address this supervised learning problem, OntoLearn provides a diverse suite of learning algorithms, including symbolic, neuro-symbolic, and deep learning-based approaches:
- TDL → Tree-based OWL Class Expression Learner for Large Graphs
- Drill → Neuro-Symbolic Class Expression Learning
- EvoLearner → EvoLearner: Learning Description Logics with Evolutionary Algorithms
- NCES2 → Neural Class Expression Synthesis in $\mathcal{ALCHIQ^{(D)}}$
- ROCES → Robust Class Expression Synthesis in Description Logics via Iterative Sampling
- NCES → Neural Class Expression Synthesis
- NERO → Learning Permutation-Invariant Embeddings for Description Logic Concepts
- CLIP → Learning Concept Lengths Accelerates Concept Learning in $\mathcal{ALC}$
- CELOE → Class Expression Learning for Ontology Engineering
- OCEL → A limited version of CELOE
- SPELL → SAT-Based PAC Learning of Description Logic Concepts
- ALCSAT → SAT-Based Bounded Fitting for the Description Logic $\mathcal{ALC}$
Find more in the Documentation.
DeepWiki can also help you get started with Ontolearn.
Installation
For CPU-only (recommended for most users):
pip install ontolearn --extra-index-url https://download.pytorch.org/whl/cpu
For NVIDIA CUDA-enabled GPUs (full installation):
pip install ontolearn
or
git clone https://github.com/dice-group/Ontolearn.git
# To create a virtual python env with conda
conda create -n venv python=3.10.14 --no-default-packages && conda activate venv && pip install -e .
# To download knowledge graphs
wget https://files.dice-research.org/projects/Ontolearn/KGs.zip -O ./KGs.zip && unzip KGs.zip
# To download learning problems
wget https://files.dice-research.org/projects/Ontolearn/LPs.zip -O ./LPs.zip && unzip LPs.zip
Learning OWL Class Expressions
from ontolearn.learners import TDL
from ontolearn.triple_store import TripleStore
from ontolearn.knowledge_base import KnowledgeBase
from ontolearn.learning_problem import PosNegLPStandard
from owlapy.owl_individual import OWLNamedIndividual
from owlapy import owl_expression_to_sparql, owl_expression_to_dl
# (1) Initialize Triplestore or KnowledgeBase
# sudo docker run -p 3030:3030 -e ADMIN_PASSWORD=pw123 stain/jena-fuseki
# Login http://localhost:3030/#/ with admin and pw123 and upload KGs/Family/family.owl
# kb = TripleStore(url="http://localhost:3030/family")
kb = KnowledgeBase(path="KGs/Family/father.owl")
# (2) Initialize a learner.
model = TDL(knowledge_base=kb, use_nominals=True)
# (3) Define a description logic concept learning problem.
lp = PosNegLPStandard(pos={OWLNamedIndividual("http://example.com/father#stefan")},
neg={OWLNamedIndividual("http://example.com/father#heinz"),
OWLNamedIndividual("http://example.com/father#anna"),
OWLNamedIndividual("http://example.com/father#michelle")})
# (4) Learn description logic concepts best fitting (3).
h = model.fit(learning_problem=lp).best_hypotheses()
print(h)
print(owl_expression_to_dl(h))
print(owl_expression_to_sparql(expression=h))
"""
OWLObjectSomeValuesFrom(property=OWLObjectProperty(IRI('http://example.com/father#','hasChild')),filler=OWLObjectOneOf((OWLNamedIndividual(IRI('http://example.com/father#','markus')),)))
∃ hasChild.{markus}
SELECT
DISTINCT ?x WHERE {
?x <http://example.com/father#hasChild> ?s_1 .
FILTER ( ?s_1 IN (
<http://example.com/father#markus>
) )
}
"""
print(model.classification_report)
"""
Classification Report: Negatives: -1 and Positives 1
precision recall f1-score support
Negative 1.00 1.00 1.00 3
Positive 1.00 1.00 1.00 1
accuracy 1.00 4
macro avg 1.00 1.00 1.00 4
weighted avg 1.00 1.00 1.00 4
"""
Learning OWL Class Expressions over DBpedia
from ontolearn.learners import TDL, Drill
from ontolearn.triple_store import TripleStore
from ontolearn.learning_problem import PosNegLPStandard
from owlapy.owl_individual import OWLNamedIndividual
from owlapy import owl_expression_to_sparql, owl_expression_to_dl
from ontolearn.utils.static_funcs import save_owl_class_expressions
# (1) Initialize Triplestore
kb = TripleStore(url="https://dbpedia.data.dice-research.org/sparql")
# (3) Initialize a learner.
model = Drill(knowledge_base=kb) # or TDL(knowledge_base=kb)
# (4) Define a description logic concept learning problem.
lp = PosNegLPStandard(pos={OWLNamedIndividual("http://dbpedia.org/resource/Angela_Merkel")},
neg={OWLNamedIndividual("http://dbpedia.org/resource/Barack_Obama")})
# (5) Learn description logic concepts best fitting (4).
h = model.fit(learning_problem=lp).best_hypotheses()
print(h)
print(owl_expression_to_dl(h))
print(owl_expression_to_sparql(expression=h))
save_owl_class_expressions(expressions=h,path="#owl_prediction")
Fore more please refer to the examples folder.
ontolearn-webservice
<details><summary> Click me! </summary>The webservice exposes a lightweight HTTP/JSON API for running Ontolearn learners remotely.
Start it with a local knowledge base or a remote triplestore.
Submit learning problems as JSON to the /cel endpoint
(e.g., POST http://<host>:8000/cel with pos, neg, model
and optional parameters for the particular model like path_embeddings, max_runtime, etc.).
The service returns learned OWL class expressions (DL and SPARQL/OWL serializations)
and performance metrics in the JSON response.
Local Dataset
ontolearn-webservice --path_knowledge_base KGs/Mutagenesis/mutagenesis.owl
Remote Dataset
ontolearn-webservice --endpoint_triple_store <your_triples_store_sparql_endpoint>
Some leads to hosting your own triplestore endpoint:
- https://docs.tentris.io/binary/load.html
- https://ontolearn-docs-dice-group.netlify.app/usage/04_knowledge_base#loading-and-launching-a-triplestore
Using the Webservice
DRILL
The below code trains DRILL with 6 randomly generated learning problems provided that path_to_pretrained_drill does not lead to a directory containing pretrained DRILL. Thereafter, trained DRILL is saved in the directory path_to_pretrained_drill. Finally, trained DRILL will learn an OWL class expression.
import json
import requests
with open(f"LPs/Mutagenesis/lps.json") as json_file:
learning_problems = json.load(json_file)["problems"]
for str_target_concept, examples in learning_problems.items():
response = requests.get('http://0.0.0.0:8000/cel',
headers={'accept': 'application/json', 'Content-Type': 'application/json'},
json={"pos": examples['positive_examples'],
"neg": examples['negative_examples'],
"model": "Drill",
"path_embeddings": "mutagenesis_embeddings/Keci_entity_embeddings.csv",
"path_to_pretrained_drill": "pretrained_drill",
# if pretrained_drill exists, upload, otherwise train one and save it there
"num_of_training_learning_problems": 2,
"num_of_target_concepts": 3,
"max_runtime": 60000, # seconds
"iter_bound": 1 # number of iterations/applied refinement opt.
})
print(response.json()) # {'Prediction': '∀ hasAtom.(¬Nitrogen-34)', 'F1': 0.7283582089552239, 'saved_prediction': 'Predictions.owl'}
TDL
TDL (a more scalable learne
Related Skills
proje
Interactive vocabulary learning platform with smart flashcards and spaced repetition for effective language acquisition.
YC-Killer
2.7kA library of enterprise-grade AI agents designed to democratize artificial intelligence and provide free, open-source alternatives to overvalued Y Combinator startups. If you are excited about democratizing AI access & AI agents, please star ⭐️ this repository and use the link in the readme to join our open source AI research team.
best-practices-researcher
The most comprehensive Claude Code skills registry | Web Search: https://skills-registry-web.vercel.app
groundhog
398Groundhog's primary purpose is to teach people how Cursor and all these other coding agents work under the hood. If you understand how these coding assistants work from first principles, then you can drive these tools harder (or perhaps make your own!).
