property chaine for a data property

188 views Asked by At

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?

1

There are 1 answers

2
Joshua Taylor On

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)