vote up 3 vote down
star
1

Suppose you have the following situation:

Car -- hasEngine --> Engine 
Engine -- hasPiston --> Piston

How can I specify in owl that this situation implies the existence of this relationship

Car -- hasPart --> Piston

and also the opposite implied relationship ?

Piston -- partOf --> Car

My point is not to solve that specific problem, it's more of this kind: if you have a given set S of relationships, how can you express can you infer a connected relationship which holds true only if S is true for all the relationships ?

Another example, this time on instances. suppose you want to define that when this triples are present in your rdf graph:

Person -- hasFood --> Tomato
Tomato -- freshness --> Rotten

the existence of this triple is automatically inferred

Hospital -- expectedPatient --> Person

how would you specify this behavior in owl ?

flag

2 Answers

vote up 5 vote down
check

That works with a new feature of OWL 2, property chains:

ex:hasPart a owl:ObjectProperty ;
  owl:propertyChainAxiom ( ex:hasEngine ex:hasPiston ) .

This makes ex:hasPart a sub-property of the chain expressed with a list, i.e. whenever a chain of triples connected via those two properties (not repeated) in that order is found, the connection between the ends of the chain will be inferred as a new triple using ex:hasPart.

For the inverse direction you simply declare partOf as the inverse of hasPart as follows:

ex:partOf a owl:ObjectProperty ;
  owl:inverseOf ex:hasPart .

Now from the newly inferred triple using ex:hasPart it can immediately also infer the triple in inverse order using ex:partOf.

There are some restrictions on property chains. First, they only work with object properties. Then you can only construct chains in certain regular ways. Those conditions are listed in detail in the structural specification of OWL 2 but they're quite hard to read if you're not a mathematician. :-)

To me property chains are one of the best new features of OWL because they have so many use cases.

link|flag
vote up 2 vote down

You can speciy this by

  1. defining 'hasEngine' and 'hasPiston' as subproperties of 'hasPart'
  2. defining 'hasPart' as a transitive property
  3. defining 'partOf' as an inverse property of 'hasPart'
link|flag
that would work, but it appears I stated my problem in the wrong way. I am revising the question – Stefano Borini Feb 4 at 8:13

Your Answer

Get an OpenID
or

Not the answer you're looking for? Browse other questions tagged or ask your own question.