1

According to the protege 4.x documentation the property chain exists for the object properties however in my case I need to include a data property as follow:

if builds(B, A) o has_name(A, "Holly wood") -> has_name(B, "Holly wood")

To explain a bit, imagine we have a street with a name "Holly wood". This street is built of several segments (a segment is a part of street between to junctions) whose name should be the same as street name "Holly wood". Note that, the street concept is different from the segment so they are not subclasses but they have the above relation (builds).

One solution is to make the has_name an Object property, then each name should be an object (instance).

 if is_name_of(name, A) o is_built_of(A, B) -> is_name_of(name, B)

This does not seem quite OK to me as I think it is better to use data-type.

the other solution is to use SWRL as below:

Thing(?p), Thing(?q), builds(?q, ?p), has_name(?p, ?name) -> has_name(?q, ?name)

this does not work!!!! can you help me figure out why or find a proper solution?

msc87
  • 943
  • 3
  • 17
  • 39
  • 1
    In which way does it not work? Are you using a SWRL capable reasoner? – Ignazio Jun 05 '15 at 06:19
  • @Ignazio: I am using Fact++ and HermiT 1.3.8, but I am not sure if they support that. in fact I did not know I need to look for swrl capable reasoners. – msc87 Jun 05 '15 at 08:27
  • 1
    That's because swrl is not part of owl, it's a separate spec. HermiT supports swrl rules but fact++ does not. – Ignazio Jun 05 '15 at 09:12
  • I used HermiT but did not infer what I wanted... now pellet is doing the job :D – msc87 Jun 05 '15 at 09:18

1 Answers1

2

I think that the SWRL rule is the proper solution here. As you've noted, you can't use the data property in a subproperty chain axiom, but you would need to in order to get the behavior you're looking for. The structural specification for object subproperty axioms and for data subproperty axioms are:

9.2.1 Object Subproperties

SubObjectPropertyOf := 'SubObjectPropertyOf' '(' axiomAnnotations subObjectPropertyExpression superObjectPropertyExpression ')'  
subObjectPropertyExpression := ObjectPropertyExpression | propertyExpressionChain
propertyExpressionChain := 'ObjectPropertyChain' '(' ObjectPropertyExpression ObjectPropertyExpression { ObjectPropertyExpression } ')'

9.3.1 Data Subproperties

SubDataPropertyOf := 'SubDataPropertyOf' '(' axiomAnnotations subDataPropertyExpression superDataPropertyExpression ')'
subDataPropertyExpression := DataPropertyExpression
superDataPropertyExpression := DataPropertyExpression

OWL 2 simply doesn't have a property chain expression that mixes object and datatype properties. Thus, you'd need to use a SWRL rule. You can use a rule like this (there's no need to use Thing(?p) ∧ Thing(?q), since every individual is automatically an owl:Thing):

        builds(?q, ?p) ∧ has_name(?p, ?name) → has_name(?q, ?name)

Joshua Taylor
  • 84,998
  • 9
  • 154
  • 353
  • Thanks, as I got property chain can't help me and I should use SWRL instead. but I dont get the subproperty, should it not be superproperty? I am quite new in ontology.. – msc87 Jun 05 '15 at 08:16
  • 1
    @msc87 You'd be saying that the chain "builds/hasName" is a subproperty of hasName, because whenever "builds(p,q), hasName(q,r)" holds, you can infer that hasName(p,r). It's just like if A is a setset of B, then A(x) implies B(x). – Joshua Taylor Jun 05 '15 at 11:32