МУ ПЗ
.pdfЕсли необходимо найти имена, фамилии и возраст всех студентов, можно использовать следующий запрос:
PREFIX tutorial: <http://www.eltech.ru/semweb/tutorial.owl#> SELECT ?name ?surname ?age
WHERE {
?x a tutorial:Студент. ?x tutorial:имя ?name.
?x tutorial:фамилия ?surname. ?x tutorial:возраст ?age.
}
Однако свойство «возраст» может быть заполнено не у каждого экземпляра класса «Студент». Поэтому при выполнении приведенного запроса будут выведены данные только по тем студентам, у которых все указанные свойства (в том числе и возраст) заполнены. Данные по экземплярам с незаполненным свойством «возраст» в результат не попадут, так как незаполненность свойства означает отсутствие соответствующий тройки в RDF, и шаблон ?x tutorial:возраст ?age не сработает.
ВSPARQL существует способ задавать ограничения на необязательные свойства и при этом получать в результате данные, в том числе, и по тем объектам, у которых эти свойства не заполнены. Для этого используется секция OPTIONAL:
PREFIX tutorial: <http://www.eltech.ru/semweb/tutorial.owl#> SELECT ?name ?surname ?age
WHERE {
?x a tutorial:Студент. ?x tutorial:имя ?name.
?x tutorial:фамилия ?surname. OPTIONAL { ?x tutorial:возраст ?age }
}
Врезультате будут выведены данные по всем студентам, в том числе и по тем, у которых возраст не указан – для них будут возвращены только известные данные (имя и фамилия).
Всекции OPTIONAL можно использовать фильтры, например:
PREFIX tutorial: <http://www.eltech.ru/semweb/tutorial.owl#> SELECT ?name ?surname ?age
WHERE {
?x a tutorial:Студент. ?x tutorial:имя ?name.
?x tutorial:фамилия ?surname. OPTIONAL {
?x tutorial:возраст ?age. FILTER (?age > 20)
}
}
Модификаторы результата
ORDER BY - позволяет упорядочить результаты по определенному полю. Например, для вывода отсортированного по полю «фамилия» списка имен и фамилий всех студентов можно использовать следующий запрос:
PREFIX tutorial: <http://www.eltech.ru/semweb/tutorial.owl#> SELECT ?name ?surname
WHERE {
?x a tutorial:Студент. ?x tutorial:имя ?name.
51
?x tutorial:фамилия ?surname.
}
ORDER BY ?surname
Для обратного порядка используется ключевое слово DESC:
ORDER BY DESC(?surname)
Допускается указывать несколько полей в секции ORDER BY. Например, для вывода списка имен и фамилий всех студентов, отсортированного по полю «фамилия» а для студентов с одинаковыми фамилиями – по поля «имя», используется следующий запрос:
PREFIX tutorial: <http://www.eltech.ru/semweb/tutorial.owl#> SELECT ?name ?surname
WHERE {
?x a tutorial:Студент. ?x tutorial:имя ?name.
?x tutorial:фамилия ?surname.
}
ORDER BY ?surname ?name
OFFSET/LIMIT - пара модификаторов, ограничивающая количество результатов. Имеет смысл использовать только совместно с ORDER BY. OFFSET задает количество результатов, которые нужно пропустить. LIMIT задает максимальное количество результатов. Например, для вывода из отсортированного по фамилии списка студентов позиций с 10 по 30 включительно используется следующий запрос:
PREFIX tutorial: <http://www.eltech.ru/semweb/tutorial.owl#> SELECT ?name ?surname
WHERE {
?x a tutorial:Студент. ?x tutorial:имя ?name.
?x tutorial:фамилия ?surname.
}
ORDER BY ?surname OFFSET 9
LIMIT 21
DISTINCT - исключает дублирующиеся результаты. Например, для вывода списка различных имен и фамилий студентов (в нем не может быть две записи «Иван Петров») используется следующий запрос:
PREFIX tutorial: <http://www.eltech.ru/semweb/tutorial.owl#> SELECT DISTINCT ?name ?surname
WHERE {
?x a tutorial:Студент. ?x tutorial:имя ?name.
?x tutorial:фамилия ?surname.
}
Типы запросов
В SPARQL поддерживаются несколько форматов результата запроса:
SELECT - возвращает результат в виде набора значений для запрашиваемых переменных.
CONSTRUCT - возвращает результат в виде RDF-графа, построенным на основе шаблона, заданного в запросе. Находятся все фрагменты графа, удовлетворяющие шаблону и фильтрам. Каждый подходящий фрагмент включается в RDF-граф результата.
DESCRIBE - как и CONSTRUCT возвращает результат в виде RDF-графа, однако форма графа определяется настройками движка SPARQL-запросов.
52
ASK - возвращает булево значение: ИСТИНА, если в результате выполнения запроса нашлись какие-то данные, ЛОЖЬ, если после выполнения запроса не было найдено ни одного значения.
Пример(ы)
Предметная область: семья.
1. Какие дети есть у Ben?
PREFIX f: <http://www.owl-ontologies.com/family.owl#> SELECT ?children
WHERE { f:Ben f:parent ?children }
Ответ:
Tom
Jane
2. Какие родители есть у Ben?
PREFIX f: <http://www.owl-ontologies.com/family.owl#> SELECT ?parents
WHERE { ?parents f:parent f:Ben }
Ответ:
Mary
3. Какие внуки (и внучки) есть у Mary?
PREFIX f: <http://www.owl-ontologies.com/family.owl#> SELECT ?grandchildren
WHERE { f:Mary |
f:parent ?x. |
?x |
f:parent ?grandchildren. } |
Ответ: |
|
Tom |
|
Jane |
|
Примечания:
1)?children, ?parents и ?grandchildren - переменные, заменяемые на конкретные значения при поиске в онтологии. Они же являются названиями соответствующих столбцов в выводимой в конце поиска таблице результатов.
2)?x - промежуточная переменная, используемая в сложных (многострочных) SPARQL-
запросах.
Выводы: В ходе практического занятия были получены практические навыки составления запросов для извлечения явных знаний из онтологии на языке SPARQL.
53
8. Составление SWRL-правил для логического вывода неявных знаний из онтологии
Цель работы: Получение практических навыков составления правил логического вывода на языке SWRL к онтологии.
Исходные положения
Пример SWRL-правила с OWL-ограничениями
(hasChild >= 1)(?x) |
Parent(?x) |
|
Пример SWRL-правила с выведенными OWL-ограничениями |
||
Parent(?x) |
(hasChild >= 1)(?x) |
SWRL и Семантики Открытых Миров: sameAs, differentFrom
Publication(?p) & hasAuthor(?p, ?y)
& hasAuthor(?p, ?z) & differentFrom(?y, ?z) cooperatedWith(?y, ? z)
SWRL является монотонным: не поддерживает Атомы с отрицанием SWRL не поддерживает отрицаний - следующее правило невозможно:
Person(?p) & not hasCar(?p, ?c) CarlessPerson(?p)
Потенциальное нарушение корректности: что если человек приобретет машину позже?
SWRL является монотонным: удаления (или модификации) не поддерживаются
Person(?p) & hasAge(?p,?age) &
swrlb:add(?newage,?age,1)
hasAge(?p, ?newage)
SWRL является монотонным: удаления (или модификации) не поддерживаются - 2
Person(?p) & hasAge(?p,?age) &
swrlb:add(?newage, ?age,1)
hasAge(?p, ?newage)
Некорректно: будет выполняться все время и пытаться присвоить бесконечное число значений свойству hasAge
Потенциальное нарушение корректности: существенные попытки удаления.
SWRL является монотонным: не поддерживается подсчет
Publication(?p) & hasAuthor(?p, ?a) &
< hasAuthor имеет точно одно значение в текущей онтологии>
SingleAuthorPublication(?p)
Не выразимо: применяется открытый мир Потенциальное нарушение корректности: что если автор добавляется позднее?
SWRL является монотонным: не поддерживается подсчет - 2
Publication(?p) & (hasAuthor = 1)(?p) SingleAuthorPublication(?p)
Замыкание лучше выразимо в OWL.
54
Семантика SWRL
Основана на OWL-DL;
Имеет формальную семантику;
Дополняет OWL и полностью семантически совместима; Более выразительна (ценой разрешимости!);
Если повышенная выразительность не требуется, используется OWL (возможное исключение: запросы).
SWRL и запросы SWRL является языком правил, а не языком запросов;
Однако, антецедент правила может рассматриваться как спецификация сопоставления с образцом, т.е. запрос;
С использованием расширений (built-ins), возможно дополнение языка запросами.
Пример SWRL-запроса
Person(?p) & hasAge(?p,?age) &
swrlb:greaterThan(?age,17) query:select(?p, ?age)
Упорядочение Результатов Запроса
Person(?p) & hasAge(?p,?age) &
swrlb:greaterThan(?age,17)
query:select(?p, ?age) & query:orderBy(?age)
Counting Query Results
Person(?p) & hasCar(?p, ?car)
query:select(?p) & query:count(?car)
Не существует способа установить подсчет в онтологии
Подсчет в онтологии всех автомобилей, имеющих владельцев
Person(?p) & hasCar(?p, ?c) query:count(?c)
Подсчет всех автомобилей в онтологии
Car(?c) query:count(?c)
Агрегирование Запросов: средний возраст людей в онтологии
Person(?p) & hasAge(?p, ?age) query:avg(?age)
Также могут использоваться: query:max, query:min, query:sum.
Запросы и правила могут взаимодействовать
Person(?p) & |
hasAge(?p, ?age) & |
|
||
|
swrlb:greaterThan(?age, 17) |
Adult(?p) |
||
Adult(?a) |
|
query:select(?a) |
|
|
|
|
Пример SWRL-запроса с OWL-ограничением |
||
(hasChild >= |
1)(?x) |
query:select(?x) |
|
55
Все вставки (Built-ins) могут использоваться в запросах tbox:isDirectSubClassOf(?subClass, Person)
query:select(?subClass)
tbox:isSubPropertyOf(?supProperty, hasName) query:select(?subProperty)
Замечание: Использование имен свойств и классов как аргументов вставок вне OWL DL.
Важно: эти вставки должны использоваться только в запросах - логический вывод с ними не будет соответствовать OWL DL.
Пример(ы)
Предметная область: семья.
1. Определение понятия «отец»: если ?x является мужчиной и он же является родителем ?y, то ?x - отец ?y:
type (?x, Man) parent (?x, ?y) → father (?x, ?y)
Результат работы логического вывода (найденные неявные знания): father (Ben, Tom)
father (Ben, Jane)
2. Определение понятия «брат»: если ?x является мужчиной, у него есть родитель ?z, у другого человека ?y также есть родитель ?z, при этом ?x и ?y - разные люди, то ?x - брат ?y:
type (?x, Man) parent (?z, ?x) parent (?z, ?y) swrlb:notEqual(?x, ?y) → brother (?x, ?y)
Результат работы логического вывода (найденные неявные знания): brother (Tom, Jane)
Примечание: ?x, ?y и ?z - переменные, заменяемые на конкретные значения при поиске в базе знаний в ходе логического вывода.
Выводы: В ходе практического занятия были получены практические навыки составления правил логического вывода на языке SWRL к онтологии.
56