Search code examples
rdfowlprotegetriplestoretriples

Making OWL data and object properties sub-properties of the same property


Suppose I have the classes:

> Element
> ElementProperty

With the subclasses of elementProperty being:

> AtomicNumber
> AtomicMass

Also consider the following object properties and their domains and ranges:

> hasElementProperty
  Domain:Element
  Range:ElementProperty

Where hasElementProperty has the following sub-properties:

> hasAtomicNumber
  Domain:Element
  Range:AtomicNumber
> hasAtomicMass
  Domain:Element
  Range:AtomicMass

So this way when I say :Lithium :hasAtomicNumber :3 the triple :Lithium :hasElementProperty :3 will be inferred, where :3 is an instance of the AtomicNumber class.

Okay so now consider the case where I have the data property hasElementName and I also want it so that when I have the triple :Lithium :hasElementName "Lithium" the triple :Lithium :hasElementProperty "Lithium" is inferred. This isn't possible with the way I have it set up now as hasElementName is a data property and thus cannot be a sub-property of the object property hasElementProperty. I have tried using Literal Reification (see Literal Reification) with success, but I feel like there may be a better way to do this as literal reification's purpose is so one can use literals as objects, and that's not what I need to do. Any ideas would be greatly appreciated.

Thanks


Solution

  • This is not possible in OWL 2 DL, only in OWL 2 FULL - which means reasoners and tools might complain about your ontology, or you might get unexpected results.

    If collecting all values under the same property is necessary to your application, I would keep using literal reification - seems to be the simplest way to achieve the desired result.