Search code examples
owlontologyprotegeobject-properties

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


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


Solution

  • 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.