Hi,
I am working on extending an ontology to select particular groups of
equivalent classes from the base ontology, for validation of an ontology
instance. I have come across a situation which doesn't seem to be solvable
within OWL 2 DL, and as far as I can tell, there are no OWL 2 Full reasoners
available.
This is the base ontology:
SubClassOf(Page Destination)
ObjectPropertyDomain(events Page)
ObjectPropertyRange(events Event)
ObjectPropertyDomain(action Event)
ObjectPropertyRange(action Action)
ObjectPropertyDomain(to Action)
ObjectPropertyRange(to Destination)
DataPropertyDomain(name Event)
DataPropertyRange(name xsd:string)
That is, a Page (subclass of Destination) can have an Event, which has an
Action, which has a reference to another Destination.
What I would like to achieve is select all cycles in ontology instances,
i.e. all Pages that have an Event/Action chain that eventually points to
itself - a cycle of event/action redirections.
I define an equivalent subclass EventAccess which is all Events with the
name "access":
SubClassOf(EventAccess Event)
EquivalentClasses(EventAccess ObjectIntersectionOf(DataHasValue(name
"access") Event))
In order to select this class later, I assert that all of these classes have
a new "isAccessEvent" property, thanks to the OWA:
Declaration(ObjectProperty(isAccessEvent))
SubClassOf(EventAccess ObjectSomeValuesFrom(isAccessEvent owl:Thing))
I then define a subclass of Page called PageRedirects, which represents a
Page that contains an Event, which has an Action, that points to another
Page.This is achieved though property chains, and uses the "property o
inv(property)" approach of selecting a particular class. This "pageAccessTo"
property, which points to the possible Pages that this Page may redirect to,
is also defined as transitive.
Declaration(ObjectProperty(pageAccessTo))
TransitiveObjectProperty(pageAccessTo)
ObjectPropertyDomain(pageAccessTo Page)
ObjectPropertyRange(pageAccessTo Page)
SubObjectPropertyOf(SubObjectPropertyChain(events isAccessEvent
InverseObjectProperty(isAccessEvent) action to) pageAccessTo)
Declaration(Class(PageRedirects))
EquivalentClasses(PageRedirects
ObjectIntersectionOf(ObjectSomeValuesFrom(pageAccessTo Page) Page))
SubClassOf(PageRedirects Page)
Up to this stage, there is no problem. I can create individuals in Protege
and use the FaCT reasoner, and the Pellet reasoner, to infer that
individuals are correctly equivalent to PageRedirects.
However, now I want to select all PageRedirects which eventually redirect to
itself, using the transitive property above. I define an equivalent class
CyclicPage, which is all PageRedirects which redirects to itself:
EquivalentClasses(CyclicPage
ObjectIntersectionOf(ObjectExistsSelf(pageAccessTo) PageRedirects))
SubClassOf(CyclicPage PageRedirects)
This is where the ontology fails. On further investigation, it appears this
is because this transitive, self-referencing property is part of OWL 2 Full,
and not OWL 2 DL; and the reasoners I have tried (FaCT, Pellet) can only
support OWL 2 DL.
Is there another approach that would let me select transitive
self-referencing properties, or achieve what I'd like to do, within the OWL
2 DL restrictions?
Thanks,
Jevon