Цепочка свойств для свойства данных

В соответствии с документацией Protege 4.x для свойств объекта существует цепочка свойств, однако в моем случае мне необходимо включить свойство данных следующим образом:

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

Чтобы немного пояснить, представьте, что у нас есть улица с названием "Холли Вуд". Эта улица состоит из нескольких сегментов (сегмент является частью улицы между перекрестками), название которой должно совпадать с названием улицы "Холли Вуд". Обратите внимание, что концепция улицы отличается от сегмента, поэтому они не являются подклассами, но имеют вышеуказанное отношение (сборки).

Одно решение состоит в том, чтобы сделать has_name свойством Object, тогда каждое имя должно быть объектом (экземпляром).

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

Это не совсем нормально для меня, так как я думаю, что лучше использовать тип данных.

Другое решение заключается в использовании SWRL, как показано ниже:

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

это не работает!!!! Вы можете помочь мне понять почему или найти правильное решение?

1 ответ

Я думаю, что правило SWRL является правильным решением здесь. Как вы заметили, вы не можете использовать свойство data в аксиоме цепочки субпредприятий, но вам нужно это сделать, чтобы получить искомое поведение. Структурная спецификация для аксиом собственности на объекты и аксиом собственности на данные:

9.2.1 Объектные свойства

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

9.3.1 Подвойства данных

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

У OWL 2 просто нет выражения цепочки свойств, которое смешивает свойства объекта и типа данных. Таким образом, вам нужно использовать правило SWRL. Вы можете использовать такое правило (нет необходимости использовать Thing(? P) ∧ Thing(? Q), поскольку каждый человек автоматически становится совой: Thing):

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

Другие вопросы по тегам