Уголок OWL

На этой страничке будут собираться интересные, простые но нетривиальные примеры использования OWL. Надеемся, что с вашей помощью этот Уголок быстро перерастет размеры одной страницы!

Я буду использовать Манчестерский синтаксис OWL (не потому, что я сам из Манчестера, а просто потому, что он самый короткий и читабельный). Первым нашим примером будет тот самый «дядя».

1) Класс «Дядя» (Uncle) — класс всех объектов, братья и сестры которых имеют своих детей. Реализация в OWL 2:

ObjectProperty: hasParent • hasBrother
SubPropertyOf: hasUncle
Class Uncle:
EquivalentTo: Person that (inverse hasUncle some Person)

Объяснение: здесь используется цепочка свойств (property chain) с вложенностью: сложное свойство hasParent hasBrother (цепочка двух свойств) являетс подсвойством hasUncle (это аналогично правилу hasParent(x,y) ^ hasBrother(y,z) => hasUncle(x,z)). Далее все просто: дядя — это все такие объекты x, что x принадлежит Person и существует такой y (племянник(ца)), что hasUncle(y,x). Заметим, что этот класс можно описать в OWL 2 в котором появились property chains, но не в OWL 1.

2) Класс «любитель кошек» (CatLover). Подразумевая класс «Кошка» (Cat) и свойство «любить» (loves)  надо выразить класс любителей кошек. Каждый экземпляр CatLover любит *всех* экземпляров Cat.

linkLover o (inverse linkCat) SubPropertyOf: loves
CatLover SubClassOf (linkLover some {link})
Cat SubClassOf (linkCat some {link})

Иллюстрация:

catlover

Смысл в том, что используется вспомогательный экземпляр (link), который связывает   любителей кошек и самих кошек. В OWL легко сказать, что *каждый* любитель кошек связан с link при помощи свойства linkLover, и *каждая* кошка связана с link при помощи свойства linkCat (описания свойств тривиальны). Далее остается последний шаг: сказать, что любая цепочка «любитель кошек -> link ->  кошка» означает свойство «любить» (loves). Желающие могут проверить в Protege, что для любого x из класса CatLover и любого y из класса Cat, reasoner сможет вывести loves(x,y). Если не сможет — то это баг (мой или reasoner’a). При этом ему будет гораздо сложнее вывести, что некий объект x является экземпляром CatLover, поскольку в OWL это не будет следовать даже если x будет любить всех кошек *явно* перечисленных в онтологии (для желающих понять почему: почитайте про Open World Assumption).

Я заранее согласен со всеми, кто скажет, что подобное решение слишком сложно для такой простой проблемы. Возможно. К сожалению, логические языки, в которых это решается легко (в частности в логике предикатов), сложнее OWL в вычислительном смысле. Возможно мне стоит создать страничку для обсуждения применимости OWL вообще (только я не хочу делать это на *этой* странице).

3) Класс «Разнородный контейнер» (MixedContainer).

Условие задачи и варианты решения см. здесь!

4) Ждем предложений следующей задачки! (а вы думали, что я один буду трудиться? )

Начало положено, продолжение следует. Обязательно задавайте вопросы и присылайте свои примеры (даже если вы не знаете, как их выразить в OWL).

52 Responses to Уголок OWL

  1. Опять же: извиняюсь за поздний ответ.

    Мне кажется, ты слишком усложняешь. У тебя же всего два класса — Man и Woman. Тебе достаточно сказать, что мужчины могут быть женаты только на женщинах: Man SubClassOf isMarriedTo all Woman
    аналогично с женщинами, а так же с wasMarriedTo.
    Ну и добавить disjointness как у тебя.
    В «max 0 R.С» вообще смысла мало, это все равно что «R all not C».

  2. Alex:

    Я может быть не совсем в нужном топике, но все же…. скажите пожалуйста, какие вообще на сегодняшний день существуют программы превода онтологий OWL на язык GraphXML илии все же самому придется написать при помощи чего нить вроде правил XSLT ??? Сразу извиняюсь может за какую-нибудь некоректность, т.к только начинаю во всем этом разбираться! Да… в смысле пограмм подразумеваю что-нить вроде open Sourse.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


Ответить с помощью ВКонтакте: