Составление тематической онтологии по SEO-проекту – базовая обязательная операция, в результате которой можно формировать все остальные проектные документы: тематическую карту сайта, его техническую структуру, семантическое ядро, микроразметку Schema.org. и т.п. Рассмотрим процесс составления онтологии пошагово.
Рабочий процесс #
Главная ошибка новичка — сразу открыть Protegé (редактор онтологий) и начать «набрасывать классы». Так вы получите просто таксономию, а не онтологию. Вот проверенный рабочий процесс (workflow) для составления онтологий с нуля, от идеи до проверки.
Этап 0. Определите цель #
Онтология не может описывать «весь мир». Сядьте и напишите один конкурентный вопрос (Competency Question — CQ), на который она должна отвечать.
- Плохо: «Онтология ресторанов».
- Хорошо: «Какие блюда в ресторанах поблизости подходят вегетарианцу с аллергией на орехи?»
С этого вопроса начинается всё.
Этап 1. Извлечение знаний (бумага и ручка) #
Забудьте о компьютере. Возьмите стикеры.
- Выпишите существительные из вашего вопроса — это будущие классы (Restaurant, Dish, Customer, Allergen).
- Выпишите глаголы/свойства — это отношения (serves, contains, isAllergicTo).
- Найдите примеры — 3-4 конкретных индивида (Ресторан «У Марии», Блюдо «Паста с арахисом»).
Этап 2. Проектирование (Принципы) #
Не стремитесь к идеалу. Примените правило 80/20:
- Сначала иерархия классов (таксономия). Используйте принцип: «Всегда ли B является A?» (ВегетарианскоеБлюдо всегда Блюдо? Да).
- Затем объектные свойства (связи). Укажите домен (Domain) и диапазон (Range): `serves` (Domain: Restaurant) → (Range: Dish).
- Затем аксиомы (самое важное). Онтология работает за счет ограничений:
- `Dish` эквивалентно `(serves only Restaurant)` (Блюдо всегда подается в ресторане).
- `VegetarianDish` = `Dish and (hasIngredient only VegetarianIngredient)`.
Этап 3. Выбор инструмента и формата #
Не начинайте с чистого OWL в блокноте.
- Лучший старт: Protegé (десктопное приложение). Бесплатно, стандарт индустрии.
- Формат: OWL 2 DL (это баланс между выразительностью и производительностью).
- Альтернатива для программистов: онтологии на Python через `owlready2` (если вы не хотите GUI).
Этап 4. Реализация (пошагово в Protegé) #
Минимальный порядок действий, чтобы не запутаться:
- Создайте IRI: Уникальное имя пространства (например, `http://example.com/food#`).
- Добавьте аннотации: rdfs:label (имя на русском/английском), rdfs:comment (пояснение). Это обязательно для понимания через 2 недели.
- Создайте верхние классы: Thing → ваш корневой класс.
- Добавьте классы-заполнители: Просто имена (Restaurant, Dish, Person).
- Добавьте объектные свойства: (serves, preparedBy).
- Замкните онтологию (Key step!): Добавьте аксиому покрытия. Например, скажите, что свойство `hasIngredient` является функциональным только для готовых блюд.
Этап 5. Проверка (самый важный шаг) #
Загрузите HermiT или Pellet (reasoner в Protegé). Нажмите «Start reasoner».
Reasoner найдет ошибки, о которых вы не подозревали:
- Обнаружит противоречия: «Вегетарианское блюдо содержит мясо? Error!»
- Вычислит неявные связи: «Если Азия — часть Китая, а Китай — часть Азии, то онтология не сломается, но вы увидите цикл».
Типичный первый рабочий процесс за 1 час #
| Шаг | Что делать | Инструмент | Время |
|---|---|---|---|
| 1 | Написать 1 вопрос (CQ) | Блокнот | 5 мин |
| 2 | Нарисовать 5 классов и 3 связи | Ручка/FigJam | 15 мин |
| 3 | Создать онтологию (классы, свойства) | Protegé | 20 мин |
| 4 | Добавить 3 аксиомы (Disjoint, SubClassOf) | Protegé | 10 мин |
| 5 | Запустить reasoner | HermiT | 5 мин |
| 6 | Увидеть, что всё красное → исправить | Protegé | 5 мин |
#
Чего НЕ надо делать в начале (осторожно) #
- Не используйте эквивалентности классов (`EquivalentTo`) без необходимости — это сложнейшая конструкция.
- Не используйте отрицания (`not`) — они ломают совместимость с большинством reasoner’ов.
- Не создавайте глубокую иерархию (глубже 3-4 уровней) — это не онтология, а дерево категорий сайта.
#
Ваше первое задание #
Создайте онтологию семьи за 30 минут:
- Классы: Person, Male, Female.
- Свойства: hasParent, hasChild (инверсно), hasWife (Domain: Male, Range: Female).
- Индивиды: Иван, Мария, Петр (сын).
- Аксиома: DisjointClasses(Male, Female).
- Запустите reasoner и попросите его вывести, кто кому внук.
Если это сработало — вы поняли рабочий процесс. Дальше масштабируйте на любую предметную область.
Совет: не читайте книг по логике первого порядка. Сначала набейте руку на малых онтологиях (семья, библиотека, пицца — классический учебный пример от Манчестерского университета).
