Онтологічна модель як граф
Ця сторінка є розділом нашого методичного посібника "Введення в онтологічне моделювання" (натисніть для переходу до повної версії посібника у форматі PDF).
Граф - це математичний термін, що означає набір вершин, і ребер, що з'єднують їх. Найпростіший граф виглядає так:
Мал. 17. Найпростіший граф
Зверніть увагу, що ребро спрямоване.
Очевидно, що структура такого графа ідеально відповідає структурі триплету: вершини – це додаток, що підлягає, а ребро – присудок. Наприклад, триплет «Собака є твариною» можна зобразити так:
Мал. 18. Логічне вираз, подане у вигляді графа
Отже, будь-яку онтологію можна зобразити як графа. Проілюструємо це на прикладі попереднього розділу.

Дивлячись на подібні зображення, важливо розуміти, що вершина відповідає фактично унікальному ідентифікатору об'єкта (за винятком вершин-літералів, які ми показали прямокутниками). Вона не містить жодної іншої інформації; всі приписані їй властивості задаються окремими ребрами графа. Деякі вершини ми виділили кольором лише зручності сприйняття.
Правильність зображення нашої моделі легко перевірити, вважаючи число ребер. Їх 15, стільки ж, скільки триплетів у таблиці з попереднього розділу.
Оскільки повне графічне уявлення моделі зазвичай виявляється надто складним, його спрощують – не показують ребра, що відображають тип елемента, що вказують на літерали тощо.
Зауважимо також, що в нашій моделі сутності-властивості (#Name, #Child) присутні у двох ролях - як вершини, що відповідає їх опису, і якребер, коли виконується присвоєння значення якості конкретному об'єкту.
Таке уявлення семантичної моделі визначає спосіб побудови запитів до неї, реалізований у мові SPARQL. Ми вже бачили приклад найпростішого SPARQL-запиту:
Слова SELECT * WHERE зрозумілі всім, хто знайомий з SQL - це вибірка всіх результатів з набору рядків (SQL) або триплетів (SPARQL), що відповідають умовам відбору. Умови відбору у разі SPARQL – це вираз, укладений у фігурні дужки. Воно визначає патерн або шаблон, якому повинні відповідати триплети. Значення, що починаються на знак питання – це змінні. Вони можуть набувати будь-якого значення; ці значення будуть повернуті в результаті запиту. Оскільки всі три позиції у нашому запиті зайняті змінними – всі три елементи триплету можуть бути будь-якими. Отже, такий запит поверне весь вміст онтології (не слід зловживати такими запитами великих онтологіях).
Наведемо кілька прикладів осмислених SPARQL-запитів. Припустимо, ми хочемо дізнатися, який тип має об'єкт #Alpha:
Для читання перед запитом можна оголосити префікси. Тоді наш запит буде виглядати так:
Результатом запиту будуть значення змінної ?c – єдиної невідомої:
Щоб отримати список усіх членів класу Customer, потрібно виконати такий запит:
Результатом будуть URI клієнтів:
Припустимо, що ми хочемо одночасно з унікальним ідентифікатором клієнтів отримати їхні імена. Тоді в запиті потрібно буде вказати патерн, що відповідає двом ребрам графа:
Як бачимо, патерни триплетів відокремлюються друг від друга точкою. Результат виконання цього запиту буде таким:
| ?cust | ?name |
| "Alpha, JSC" | |
| "Beta, LLC" |
Ще більш ускладнений запит. Нехай нам потрібні відразу імена вищих структур кожної компанії. При цьому URI ми не хочемо бачити результати запиту. Потрібно брати до уваги, що в деяких компаній може не бути вищих структур, так що у патерна з'являється опціональна частина, яка може бути не у всіх результатів. Запит виглядатиме так:
Звернімо увагу на такі деталі синтаксису:
- Замість * у списку вибраних значень можна вказати через пробіл імена тих змінних, які потрібні у списку значень, що повертаються. Інші змінні використовуються у структурі патернів запиту, але видані у вигляді результатів не будуть.
- Клауза OPTIONAL (у запиті може бути кілька) використовується завдання додаткових патернів, яким можуть, але з зобов'язані відповідати результати запроса. Це дуже корисно у випадках, коли вибираються об'єкти разом із їх властивостями, але властивості задані в кожного об'єкта. Якщо властивість помістити в основний патерн, а чи не в OPTIONAL, то результат потраплять лише ті об'єкти, які мають значення властивості встановлено.
Результат виконання цього запиту буде таким:
| ?name | ?parent_name |
| "Alpha, JSC" | |
| "Beta, LLC" | "Alpha, JSC" |
| ?name | ?parent_name |
| "Alpha, JSC" | |
| "Beta, LLC" | "Alpha, JSC" |
| "Beta, LLC" | "Gamma" |
Як бачимо, кожної комбінації вершин і ребер графів, відповідальних результатам запиту, виводиться окремий рядок результату. Таким чином, та сама сутність, та сама частина графа може фігурувати в результатах запиту кілька разів. Чим складніший запит, тим серйознішим буде його перевантаженість результатами, що повторюються. Полегшити життя допомагає вираз SELECT DISTINCT, що видає лише унікальні результати запиту. Корисно також скорочувати кількість змінних, що повертаються запитом.
Щоб краще зрозуміти механізм виконання SPARQL-запиту, подивимося на те, як патент, що міститься в запиті, застосовується до вершин і ребрів графа – на прикладі останнього запиту:

На рис. 20 показана лише одна частина графа, що відповідає цьому запиту. Однак легко уявити механізм виконання SPARQL-запиту, як «примірку» патерну до всіх можливих комбінацій триплетів, що існують у моделі.
До більш глибокого розгляду синтаксису SPARQL ми ще повернемося, а поки що дамо короткий огляд деяких корисних можливостей цієї мови. Відсортуємо результати запиту на список усіх клієнтів за назвою клієнта, та виведемо 10 результатів, починаючи з 5-го:
Результати запиту можна фільтрувати за допомогою клаузи FILTER. Наприклад, нам цікаві лише ті клієнти, в назві яких міститься вираз LLC:
При фільтрації можна порівнювати числові значення, виконувати математичні операції, але при цьому необхідно стежити за типами – найчастіше їх потрібно задавати у явному вигляді, використовуючи оператор ^^. Зверніть увагу, що в цьому випадку змінна ?name явно наводиться до рядкового типу.
Завершимо розглядтеми SPARQL прикладами запитів на додавання та видалення даних до онтології. Запит на додавання даних виглядає просто:
Аналогу SQL-запиту UPDATE у SPARQL немає, дані можна лише видаляти чи додавати. Тому, якщо виникає необхідність внести зміни до вже існуючих триплетів, існуючі дані потрібно спочатку видалити:
Цей запит видаляє всю інформацію про клієнта Beta (але не видалить посилання на нього з інших об'єктів). З зрозумілих причин, у запиті INSERT не можуть використовуватися змінні, а запит DELETE – можуть.
Існує також запит CONSTRUCT, аналогічний SELECT, але повертає результати над вигляді таблиці, а вигляді нового RDF-графа (фактично – як файла).
Перевірити існування рішень у SPARQL-патерна можна за допомогою запиту ASK, який повертає true, якщо є хоча б одне рішення, і false в іншому випадку. Наприклад, дізнаємося, чи існують компанії, які мають батьківську організацію:
На нашій моделі результатом такого запиту буде true, правда.
У цьому розділі ми розглянули звичайний режим роботи зі сховищем триплетів за допомогою точки доступу SPARQL. У цьому режимі точка працює подібно до звичайної бази даних, тобто повертає ту інформацію, яка була в неї вміщена. Тим часом потужність семантичних технологій полягає в можливості автоматичного отримання логічних висновків.