Знакомимся с RDF и Semantic Web через N3

Мир Semantic Web опирается на RDF, и, в основе своей, весьма прост. Эта статья познакомит вас с базовыми понятиями Semantic Web. Мы будем использовать упрощенный язык представления семантических данных (Нотацию 3 или N3), который в основном эквивалентен представлению RDF в форме XML, но гораздо проще для понимания и использования человеком.

Субъект, предикат (глагол) и объект

В RDF, информация представляет собой просто совокупность предложений (утверждений), каждое такое предложение состоит из субъекта, предиката (глагола) и объекта, и все. Более — ничего. Поэтому предложения Semantic Web часто называют RDF тройками. В N3, вы можете написать RDF тройку так:

   .

Что значит следующее: Пэт знает Джо. Обратите внимание на точку в конце предложения.

Все в RDF, и субъекты, и предикаты, и объекты, идентифицируется с помощью Унифицированных Идентификаторов Ресурсов (URI). URI, говоря попросту, это адреса в Сети, такие как: или . Когда все до символа «#» пропущено, мы получаем идентификаторы такие как .

Существует одно исключение из этого правила: объекты (и только объекты) могут быть литералами, например строками или целыми числами:

   .
24 .

Глагол «knows» (знает) в RDF называется свойство (property) и его следует воспринимать как существительное, которое определяет отношение между двумя другими существительными. Фактически вы можете написать:

   .

или, чтобы сделать более понятным:

 has   .

или, даже:

 is  of  .

Когда у вас есть несколько предложений об одном и том же субъекте вы можете использовать сокращенную запись. Перечисляйте свойства субъекта через точку с запятой “;” и используйте запятую, для перечисления нескольких объектов с одинаковыми субъектом и предикатом.

  , ,  ;  24 ;
"blue" .

Так, например, данные в таблице

  age eyecolor
pat 24 blue
al 3 green
jo 5 green

могут быть записаны так:

   24;  "blue" .   3;  "green" .
5; "green" .

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

  [  4 ] , [  3 ].

Вы можете прочитать эту фразу так: у Пэт есть ребенок в возрасте 4 лет и еще один ребенок в возрасте 3 лет. Нужно запомнить две важные вещи:

  • Идентификаторы – это только идентификаторы. Тот факт, что мы используем буквы p a t, ни для кого не означает, что мы говорим о ком-нибудь, чье имя – Пэт. По крайней мере, пока мы не укажем, что «Pat». То же самое относится и к предикатам. Не думайте, что символы c h i l d, передают какую-либо семантику.
  • Квадратные скобки декларируют, что существует нечто, обладающее указанными свойствами, но не дают вам возможности сослаться на это нечто из другого места, неважно в этом же или в другом документе.

Если мы действительно хотим использовать имена, мы должны представить данные из вышеуказанной таблицы следующим образом:

 [  "Pat";  24;  "blue" ]. [  "Al" ;  3;  "green" ].
[ "Jo" ; 5; "green" ].

Существует множество способов объединять квадратные скобки, вы сможете это увидеть из примеров ниже. Нам осталось совсем не много узнать о том как представлять данные в формате N3, так что, давайте продолжим.

Согласованное использование понятий

Semantic Web не может определить в одном документе, что обозначает некая сущность. Вы можете это сделать на английском языке (или, иногда, на языке математики), но когда мы используем слово «название» в реальных коммуникациях (например: в каталожной карточке в библиотеке, или на веб-странице), мы полагаемся на то, что это понятие – широко распространено и всем понятно. В Semantic Web мы обеспечиваем согласованное использование понятий благодаря тому, что всегда указываем один и тот же URI для понятия «название».

Я могу попробовать дать название для документа N3:

   "Простой пример использования N3".

(Знак , то есть пустой URI всегда ссылается на документ, в котором он указан.) URI — ссылается на понятие «название». Это не слишком много скажет потенциальному читателю. Однако, группа людей разработала список свойств, который называется Дублинское Ядро Dublin Core, и среди этих свойств есть «название». Этому свойству они дали идентификатор . Так что мы можем создать гораздо более точно определенное предложение, если мы напишем следующее:

  "Простой пример использования N3".

Конечно, это выражение немного более длинное, представьте себе использование таких длинных идентификаторов для всех понятий, таких как #age и #eyecolor выше. Поэтому N3 предоставляет вам возможность указать короткий префикс для длинных частей идентификаторов. Эти длинные части мы называем пространствами имен namespace. Для того, чтобы использовать короткие префиксы для пространств имен воспользуйтесь директивой «@prefix»:

@prefix dc:  .
dc:title "Primer - Getting into the Semantic Web and RDF using N3".

