Россия, г. Москва |
Языки описания онтологий. Основные синтаксические структуры: классы, отношения, аксиомы
Индивиды (экземпляры классов)
Индивиды определяются при помощи аксиом индивидов (т.н. фактов ). Рассмотрим два вида фактов:
- факты членства индивидов в классах и факты о значениях свойств индивидов;
- факты идентичности/различности индивидов.
Пример аксиом индивидов первого вида:
<Балет rdf:ID="ЛебединоеОзеро"> <имеетКомпозитора rdf:resource="#Чайковский"/> </Балет>
Данная аксиома постулирует сразу 2 факта: (1) существует некоторый индивид класса Балет, имеющий имя ЛебединоеОзеро ; (2) этот индивид связан свойством имеетКомпозитора с индивидом Чайковский (который определен где-то в другом месте). Первый факт говорит о членстве в классе, второй - о значении свойства индивида.
Аксиомы второго вида необходимы для суждения об идентичности индивидов. Дело в том, что в OWL не делается никаких предположений ни о различии, ни о совпадении двух индивидов, имеющих различные идентификаторы URI. Подобные утверждения выражаются аксиомами идентичности с помощью следующих конструкций:
- owl:sameAs постулирует, что две ссылки URI ссылаются на один и тот же индивид;
- owl:differentFrom постулирует, что две ссылки URI ссылаются на разные индивиды;
- owl:AllDifferent предоставляет средство для определения списка попарно различных индивидов.
На рис. 6.5 проиллюстрированы основные элементы OWL-онтологии.
SPARQL
Вероятно, сами по себе языки представления онтологий не были бы так сильно востребованы, если бы не возникало необходимости автоматически обрабатывать онтологии, наполнять их содержимым и выполнять к ним запросы. Наиболее популярными среди языков запросов к RDF-хранилищам на сегодняшний день являются языки RDQL и SPARQL.
Рассмотрим несколько упрощенный синтаксис SPARQL-запроса:
SELECT <список_перем> FROM <URI_онтологии> WHERE { <список_шаблонов>. FILTER <фильтр> }
Где: список_перем - список имен переменных; URI_онтологии - URI-ссылка на онтологию; список_шаблонов - список шаблонов; фильтр - ограничения на значения переменных.
Допустим, онтология содержит следующие RDF-триплеты:
(Foo1, category, "Total Members") (Foo1, rdf:value, 199) (Foo2, category, "Total Members") (Foo2, rdf:value, 200) (Foo2, category, "CATEGORY X") (bar, category, "CATEGORY X") (bar, rdf:value, 358)
Проследим за ходом выполнения запроса (имена переменных предваряются знаком " ?")
SELECT ?cat ?val FROM <URI_онтологии> WHERE { ?x rdf:value ?val. ?x category ?cat. FILTER (?val>=200) }
Семантика запроса: "Выдайте все объекты cat предиката category, субъект которого ( x ) является также субъектом предиката rdf:value со значением объекта val, не меньшим 200. Вместе со значениями cat выдайте соответствующие значения val ".
Ход выполнения запроса:
На место переменной x могут быть подставлены Foo1, Foo2 и bar (из исходной онтологии), причем Foo2 может быть подставлен дважды, поскольку имеет два свойства category.
При подстановке Foo1 значение переменной val не удовлетворяет ограничению в предложении FILTER SPARQL-запроса. Во всех остальных случаях все условия запроса выполнены.
Результат выполнения запроса - 3 пары значений (cat, val):
[ ["Total Members", 200], ["CATEGORY X", 200], ["CATEGORY X", 358] ]