Простые онтологические модели: создание классов

Эта страница представляет собой главу из нашего методического пособия
"Введение в онтологическое моделирование" (нажмите для перехода к полной версии в формате PDF).

В наши задачи не входит подробное рассмотрение синтаксиса OWL или SPARQL – для этого можно воспользоваться спецификациями на эти языки. Нашей задачей является формирование целостного представления о взаимосвязи семантических технологий, и о воплощении идей семантического моделирования при помощи существующих ныне программных реализаций. Поэтому мы будем рассматривать построение и использование семантических моделей на примерах, включающих реализацию моделей сразу в нескольких программных средах.

Для начала нужно разобраться с тем, как представляются в семантических моделях сущности, описанные нами в первом разделе: индивидуальные объекты, классы, определения и значения свойств. Начнем мы с определения класса. Факт существования класса констатируется одним триплетом:

ПодлежащееСказуемоеДополнение
Уникальный идентификатор классаИмеет типКласс

В следующих таблицах с триплетами мы не будем приводить заголовок "подлежащее – сказуемое – дополнение", потому что структура триплета всегда одинакова.

Словами "Имеет тип" мы обозначили свойство, определенное в стандарте RDF, которое используется для указания типа сущностей семантических моделей. URI этого свойства выглядит так: http://www.w3.org/1999/02/22-rdf-syntax-ns#type

Словом "Класс" мы заменили URI определения "класс", заданного в стандарте OWL. Оно имеет такой вид: http://www.w3.org/2002/07/owl#Class

Заметим, что если бы мы оставались в рамках стандарта RDF/RDFS, то определение класса выглядело бы так: http://www.w3.org/2000/01/rdf-schema#Class. Таким образом, хотя OWL и является в некотором смысле расширением стандарта RDF, что видно по указанному выше URI стандартного свойства "имеет тип" - многие сущности он определяет по-своему.

Уникальный идентификатор класса мы можем придумать сами. Пусть он будет таким: http://example.ru/sample#OurFirstClass. Тогда полностью наш триплет будет выглядеть так:

http://example.ru/sample#OurFirstClasshttp://www.w3.org/1999/02/22-rdf-syntax-ns#typehttp://www.w3.org/2002/07/owl#Class

Суть этого триплета, повторим, состоит в том, что http://example.ru/sample#OurFirstClass является классом. Заметим еще раз, что приведенная нотация является лишь одним из способов выразить эту информацию.

Приведенный выше триплет не очень удобен для восприятия. Чтобы сделать запись более лаконичной, принято объявлять сокращения для "базовых" частей URI – так называемые префиксы. В начале RDF-файла в XML-синтаксисе префиксы могут быть объявлены так:

<rdf:RDF xmlns="http://example.ru/sample#"
     xml:base="http://example.ru/sample"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

Как мы видим, например, для выражения http://www.w3.org/2002/07/owl# объявлена аббревиатура owl. После такого объявления owl:Class будет расшифровываться как http://www.w3.org/2002/07/owl#Class, а OurFirstClass – как http://example.ru/sample#OurFirstClass. Самое первое определение xmlns=… определяет "пустой" префикс, который подставляется ко всем URI, не имеющим явно указанного префикса, и не приведенным полностью. С учетом этих сокращений, наш триплет будет таким:

OurFirstClassrdf:typeowl:Class

Посмотрим, как создать это утверждение в редакторе OWL. Мы будем использовать Protégé – свободно распространяемый редактор, разработанный Стэнфордским университетом.

Открыв редактор, перейдем на закладку Classes, нажмем кнопку Add Subclass в левом списке, и введем название – OurFirstClass. Заметим, что редактор сделал наш класс подклассом предустановленного класса Thing, к которому относится все сущее. Впрочем, этот факт никак не отразится в файлах, которые мы получим после сохранения модели.

Класс в редакторе Protege
Создание класса в редакторе Protégé

Сохраним нашу модель, чтобы посмотреть, как она будет выглядеть в файле. Обратим внимание, что редактор предлагает нам выбрать из набора форматов, среди которых есть RDF/XML и OWL/XML. Если мы выберем первый из них, то файл примет такой вид (заголовки не приведены):

    

Если выбрать OWL/XML, то содержательная часть файла будет выглядеть так:

    <Declaration>
        <Class IRI="#OurFirstClass"/>
    </Declaration>

Таким образом, одна и та же модель может быть сериализована в XML совершенно по-разному.

