OWL Protegé: Using the same Object property for different Domains/Ranges

2.3k Views Asked by At

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

1

There are 1 best solutions below

8
On BEST ANSWER

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.