|
Статьи:
Пожалуйста, присылайте свои статьи, любые вопросы и информацию о проектах в области Semantic Web на ящик mishundic@mail.ru
|
Итак если вкратце, то RDF/A — принцип (языком это назвать сложно), по которому RDF-данные можно вставлять в другие XML документы. В основном под "другими XML документами" в этом контексте понимают XHTML и SVG.
Что такое RDF? Необходимо различать RDF-concept и RDF/XML Syntax. Первое — это сама концепция представления информации, второе — реализация концепции в виде XML-языка. Этот язык и называется RDF/XML.
Так вот для того, чтобы понять как встраивать RDF в XHTML, SVG и др.
документы прежде всего необходимо понять концепцию RDF. А понять ее можно очень
быстро. Потому что в ней вообще нет ничего сложного:
Любую информация можно
представить в виде множества неупорядоченных троек
S1 P1 O1 S2 P2 O2 S3 P3 O3 ...
где S — некоторый субъект, P — некоторый предикат, О — некоторый объект. Более привычная математическая запись будет выглядеть примерно так:
P1(S1,O1) P2(S2,O2) P3(S3,O3) ...
А что такого замечательного в таком представлении информации? Ответ: такая запись позволяет описать граф. Где предикаты — ребра графа, а объекты и субъекты — его вершины.
Но это все понятно, и было давным-давно. RDF предлагает пойти немного дальше:
любой субъект, предикат и объект — совершенно равноправны и называются
ресурсами. Т.е. в нашем графе ребро может стать вершиной, вершина — ребром и
вообще границы между ними размываются. Вот простой пример:
Миша прибирает комнату. Приборка помогает отвлечься.
Запишем эти предложения с помощью некоторого абстрактного синтаксиса RDF:
приборка(Миша, комната) помогает(приборка, отвлекаться)
PREFIX : <http://somesite.org/> SELECT $name WHERE {$name :приборка :комната}к документу из предыдущего примера, то его результатом будет таблица:
$name |
Миша |
Получилось, что в первом случае приборка — предикат, а во втором — субъект.
На самом деле — это естественно для нашего мира, и с помощью таких триплетов
можно описать совершенно любую информацию.
приборка, Миша, комната, помогает, отвлекаться — всё это в терминах RDF —
либо ресурсы, либо простые типы, например: приборка("Миша", комната). приборка и
комната — ресурсы, а "Миша" — строка.
Встает вопрос — где описывать сами
термины, что представляет из себя приборка, что такое комната. Специально для
этих целей и был разработан язык описания онтологий OWL.
RDF/A задумывался для того, чтобы вставлять метаинформацию прямо в код XHTML.
Допустим, в сети существует блог Ани Смит:
<html> <head><title>Jo's Blog</title></head> <body> ... <p> 8 мая в 10 утра я толкала речь на конференции XTech касательно некоторых заморочек web. </p> ... <p class="contactinfo"> Меня зовут Аня Смит. Я — супер web-дизайнер из "<a href="http://superdiz.org">СупёДиз</a>". Вы можете связаться со мной <a href="mailto:anya@superdiz.org">через e-mail</a>. </p> ... </body> </html>
В блоге Ани Смит можно найти полным полно метаданных:
Указано
событие, которое началось 8 мая в 10 утра. Его краткое
описание: "толкала речь на конференции XTech касательно некоторых заморочек
web". Так же имеется контактная информация: Аня работает в организации
СупёДиз. Её должность — супер web-дизайнер. С ней можно связаться
посредством e-mail: "anya@superdiz.org"
И вот в один прекрасный день Аня повысила свой скилл в SW и решила немного
переделать свой блог.
Т.к. событие, указанное в блоге является календарным Аня
решила юзать iCal. Прежде всего, для этого, она добавила в тег html атрибут
xmlns:cal
<html xmlns:cal="http://www.w3.org/2002/12/cal/ical#">
Теперь она может юзать все пространство имен iCal посредством префикса
cal.
После этого Аня определила новое событие:
<p role="cal:Vevent"> ... </p>
Затем, она определила краткое содержание события:
8 мая в 10 утра я <meta property="cal:summary">толкала речь на конференции XTech касательно некоторых заморочек web</meta>.
Время начала события — тоже метаданные. Но в тексте написано "8 мая в 10 утра", и просто запихнуть эту строку уже не получится, для даты и времени необходимо использовать определенный формат:
<meta property="cal:dtstart" content="20060508T1000-0500">8 мая в 10 утра</meta>
Всё, все метаданные, которые только могли выделить из события — выделили. Теперь будем разбираться с контактной информацией. Аня решила для этого использовать vCard RDF. Т.к. она собиралась юзать vCard только для определения контактной информации, то и префикс решила сделать contact:
<html xmlns:cal="http://www.w3.org/2002/12/cal/ical#" xmlns:contact="http://www.w3.org/2001/vcard-rdf/3.0#">
А вот сейчас внимательно следите за тем, что сделает Анька:
<p class="contactinfo" about="http://superdiz.org/staff/anya"> Меня зовут Аня Смит. Я — супер web-дизайнер из "<a href="http://superdiz.org">СупёДиз</a>". Вы можете связаться со мной <a href="mailto:anya@superdiz.org">через e-mail</a>. </p>
У тега <p>
появился атрибут about
(его
активно использует RDF/XML). Всё просто: этим атрибутом мы определили, что
субъектом (внутри контейнера <p>
) будет являться ресурс
"http://superdiz.org/staff/anya"
. Да, если вы заметили, то,
например, запись "cal:dtstart"
означает
"http://www.w3.org/2002/12/cal/ical#dtstart"
, а
"cal:summary"
— это
"http://www.w3.org/2002/12/cal/ical#summary"
.
Абсолютно все
ресурсы в SW представляются в виде URI (уникальных идентификаторов ресурсов).
Всем знакомый и всеми любимый URL — частный случай URI.
Теперь вставим вместе с Аней метаинформацию о ней:
<p class="contactinfo" about="http://superdiz.org/staff/anya"> Меня зовут <meta property="contact:fn">Аня Смит</meta>. Я — <meta property="contact:title">супер web-дизайнер</meta> из "<a rel="contact:org" href="http://superdiz.org">СупёДиз</a>". Вы можете связаться со мной <a rel="contact:email" href="mailto:anya@superdiz.org">через e-mail</a>. </p>
Обратите внимание: раньше мы использовали тег
<meta>
,
его атрибут property
задавал
предикат, а объектом при этом считалось:
content
, то собственно содержимое
тега;
content
указан, то содержимое этого атрибута.
Теперь появился атрибут rel
, а вместо meta
используется тег a
. Дело в том, что значение цели якоря (в общем,
для своих — значение атрибута href
в тегах a
и
подобных ему) — может стать объектом. Для таких случаев было решено
использовать атрибут rel
.
При этом значение атрибута rel — это предикат, а значение атрибута href — объект. (Естественно, — если оба эти атрибута указаны в одном теге).
Следует заметить, что вообще то в предыдущих примерах вместа тега
<meta>
можно было с уверенностью применять и какой-нибудь
другой, например <span>
, <strong>
или
<h1>
, это не принципиально, главное — наличие атрибута
property
.
Ладно, с Аней надо закончить, чтобы все было всем понятно построим на основе получившегося XHTML кода
<html xmlns:cal="http://www.w3.org/2002/12/cal/ical#" xmlns:contact="http://www.w3.org/2001/vcard-rdf/3.0#"> <p role="cal:Vevent"> <meta property="cal:dtstart" content="20060508T1000-0500"> 8 мая в 10 утра</meta> я <meta property="cal:summary">толкала речь на конференции XTech касательно некоторых заморочек web</meta>. </p> <p class="contactinfo" about="http://superdiz.org/staff/anya"> Меня зовут <meta property="contact:fn">Аня Смит</meta>. Я — <meta property="contact:title">супер web-дизайнер</meta> из "<a rel="contact:org" href="http://superdiz.org">СупёДиз</a>". Вы можете связаться со мной <a rel="contact:email" href="mailto:anya@superdiz.org">через e-mail</a>. </p> </html>
его RDF представление:
role
всего один раз, только в этом примере. Причем в RDF/A
Syntax про него вообще ничего не сказано, и наверное ничего сказано уже не
будет. Забавно и то, что в другой версии RDF/A Primer этот атрибут тоже негде не
светится. В общем — все прелести W3C working draft налицо :-), поэтому верхнюю
часть примера транслировать в RDF я отказываюсь по идеологическим соображениям.
А вот нижнюю (абзац с контактной информацией) — охотно: <http://superdiz.org/staff/anya> contact:fn "Аня Смит"^^XMLLiteral. <http://superdiz.org/staff/anya> contact:title "СупёДиз"^^XMLLiteral. <http://superdiz.org/staff/anya> contact:org <http://superdiz.org>. <http://superdiz.org/staff/anya> contact:email <mailto:anya@superdiz.org>. или в более компактной форме: (обратите внимание на то, как используются символы ; и .) <http://superdiz.org/staff/anya> contact:fn "Аня Смит"^^XMLLiteral; contact:title "СупёДиз"^^XMLLiteral; contact:org <http://superdiz.org>; contact:email <mailto:anya@superdiz.org>.
Такой тип записи нам
знаком:<http://superdiz.org/staff/anya>
—
субъектcontact:fn
— предикат"Аня Смит"
—
объект, значение типа XMLLiteral;
и так аналогично — все другие три
строки.
Кстати, привыкайте именно к такой записи. Это — один из "официальных" типов записи RDF данных (N-TRIPLES).
Все, с Аней разобрались. Идем дальше.
Пример W3C:
<span about="/user/markb/photo/23456" property="dc:title"> Sunset in Nice </span>
Эквивалентно RDF-записи
</user/markb/photo/23456> dc:title "Sunset in Nice"^^XMLLiteral.
Т.е. показан пример того, как одном теге можно определить и субъект и предикат, а в содержимом тега — объект.
Можно писать и вот так:
<a about="/user/markb/photo/23456" rel="dc:creator" href="/user/markb">Mark Birbeck</a>
Эквивалентно RDF-записи
</user/markb/photo/23456> dc:creator </user/markb>.
Уже знаем, как использовать rel
и property
.
В
RDF/A есть еще один подобный атрибут — rev
. Но действует он
наоборот, т.е. объект становится субъектом, а субъект объектом.
В общем,
легче на примере объяснить:
<link about="mailto:misha@mail.ru" rev="foaf:knows" href="mailto:any@mail.ru" />
в виде RDF:
<mailto:any@mail.ru> foaf:knows <mailto:misha@mail.ru>.
Что означает — Аня знает Мишу. Несмотря на то, что href стоит на Аню.
Если связь двухсторонняя, то необходимо использовать оба атрибута: и
rel
(кстати, от анг. relation) и rev
(от анг.
reverse). Пример:
<link about="mailto:misha@mail.ru" rel="foaf:knows" rev="foaf:knows" href="mailto:any@mail.ru" />
в виде RDF:
<mailto:any@mail.ru> foaf:knows <mailto:misha@mail.ru>. <mailto:misha@mail.ru> foaf:knows <mailto:any@mail.ru>.
Необходимо разобраться еще с одним атрибутом — id
.
Этот
атрибут может быть некоторым знаком из HTML. В RDF/A (а также в RDF/XML) он
сохраняет свои свойства.
Что мы знаем о атрибуте id
. Его значение должно быть уникально
для документа, т.е. в одном документе не может быть указано два элемента с
одинаковым id. А любой документ имеет уникальный адрес в сети — его URL.
Тогда получается, что конструкция
url_документа#какой-то_id
указывает на какой-то конкретный элемент в конкретном документе.
А что у нас должно иметь уникальное имя? Правильно — ресурс. Т.е с помощью атрибута id можно определить какой-то ресурс. Не просто описать, а именно определить его (создать, если хотите). Описывать можно любой ресурс в сети, например, мы спокойно в своем документе, который имеет URI http://www.somesite.org/somedir можем описывать ресурсы определенные на http://www.nike.com/mynike (например, <http://www.nike.com/mynike#boots>)
Но создать ресурс в документе http://www.somesite.org/somedir мы можем только с URI подобным <http://www.somesite.org/somedir#someid>
Небольшой ликбез по принципам SW закончился.
Вернемся к нашему атрибуту id. Посмотрим как его используют в RDF/XML:
<rdf:Description rdf:ID="someid"> <dc:creator rdf:resource="http://www.example.org/staffid/85740"/> </rdf:Description> а если наш Индивид — экземпляр какого-то класса, то можно записать так: <rdf:Description rdf:ID="someid"> <rdf:type rdf:resource="http://www.example.com/terms#someClass"/> <dc:creator rdf:resource="http://www.example.org/staffid/85740"/> </rdf:Description> или объявить в начале пространство имен ex <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ex="http://www.example.com/terms#"> и писать так: <rdf:Description rdf:ID="someid"> <rdf:type rdf:resource="ex:someClass"/> <dc:creator rdf:resource="http://www.example.org/staffid/85740"/> </rdf:Description> или так: <ex:someClass rdf:ID="someid"> <dc:creator rdf:resource="http://www.example.org/staffid/85740"/> <ex:someClass>
Теперь посмотрим какие аналогии нам предлагает RDF/A. Тоже самое в XHTML с применением RDF/A можно было записать например так:
<span id="someid" about="#someid"> <a rel="dc:creator" href="http://www.example.org/staffid/85740"/> </span> а если наш Индивид — экземпляр какого-то класса, то можно записать так: <span id="someid" about="#someid"> <link rel="rdf:type" href="http://www.example.com/terms#someClass" /> <a rel="dc:creator" href="http://www.example.org/staffid/85740"/> </span> или объявить в начале пространство имен ex <html xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ex="http://www.example.com/terms#"> и писать так: <span id="someid" about="#someid"> <link rel="rdf:type" href="[ex:someClass]" /> <a rel="dc:creator" href="http://www.example.org/staffid/85740"/> </span>
about
и href
.href
окружено квадратными скобками;
Чтобы не осталось недоговоренностей, рассмотрим еще несколько случаев:
1. Часто можно встретить подобную запись:
<html> <head> <title>Jo Lambda's Home Page</title> </head> <body> <p> Hello. This is <span property="foaf:name">Jo Lambda</span>'s home page. <h2>Work</h2> If you want to contact me at work, you can either <a rel="foaf:mbox" href="mailto:jo.lambda@example.org">email me</a>, or call <span property="foaf:phone">+1 777 888 9999</span>. </p> </body> </html>
что соответствует RDF:
<> foaf:name "Jo Lambda"^^rdf:XMLLiteral ; foaf:mbox <mailto:jo.lambda@example.org> ; foaf:phone "+1 777 888 9999"^^rdf:XMLLiteral .
Субъектом здесь является <>
, т.е. сам документ. В сети
ресурс <>
— это URL самого документа. При желании можно
использовать xml:base
:
<html xml:base="http://mysite.org/"> ...
что будет соответствовать
<http://mysite.org/> foaf:name "Jo Lambda"^^rdf:XMLLiteral ; foaf:mbox <mailto:jo.lambda@example.org> ; foaf:phone "+1 777 888 9999"^^rdf:XMLLiteral .
В документе RDF/A Syntax приводится пример, когда атрибут
xml:base
используется в теге <p>. Но я считаю, что логичнее
использовать его только в теге html (причем указывать в виде базы действительно
какой-то свой ресурс), во всех остальных тегах использовать атрибут
about
и пространства имен, определенные в теге html.
xml:base
.<p xml:base="http://nike.org/news"> <span id="boots" about="#boots"> <a rel="dc:creator" href="http://www.mishundic.ru"/> </span> </p>Что означает, что я определил ресурс <http://nike.org/news#boots>. Не описал, а именно создал (!).
xml:base
, однако надо еще основательно продумать вопросы
безопасности.id
) мне все-таки хотелось бы самому.
Об этом W3C и нам следует подумать. А может они там в Силиконовой Долине уже подумали и все решили, да только я пока не знаю. Кто что-нибудь узнает или придумает — кидайте мне на мыло.
2. Момент второй. Типы (datatype).
Рассмотрим два примера XHTML кода, который использует RDF/A:
<span property="dc:creator" content="Анна Смит">Анька</span> и <span property="dc:creator">Анна Смит</span>
на первый взгляд, эти два тега транслируются в одинаковое RDF представление, но разница есть:
В первом случае — строка типа plain literal: <> dc:creator "Анна Смит" . В втором случае — строка типа XMLLiteral: <> dc:creator "Анна Смит"^^rdf:XMLLiteral .
В чем разница между ними:
Используя content
<head about=""> Автор: <span property="dc:creator">Альберт Энштейн</span><br /> <meta property="dc:title" content="E = mc<sup>2</sup>: The Most Urgent Problem of Our Time" /> </head>
и получаем plain literal
<> dc:title "E = mc&lt;sup&gt;2&lt;/sup&gt;: The Most Urgent Problem of Our Time" .
Используя само содержимое тега:
<head about=""> Author: <span property="dc:creator">Albert Einstein</span> <h2 property="dc:title"> E = mc<sup>2</sup>: The Most Urgent Problem of Our Time </h2> </head>
получаем то, что ожидали
<> dc:title "E = mc<sup>2</sup>: The Most Urgent Problem of Our Time"^^rdf:XMLLiteral .
RDF для plain literal позволяет устанавливать язык, например у нас есть текст и его заглавие на английском и русском языке:
<http://example.org/node> <ex:description> "Some title"@en; <ex:description> "Некоторое описание"@ru .
Тогда соответствующий кусок XHTML может выглядеть примерно так:
<meta about="http://example.org/node" property="ex:description" xml:lang="en" content="Some title" /> <meta about="http://example.org/node" property="ex:description" xml:lang="ru" content="Некоторое описание" /> или с указанием datatype="plaintext" <span about="http://example.org/node" property="ex:description" xml:lang="en" datatype="plaintext">Some title</span> <span about="http://example.org/node" property="ex:description" xml:lang="ru" datatype="plaintext">Некоторое описание</span>
В общем, xml:lang применяется только к plain literal.
Но встает вопрос, какие вообще типы мы можем применять, какие значения может
принимать атрибут datatype
?
datatype может иметь диапазон литералов RDF или простых типов, определенных в XML Schema datatypes.
Следующие типы данных рекомендуются для использования в OWL. Я думаю, что для RDF/A следует использовать аналогичные типы:
xsd:string xsd:normalizedString xsd:boolean xsd:decimal xsd:float xsd:double xsd:integer xsd:nonNegativeInteger xsd:positiveInteger xsd:nonPositiveInteger xsd:negativeInteger xsd:long xsd:int xsd:short xsd:byte xsd:unsignedLong xsd:unsignedInt xsd:unsignedShort xsd:unsignedByte xsd:hexBinary xsd:base64Binary xsd:dateTime xsd:time xsd:date xsd:gYearMonth xsd:gYear xsd:gMonthDay xsd:gDay xsd:gMonth xsd:anyURI xsd:token xsd:language xsd:NMTOKEN xsd:Name xsd:NCName
Т.е., например, можно использовать datatype так:
Ане <span about="mailto:any@mail.ru" property="ex:yearsold" datatype="xsd:decimal">17</span> лет.
3. И, наконец, момент третий: Использование OWL.
Сперва наперво, следует ответить на вопросы:
— OWL позволяет создавать и описывать ресурсы (причем не только классы, но и индивиды), тогда получается, что RDF можно не использовать?
— Язык OWL все-таки создавался для описания классов, в нем можно (и иногда даже нужно создавать индивиды), но по замыслам W3C для создания и описания индивидов необходимо использовать RDF.
— Ну хорошо, тогда встает вопрос, как подключит онтологию OWL в XHTML документе и использовать её
— Вот так:
Просто подключаем онтологию как пространство имен, например так: <html xmlns:some ="http://www.mysite.org/ontologies/someontology#"> Причем при запросе к http://www.mysite.org/ontologies/someontology должен возвращаться OWL документ
Допустим, в нашей онтологии, на языке OWL, мы определили класс Person и свойства favoriteFood и favoriteCar.
Теперь в XHTML (при помощи RDF/A) мы можем создать экземпляр класса Person (индивид) и задать его свойство favoriteFood:
<div id="Anya" about="#Anya"> <link rel="rdf:type" href="[some:Person]" /> Аня любит <span property="ex:favoriteFood">персики</span>. </div>
Довольно коряво, но вот Ваня на своем сайте может использовать ресурсы Аниного сайта и описать некоторые из них, например так:
<div about="http://anya.ru#Anya"> Аня любит <span property="ex:favoriteCar">BMW</span>. </div>
Смотрится уже понятней и логичней.
— Предоставляет ли RDF/A возможность встраивать в XHTML RDF данные так же, как это можно сделать применяя RDF/XML?
— Нет. На сегодняшний момент RDF/A является менее выразительным средством по сравнения с RDF/XML.
Вопрос использования RDF/A остается открытым. Более того, — RDF/A возможно будет развиваться и дальше, по крайней мере, документ W3C RDF/A Syntax находится на стадии Editor's Draft, т.е. RDF/A (в отличие от RDF/XML) — не является пока рекомендацией W3C.
«RDF/XML Syntax Specification (Revised)». — спецификация синтаксиса RDF/XML.
«OWL, язык веб-онтологий. Руководство». — перевод руководства по OWL (выполнил Дмитрий Щербина).