Заметьте, когда вы используете префикс, вы вставляете двоеточие вместо решетки («#»), между dc и title, и вы не используете вокруг идентификатора. Это гораздо быстрее. Так обычно записываются почти все предикаты в N3. Однажды определив префикс, вы можете использовать его везде до конца файла.

Существует большое, к тому же, постоянно увеличивающееся, количество RDF словарей, которые вы можете использовать для своих ссылок. Посмотрите RDF home page для примера.

Далее мы собираемся использовать широко известные пространства имен, чтобы сэкономить место. Мы воспользуемся следующими префиксами:

@prefix rdf:   . @prefix rdfs:  . @prefix owl:   .

Это пространства имен для RDF, RDF Схемы, и OWL соответственно. Они предоставят нам базовые термины, которые мы сможем использовать в наших приложениях Semantic Web. Мы также определим пустой префикс для документа, который мы редактируем:

@prefix :  .

Это значит, что мы можем переписать примеры следующим образом:

:pat :child [ :age 4 ] , [ :age 3 ].

Теперь вы понимаете как представлять данные в формате N3, и вы можете начать создавать свои собственные словари.

Создание словарей

Такие вещи как dc:title выше – это RDF Свойства. Когда вы хотите определить новый словарь, вы определяете новые классы вещей и новые свойства. Когда вы говорите, что нечто является чем-то, то вы констатируете какому Class это нечто принадлежит.

Свойство, которое определяет тип сущности – это

rdf:type

что можно в сокращенном виде представить в N3 как просто

a

. Так что мы можем определить класс человека так:

:Person a rdfs:Class.

В том же документе мы можем поместить описание конкретного человека.

:Pat a :Person.

Классы просто говорят вам о том, какие вещи в них входят. Объекты могут одновременно принадлежать нескольким классам. При этом не обязательно должна присутствовать, какая-нибудь, иерархическая структура, скажем, объект может сразу принадлежать классам: Человек, АнимационныйОбъект, Животное, ВысокийЧеловек, Друг и т.д. Если существует связь между двумя классами, вы можете констатировать ее. Посмотрите на свойства (классов) в словарях RDF Schema и OWL.

:Woman a rdfs:Class; rdfs:subClassOf :Person .

Свойство – это средство для определения связей между сущностями.

:sister a rdf:Property.

Когда субъект свойства должен принадлежать некоторому классу, этот класс называется доменом (domain) свойства. Когда объект должен принадлежать классу, то этот класс является областью распространения (range) свойства. Свойство может иметь множество доменов и множество областей распространения, но обычно определяется только один домен и одна область распространения.

:sister rdfs:domain :Person; 
rdfs:range :Woman.

Заметим, что идентификаторы классов начинаются с заглавной буквы, а идентификаторы свойств с прописной. Это не является требованием, но это удобное соглашение, которого следует придерживаться. Заметим также, что, так как домен самих rdfs:range и rdfs:domain — это rdf:Property, то из этого следует, что :sister – это rdf:Property хотя мы этого и не утверждали явно.

Эквивалентность

Часто вы определяете словарь в котором один, или более терминов (вне зависимости от того понимали вы это когда начинали или нет) фактически точно такие же, как и в другом словаре. На самом деле – это лакомый кусочек информации для машины или человека, которые имеют дело с данными! Свойство эквивалентности между двумя терминами – столь полезно и фундаментально, что в нотации N3 есть для него специальное обозначение — «=».

:Woman = foo:FemaleAdult .
:Title a rdf:Property; = dc:title .

Совет: Используйте словари других людей когда вам предоставляется такая возможность, это облегчает обмен данными. Когда вы определяете ваш собственный словарь, который включает синонимы – констатируйте эквивалентность, потому что, это так же поможет существующим и будущим приложениям обрабатывать данные (как ваши, так и чужие), более разумным способом.

Выбор пространства имен и публикация вашего словаря

Хорошая документация, описывающая термины в вашем словаре, поможет людям читать и писать RDF данные. Писатели должны понимать, как предполагается использовать термин, читатели должны видеть, что он означает. Разработчики программного обеспечения, которое использует ваши термины должны подробно знать, что означает каждый URI.

Если вы документируете ваш словарь, используя RDF Schema и OWL, тогда ваша документация будет понятна машинам (см. Vocabulary Documentation. Этот вид RDF-документации-на-RDF иногда называется «схема» или «онтология».

Самый простой способ помочь людям найти вашу документацию – это сделать, чтобы URI, которые вы используете как термины в вашем словаре, также работали бы в веб-браузере. Это будет реализовано, если вы будете следовать нашему соглашению о наименовании, при котором документ определяющий словарь имеет URI вида:

http://example.com/terms

и он ссылается на свои термины так: . Вместе с определением префикса @prefix показанным выше, это дает URI

http://example.com/terms#Woman

, по которому любой браузер покажет ваш документ со спецификациями.

Лучше всего было бы опубликовать вашу документацию в Сети, используя сервер и порцию URI-пространства, которые принадлежат организации способной хорошо сопровождать их в будущем. В этом случае и много лет спустя RDF данные использующие ваши термины будут хорошо документированы и легко понятны. Соглашение, по которому текущий год вставляется в URI, может помочь обеспечить стабильность. Когда-нибудь у людей может возникнуть потребность повторно использовать

http://example.com/food-vocabulary

, но вряд ли кому понадобится

http://example.com/2003/food-vocabulary

. При некоторых обстоятельствах вы сможете так же добиться улучшения стабильности, используя специализированное доменное имя, которое может быть изолировано от возможных организационных переименований.

Конечно, если вы просто экспериментируете, вы можете использовать файл (скажем

mydb.n3

) в той же директории, что и остальная часть вашей работы. Когда вы поступаете так, вы можете просто использовать в качестве вашего идентификатора пространства имен, т.к. в N3 (так же как и в HTML), URI могут быть указаны относительно текущей позиции.

Дополнительно

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

Чтобы натолкнуть вас на новые идеи, мысли хочу предложить вам список более сложных примеров.

Также вы можете продолжить изучение возможностей языка. В этом случае вам стоит заглянуть сюда.