# Lab: More OWL

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

# Lab 13: More OWL

## Topics

OWL ontology programming with RDFlib.

## Classes and methods

In Lab 8 you have already used these OWL concepts:

• (sameAs, equivalentClass, equivalentProperty, differentFrom, disjointWith, inverseOf)
• (ReflexiveProperty, IrreflexiveProperty, SymmetricProperty, AsymmetricProperty, TransitiveProperty, FunctionalProperty, InverseFunctionalProperty),

In this lab you will mostly use the following OWL terms:

• (oneOf, unionOf, intersectionOf. complementOf)
• (Restriction, onProperty)
• (someValuesFrom, allValuesFrom, hasValue)
• (cardinality, minCardinality, maxCardinality)
• (qualifiedCardinality, minQualifiedCardinality, maxQualifiedCardinality, onClass)

# OWL Restrictions

Most of the tasks today involve restrictions.

I Recommend refreshing your memories on restrictions and complex classes from the lecture notes When solving the tasks look at the notes, find the relevant OWL term/s, and try to use the same principles in python code.

Down below is an example solution of the first task: "anyone who is a graduate has at least one degree". It looks complicated, but once you understand it, the other tasks follow a similar pattern. In short: I create a blank node that is an OWL.restriction on the ex.degree property. The restriction in question is a minCardinaality restriction with the value 1. (e.g "at least one") Then I create another blank node that is for a List of all the criteria that makes a person a Graduate. In this case I say that a Graduate is the intersection of a Person and the restriction we creater earlier. Collection is essentially used to create lists and everything between [] is what is in the list (the intersections).

# anyone who is a graduate has at least one degree

br = BNode()
bi = BNode()
Collection(g, bi, [ex.Person, br])

Create or Extend a previous graph into an ontology that expresses the following using concepts from OWL (and some from RDF/RDFS):

• 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 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 masters student takes only master courses and at most one bachelor course
• a Ph.D student takes only Ph.D and at most two masters courses
• a Ph.D. student cannot take a bachelor course

Write each of the above statements as python code using RDFlib and OWL.

## Code to get started

import owlrl
from rdflib import Graph, Literal, Namespace, BNode
from rdflib.namespace import RDF, OWL, RDFS
from rdflib.collection import Collection

g = Graph()
ex = Namespace("http://example.org/")
g.bind("ex", ex)
g.bind("owl", OWL)

# anyone who is a graduate has at least one degree
br = BNode()
bi = BNode()
Collection(g, bi, [ex.Person, br])

# Continue here with the other statements:

print(g.serialize(format="turtle").decode())

## If You Have More Time

Populate the ontology with data. E.g like:

Use owlrl like we did in lab 8 to infer additional triples. IMPORANT: It seems owlrl is unable to reason with OWL Restrictions and perhaps other concepts as well. There is a python library for better OWL reasoning called Owlready if you want to reason with restrictions. Below I print the ontology before and after the reasoning.