Опубликован: 10.12.2007 | Доступ: свободный | Студентов: 822 / 20 | Оценка: 5.00 / 5.00 | Длительность: 58:33:00
Лекция 11:

RDF

11.4.5 Теги <Seq>, <Bag>, <Alt> и <li>

<Seq>, <Bag> и <Alt> – три тега-контейнера RDF.

<Seq> представляет собой последовательность6Англ. sequence – последовательность. элементов или упорядоченный список. Предполагается, что элементы, находящиеся в этом контейнере, упорядочены. Этот контейнер может использоваться, в частности, для хранения информации о последовательности событий, например, списка недавно выполненных команд.

<Bag> представляет собой простую коллекцию элементов без каких-либо ограничений на ее состав.

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

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

Контейнеры содержат элементы, каждый из которых заключен в тег RDF <li>, подобно элементам списков <UL> и <OL> в языке HTML. Каждый элемент контейнера является объектом. Поскольку объект в RDF может быть представлен контейнером или тегом <Description>, контейнеры могут быть вложенными. В листинге 11.9 приведен пример простого контейнера.

<Description about="www.example.com/#Том">
  <ns:Владелец>
    <Bag ID="Собаки">
      <li>Спот</li>
      <li>Фидо</li>
      <li>Цербер</li>
    </Bag>
  </ns:Владелец>
</Description>
Листинг 11.9. Пример контейнера RDF

Смысл этой записи прозрачен: Том – владелец Спота; Том – владелец Фидо; Том – владелец Цербера. Контейнер позволяет компактно записать несколько однородных фактов. К сожалению, интерпретация самого контейнера с точки зрения фактов является несколько неуклюжей. Эквивалентный набор фактов показан в листинге 11.10.

<- "www.example.com/#Том", ns:Владелец, "Собаки" ->
<- "Собаки", rdf:_1, "Спот" ->
<- "Собаки", rdf:_2, "Фидо" ->
<- "Собаки", rdf:_3, "Цербер" ->
Листинг 11.10.

RDF предназначен исключительно для выражения фактов, поэтому любой контейнер должен быть представлен как набор фактов. Для этого при интерпретации RDF-файла создается специальный терм, соответствующий контейнеру как целому. С точки зрения факта, задаваемого тегом <Description>, этот терм является объектом. Кроме того, как показано в листинге, создается ряд фактов по числу элементов контейнера, в которых этот новый терм является субъектом. Объектом в каждом из них является один из элементов контейнера. Это обычные факты, устанавливающие отношение "один к одному". Все эти термы и факты добавляются к хранилищу файлов, создаваемому при чтении и интерпретации документа RDF.

Однако для того, чтобы этот подход мог работать, необходимо решить две проблемы. Во-первых, новому субъекту требуется идентификатор или, по крайней мере, соответствующий ему литерал. Кроме того, у вновь создаваемых фактов, помимо субъекта и объекта, должны быть также предикаты (имена свойств).

Первая проблема решается просто – создатель документа должен снабдить тег-контейнер атрибутом ID или about. В противном случае контейнер будет анонимным, а документ RDF – неопределенным. Таких документов следует избегать, поскольку шаблоны Mozilla не могут работать с ними.

Вторая проблема решается в процессе интерпретации документа RDF программой. Если программа отвечает спецификации RDF, она автоматически создаст предикаты для новых фактов. Эти предикаты будут иметь имена _1, _2, _3. Поскольку эти имена относятся к пространству имен RDF, они будут иметь вид rdf:_1, rdf:_2 и т.д., при условии, что префикс rdf присвоен этому пространству имен. Таково происхождение предикатов, использованных в листинге 11.10.

в листинге 11.11 представлены факты, эквивалентные записи в листинге 11.9 (т.е. порождающие в хранилище фактов ту же структуру при интерпретации документов RDF). Спецификация RDF содержит ряд схем, иллюстрирующих приведение контейнеров к "обычным" фактам, с которыми полезно познакомиться.

<Description about="www.test.com/#Том">
  <ns:Владелец resource="Собаки"/>
</Description>
<Description about="Собаки" rdf:_1="Спот"/>
<Description about="Собаки" rdf:_2="Фидо"/>
<Description about="Собаки" rdf:_3="Цербер/>
Листинг 11.11. Факты RDF, эквивалентные контейнеру с тремя элементами.

Для факта с предикатом <rdf:_1> использована сокращенная запись, поскольку объектом является литерал. Мы не можем использовать аналогичную форму записи для первого факта, поскольку его объект, "Собаки", в данном случае рассматривается как фрагмент URL, а не как литерал. Использовать или не использовать контейнеры – выбор разработчика, однако они, как правило, выглядят аккуратнее, чем эквивалентный набор тегов <Description>.

Все эти факты хранятся во внутреннем представлении документа RDF отдельно, и с формальной точки зрения они не связаны между собой. Приложение не может обнаружить в листинге 11.11 одного факта, указывающего на то, что Том – хозяин Спота. Это означает, что приложение, которому может понадобиться данный факт, должно быть способно восстановить структуру графа фактов и перемещаться по нему, распознавая контейнеры, либо анализировать содержание исходного файла каким-то другим способом. Первый подход представляется значительно более эффективным.

Тег-контейнер может иметь следующие атрибуты:

ID type

Атрибут ID аналогичен тому же атрибуту тега <Description>.

Значение атрибута type не определяется автором документа. Оно автоматически устанавливается равным имени тега-контейнера (например, rdf:Bag ), которое и считается типом данного тега. Эта пара атрибут-значение образует отдельный факт, субъектом которого является значение атрибутов about или ID тега-контейнера. Однако считается, что предикатом этого факта является не type, а специальное значение instanceOf. В примере с тремя собаками этот факт имеет следующий вид:

<- "Собаки",
http://www.w3.org/1999/02/22-rdf-syntax-ns#instanceOf,
http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag
->

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

В тегах-контейнерах также может использоваться та же общая форма сокращенной записи "свойство = значение", что и в теге <Description>. Для тега <li> определены следующие атрибуты:

parseType resource

Они аналогичны соответствующим атрибутам тегов-предикатов и допускают те же формы сокращенной записи.

На этом мы заканчиваем обсуждение синтаксиса RDF и переходим к примерам использования RDF в Mozilla.