Цепочка свойств для свойства данных
В соответствии с документацией 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)