I'm using Protegé to create an OWL ontology and I have Question.
I have the following set up:
(relation1)
ClassA isTriggeredBy ClassB
(relation1)
ClassC isTriggeredBy ClassD
Nevertheless the relation should be either (ClassA, ClassB) or (ClassC,ClassD). I don't want combinations like (ClassA, ClassD) to be possible since it makes no sense from the ontology semantic perspective. I tried to avoid that by specifying the following in the Object Property Description of relation1 isTriggeredBy:
Domain (intersection)
ClassA or ClassC
Ranges (intersection)
ClassB or ClassD
and I added local constraints in both Class Description of ClassA and ClassC:
Description:ClassA
SubClass Of
isTriggeredBy some ClassB
Description:ClassC
SubClass of
isTriggeredBy some ClassD
But I don't know if this is correct. Moreover I don't know if this the more appropriate way to do this or if it necessary to create different object properties.
Thanks for the attention and support,
pLs
To answer your question, it is important to understand the reason for using domain and range restrictions. If have
ObjectProperty: isTriggeredBy
Domain: A
Range: B
what you want to achieve is that whenever you know that an individual a
is related via isTriggeredBy
to individual b
, the reasoner can infer that a
is of type A
and b
is of type B
.
If you have
ObjectProperty: isTriggeredBy
Domain: ClassA or ClassC
Range: ClassB or ClassD
it can at most infer that individual a
is of type ClassA or ClassC
and individual b
is of type ClassB or ClassD
. That is even with the added axioms
Class:ClassA
SubClassOf: isTriggeredBy some ClassB
Class:ClassC
SubClassOf:isTriggeredBy some ClassD
you will not get to differentiate between the relations (ClassA
, ClassB
) and (ClassC
,ClassD
).
A way to achieve this differentiation is to use subproperties:
ObjectProperty: isTriggeredBy
Domain: ClassA or ClassC
Range: ClassB or ClassD
ObjectProperty: isTriggeredByB
SubPropertyOf: isTriggeredBy
Domain: ClassA
Range:ClassB
ObjectProperty: isTriggeredByD
SubPropertyOf: isTriggeredBy
Domain: ClassC
Range:ClassD
Then when you have an individual a
that is associated via isTriggeredByB
to individual b
, it will infer that a
is of type ClassA
and b
is of type ClassB
.