Lab: Even More OWL
Lab 12: Even more OWL
Topics
OWL ontology programming with owlready2.
Classes and methods
In an earlier lab, you have already used these OWL concepts:
- (sameAs, equivalentClass, equivalentProperty, differentFrom, disjointWith, inverseOf)
- (ReflexiveProperty, IrreflexiveProperty, SymmetricProperty, AsymmetricProperty, TransitiveProperty, FunctionalProperty, InverseFunctionalProperty),
- (oneOf, unionOf, intersectionOf. complementOf)
- (Restriction, onProperty)
- (someValuesFrom, allValuesFrom, hasValue)
- (cardinality, minCardinality, maxCardinality)
- (qualifiedCardinality, minQualifiedCardinality, maxQualifiedCardinality, onClass)
Owlready2
This lab will re-write the same OWL expressions as in an earlier lab, but using owlready2 instead of rdflib.
The Project description and section What can I do with Owlready2? gives a brief introduction to installing and getting started with owlready2. You will find more documentation at Welcome to Owlready2's Documentation
For example:
# A graduate is a student with at least one degree.
with onto:
class Student(Thing): pass
class Degree(Thing): pass
class hasDegree(Student >> Degree): pass
class Graduate(Student):
is_a = [hasDegree.some(Degree)]
Tasks
Re-write the same OWL expressions as in an earlier lab, but using owlready2 instead of rdflib:
- anyone who is a graduate has at least one degree
- anyone who is a university graduate has at least one degree from a university
- a grade is either an A, B, C, D, E or F
- a straight A student is a student that has only A grades
- a graduate has no F grades
- a student has a unique student number
- each student has exactly one average grade
- a course is either a bachelor, a master or a Ph.D course
- a bachelor student takes only bachelor courses
- a master student takes only master courses, except for at most one bachelor course
- a Ph.D student takes only Ph.D courses, except for at most two masters courses
- a Ph.D. student cannot take any bachelor course
Code to get started
(These need more testing!)
Load an ontology (will remember ontologies between sessions):
BASE = 'http://info216.uib.no/owlready2-lab/'
onto = get_ontology(BASE)
Empty an ontology (otherwise owlready2 remembers ontologies between sessions!):
def clean_onto(onto):
with onto:
for ind in onto.individuals():
destroy_entity(ind)
for prop in onto.properties():
destroy_entity(prop)
for cls in onto.classes():
destroy_entity(cls)
Print an ontology:
def onto2graph(onto):
graph = Graph()
onto.save('temp_owlready2/temp.nt', format='ntriples')
graph.parse('temp_owlready2/temp.nt', format='ntriples')
return graph
def print_onto(onto):
g = onto2graph(onto)
g.bind('', Namespace(BASE))
print(g.serialize(format='ttl'))
To print an ontology without standard triples (you must first define _empty_graph at the beginning of the program:
clean_onto(onto)
_empty_graph = onto2graph(onto)
def print_onto(onto):
g = onto2graph(onto)
for t in _empty_graph:
if t in g:
g.remove(t)
g.bind('', Namespace(BASE))
print(g.serialize(format='ttl'))
If You Have More Time
Populate the ontology with individals, such as:
with onto:
cade = Student()
infosci = Degree()
cade.hasDegree.append(infosci)
Try to use Hermit as in the lecture to infer additional triples. IMPORANT: Neither Hermit/Pellet nor OWL-RL are able to reason with the full OWL-DL. But unlike OWL-RL, Owlready2 supports reasoning over many types of restrictions.
Useful readings
- Project description and What can I do with Owlready2?
- Welcome to Owlready2's Documentation