Интересно также пронаблюдать за тем, что произойдет при импорте полученных файлов в хранилище триплетов через SPARQL-интерфейс. Для этого воспользуемся продуктом Apache Jena, точнее – входящей в состав этого фреймворка SPARQL точкой доступа, которая называется Fuseki. Fuseki, как и другие точки доступа, имеет собственный веб-интерфейс для выполнения запросов, который может быть использован как человеком, так и программным продуктом. Войдя в этот интерфейс, нажмем на ссылку Control panel, и выберем набор данных (dataset). После этого мы окажемся на странице, содержащей три формы, соответствующей основным типам SPARQL-запросов:

  • SPARQL Query – запрос на извлечение информации,
  • SPARQL Update – запрос на изменение информации в хранилище,
  • File upload – загрузка файла RDF/OWL.

Воспользуемся сначала последней формой для того, чтобы загрузить наш файл, экспортированный из Protégé в формате RDF/XML. Выберем файл и нажмем кнопку Upload. В качестве результата Fuseki покажет нам количество созданных триплетов – их будет два.

Вернемся на предыдущую страницу, и выполним простейший SPARQL-запрос, который вернет все содержимое модели (синтаксис SPARQL-запросов мы обсудим далее):

SELECT * WHERE { ?a ?b ?c }

Мы увидим, что результатом будет тот самый триплет, который мы приводили выше:

http://example.ru/sample#OurFirstClasshttp://www.w3.org/1999/02/22-rdf-syntax-ns#typehttp://www.w3.org/2002/07/owl#Class

Попробуем теперь загрузить файл в формате OWL/XML. Результат понравится нам гораздо меньше: будет создано более десятка триплетов, подлежащим в которых будут так называемые пустые узлы, blank nodes – они не имеют постоянного названия (URI), а обозначаются выражениями типа _:b0 (один и тот же узел может иметь разные названия в результатах разных запросов). Эти пустые узлы соответствуют XML-элементам исходного файла, не имеющим собственных идентификаторов (например, ). Такая модель практически непригодна для работы с ней средствами SPARQL, поэтому впредь мы сосредоточимся на синтаксисе RDF/XML.

Первое действие, которое нам захочется выполнить с классами – определение подклассов. В Protégé для этого нужно установить курсор на класс-родитель, и нажать кнопку Add subclass. В RDF/XML факт наличия класса-родителя будет отражен таким образом:

<owl:Class rdf:about="http://example.ru/sample#SecondClass" />
		<rdfs:subClassOf="http://example.ru/sample#OurFirstClass" />
	</owl:Class>

При импорте такого определения в Triple store образуются два триплета:

http://example.ru/sample#SecondClasshttp://www.w3.org/1999/02/22-rdf-syntax-ns#typehttp://www.w3.org/2002/07/owl#Class
http://example.ru/sample#SecondClasshttp://www.w3.org/2000/01/rdf-schema#subClassOfhttp://example.ru/sample#OurFirstClass

Обращаться к классам по их URI не очень-то удобно, даже если определить префикс. Нужно учитывать, что URI, например, не может содержать пробелов, и ряд других спецсимволов – значит, все "имя" класса должно представлять собой одно слово. Если мы хотим, чтобы с нашими классами работали пользователи, не знакомые с семантическими технологиями, желательно спрятать от них тот факт, что уникальным идентификатором класса является URI. Для этого нужна возможность задавать для классов читаемые имена, предпочтительно – на нашем родном языке.

В Protégé для этого предназначена закладка Annotations в свойствах класса. Нажав на расположенную в ней кнопку "+", увидим диалоговое окно создания описаний:

Описание класса в редакторе Protégé
Описание класса в редакторе Protégé

Слева перечислены несколько стандартных свойств, используемых для описания элементов модели. Они являются встроенными определениями, предусмотренными стандартами RDF/OWL. Важнейшим из них является label – это свойство как раз и предназначено для задания читаемых имен элементов. Часто используется также comment – комментарий, расширенное описание элемента.

Выбрав свойство label, в поле ввода в правой части окна вводим его значение. Обратите внимание, что внизу предусмотрена также возможность задать тип значения (в данном случае это будет строка, string) или язык (русский). Тип значения задавать не обязательно, а вот язык имеет смысл выбрать в том случае, если необходимо задать названия элемента на нескольких языках. В XML/RDF наше описание будет выглядеть так:

<owl:Class rdf:about="http://example.ru/sample#SecondClass" />
		<rdfs:label>Второй класс</rdfs:label>
		<rdfs:subClassOf="http://example.ru/sample#OurFirstClass" />
	</owl:Class>

Триплет, соответствующий описанию, выглядит так:

http://example.ru/sample#SecondClasshttp://www.w3.org/2000/01/rdf-schema#label"Второй класс"

Имена (label) и прочие аннотации присваиваются одинаковым образом всем основным элементам семантической модели – классам, индивидуальным объектам и свойствам.

Следующая глава: Простые онтологические модели: индивидуальные объекты и свойства