Россия, Звенигород |
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.