Россия, Звенигород |
RDF
11.4 Синтаксис RDF
Синтаксис RDF основан на нескольких стандартах и других документах.
Разумеется, наиболее важными из них являются стандарты (спецификации), относящиеся собственно к RDF. Эта группа стандартов Консорциума W3C состоит из двух основных частей и разрабатывалась в два этапа.
На первом этапе стандартизации RDF, имевшем место в 1999–2000 гг., были разработаны два основных документа:
http://www.w3.org/TR/1999/REC-rdf-syntax-19990222. "Окончательная рекомендация по модели и синтаксису RDF 1.0". Под моделью понимается концептуальная модель, лежащая в основе языка.
http://www.w3.org/TR/2000/CR-rdf-schema-20000327. Этот документ разрабатывался в течение нескольких лет. Он определяет схему RDF (RDF Schema) – способ задания словаря для документов RDF. Такой словарь задает допустимые теги и атрибуты, их сочетания и, в конечном счете, семантику документов. Схема RDF отличается от схемы XML (XML Schema).
Второй этап стандартизации RDF состоял в расширении и завершении существующих документов. Новые версии документов были окончательно приняты в 2003 г.:
http://www.w3.org/TR/rdf-syntax-grammar/, "Спецификация синтаксиса RDF/XML (пересмотренная)", представляет собой обновленный вариант первого из двух документов, перечисленных выше.
http://www.w3.org/TR/rdf-schema/, "Язык описания словаря RDF 1.0: RDF Schema", – развитие второго документа.
Существует также ряд пояснительных документов, посвященных различным аспектам RDF и доступных на сайте Консорциума W3C: http://www.w3.org/.
Из перечисленных спецификаций Mozilla практически полностью реализует первый документ (рекомендацию 1999 г.) и некоторые новые возможности, введенные третьим документом (пересмотренной рекомендацией).
Другие стандарты, тесно связанные с RDF, – спецификации, относящиеся к пространствам имен XML и схемам XML. Mozilla поддерживает схемы XML, однако эта функциональность никак не используется при обработке RDF. Некоторая поддержка RDF встроена непосредственно в XUL.
Эти стандарты предлагают способ описания фактов при помощи тегов XML. Субъекты и объекты фактов могут быть представлены атрибутами тегов или (в случае объектов) текстовыми узлами, заключенными в теги. Однако стандарты определяют лишь небольшое количество конкретных тегов. Предполагается, что дополнительные теги и атрибуты определяются разработчиком конкретного приложения.
Эти дополнительные имена образуют словарь, который может быть формально описан в документе RDF или XML Schema. Существуют широко известные словари, снабженные спецификациями и пояснениями для облегчения их использования. Наиболее известным словарем является Dublin Core ("Дублинское ядро"), содержащий ключевые слова для описания источников информации. Этот словарь используется, главным образом, для составления каталогов библиотек и архивов и содержит такие предикаты, как, например, "Title" (название) и "Author" (автор).
Mozilla не использует Dublin Core в качестве словаря и не поддерживает использование схем XML для определения словаря. Вместо этого поддержка нескольких словарей встроена непосредственно в платформу. Система обработки RDF позволяет разработчику использовать в документах любые имена без какого-либо формального определения. Поэтому имена предикатов можно вводить "на лету", подобно именам переменных JavaScript.
11.4.1 Основные концепции синтаксиса
Документ RDF представляет собой документ XML, а сам RDF является приложением XML. Платформа Mozilla использует для RDF следующее пространство имен:
http://www.w3.org/1999/02/22-rdf-syntax-ns#
Файлы с документами RDF должны иметь расширение .rdf. Mozilla поддерживает следующие типы MIME для документов RDF:
text/rdf text/xml
Однако версия 1.4 еще не поддерживает официального типа MIME для документов RDF, установленного документом RFC 3023:
application/rdf+xml
11.4.1.1 Теги
Основная цель RDF – предоставить синтаксис для описания фактов. XML предоставляет различные возможности для выражения фактов. Некоторые гипотетические варианты показаны в листинге 11.6.
<факт субъект="..." предикат="..." объект="..."/> <факт> <субъект .../> <предикат .../> <объект .../> </факт> < субъект ... предикат="..." объект="..."/>Листинг 11.6. Возможные варианты синтаксиса XML для описания фактов.
Однако в RDF не используется ни один из этих вариантов. Синтаксис RDF имеет следующую форму:
<факт субъект="..."> <предикат>объект</предикат> </факт>
Эта запись отражает лишь общую концепцию синтаксиса RDF. Ниже приведено синтаксически корректное описание факта на языке RDF:
<Description about="http://www.mozilla.org/"> <NC:LastVisited>10 января 2004</NC:LastVisited> </Description>
Такой синтаксис допускает вложение одних фактов в другие. Он может служить основой для нескольких видов сокращенной записи и сходен с некоторыми web-технологиями. К сожалению, терминология RDF представляет серьезную трудность для начинающего пользователя. Она не использует таких терминов как "субъект" или "предикат" и вообще основана скорее на некоторых частных идеях, чем на общей концепции фактов, изложенной в этой лекции. Это делает RDF весьма сложным для освоения.
При разработке RDF его авторы стремились сделать синтаксис языка сходным с существующими web-технологиями, поскольку RDF был задуман как средство описания web-ресурсов. Вместо субъекта, отношение которого к объекту описывается предикатом, терминология RDF говорит о ресурсах, обладающих свойствами, которым, в свою очередь, присваиваются значения. С одной стороны, это может облегчить освоение RDF для некоторых разработчиков. С другой стороны, RDF, по сути, является средством работы с любыми фактами, и никакой выбор синтаксиса не может изменить этого, хотя и может дезориентировать разработчика. В таблице 11.2 терминология, используемая для описания фактов, сопоставлена с терминами RDF.
На практике полезно комбинировать оба подхода. С общей точки зрения, RDF представляет собой средство работы с фактами, и с ним целесообразно работать, имея в виду соответствующую концептуальную модель. В конкретных ситуациях, например, когда небольшой набор фактов образует компактное дерево, взгляд на него как на иерархию ресурсов и свойств может оказаться более продуктивным. Поскольку многие документы RDF невелики или сильно структурированы, этот подход часто оказывается эффективными.
В качестве примера рассмотрим уже встречавшийся нам простой тег <Description> 4Описание. (Прим. пер.) В модели фактов он интерпретируется следующим образом. Тег <Description> определяет субъект факта (на который указывает атрибут about этого тега). Если тег имеет содержимое, оно представляет прочие термы данного факта и, возможно, вложенные факты. В приведенном выше примере тег <NC:LastVisited> представляет собой предикат, а его содержимое, простая строка "10 января 2004", – объект. В терминологии RDF Та же конструкция интерпретируется иначе. Тег <Description> определяет ресурс. Этот ресурс может иметь свойства, выраженные другими тегами. Тег <NC:LastVisited> – одно из таких свойств, значением которого является "10 января 2004".
Терминология RDF удобна тем, что большинство имен предикатов, используемых в Mozilla, похожи скорее на свойства. Хотя color (цвет), как и любое другое слово, может использоваться в качестве предиката, оно напоминает скорее свойство DOM или CSS, а не отношение, выражаемое предикатом. В любом случае, применительно к RDF термины предикат и свойство являются полностью взаимозаменяемыми.
Вот полный список основных тегов RDF:
<RDF> <Description> <Seq> <Bag> <Alt> <li>
Последние четыре тега являются избыточными – эквивалентные им конструкции могут быть выражены при помощи тега <Description> – так что RDF имеет очень ограниченный набор тегов. Хотя теги для выражения предикатов выбираются исходя из потребностей конкретного приложения, в RDF предусмотрено несколько таких тегов, а именно:
<Statement> <subject> <predicate> <object>
Эти теги предназначены для реификации фактов. <Statement> используется для реификации самого факта5Англ. "утверждение". (Прим. пер.) , а остальные три тега – для каждого из трех термов триплета. Ни один из этих четырех тегов не поддерживается Mozilla.
11.4.1.2 Контейнеры.
RDF поддерживает контейнеры – способ организации однотипных фактов. Контейнер состоит из обрамляющего тега <Bag>, <Seq> или <Alt>, а также тегов <li>, в которые заключаются элементы контейнера. Контейнер вместе со своим содержимым образует коллекцию. Эта коллекция может быть помещена вместо объекта какого-либо факта. Контейнер выглядит следующим образом:
<Description> <Bag> <li>объект 1</li> <li>объект 2</li> <li>объект 3</li> </Bag> </Description>
В обычном факте между объектом и субъектом (или между ресурсом и значением свойства) существует отношение "один к одному". У каждого объекта есть один субъект. В случае контейнеров отношение между фактом и объектом имеет вид "один ко многим", причем минимально возможное число объектов у субъекта равно нулю. Контейнеры RDF являются аналогом списков или массивов в других языках. То, каким образом должны обрабатываться контейнеры, зависит от конкретного приложения.
Одно из возможных применений контейнера – поддержка списка свободных мест в системе заказа билетов. Каждое место является ресурсом; в системе должно быть отражено состояние всех мест – как свободных, так и зарезервированных. Список свободных мест может быть организован отдельно от фактов о состоянии конкретных мест при помощи контейнера. Соответствующий фрагмент RDF приведен в листинге 11.7.
<Description> <Description id="место:A1"> <крайнее>true</крайнее> </Description> <Description id="место:A2"> <зарезервировано>Тим</зарезервировано> <крайнее>false</крайнее> </Description> <Description id=" место:A3"> <крайнее>false</крайнее> </Description> <Description id=" место:свободные"> <Bag> <li resource="место:A1"/> <li resource="место:A3"/> </Bag> </Description>Листинг 11.7. Два факта, выраженных при помощи одного тега RDF
В этом фрагменте для каждого места указано, является ли оно крайним (у прохода) и в том случае, если место не свободно, имя того, кто его зарезервировал. Синтаксис место: относится к воображаемой схеме URL, разработанной для конкретного приложения. Пока зарезервировано только место A2. Контейнер <Bag> содержит ссылки на два свободных места. Синтаксис тегов <li> в этом примере – один из способов сокращения, допустимых языком RDF.
Таким образом, контейнеры могут использоваться для того, чтобы предоставить программисту доступ к подмножествам фактов. Элементы контейнера указывают на субъекты подмножества какого-либо множества фактов, описанных за пределами контейнера. Просматривая контейнер, можно получить доступ к этим фактам. Контейнеры могут рассматриваться как простая структура данных для фактов и как простой механизм навигации. В системе заказа билетов программист может зарезервировать место, выбрав его из контейнера со свободными местами, добавив вложенный тег (предикат) <зарезервировано> к соответствующему тегу <Description>, а затем удалив место из контейнера.
В объектно-ориентированной терминологии контейнер "использует" объекты – члены коллекции. Контейнер содержит лишь ссылки на них, а не сами объекты.
Теги-контейнеры и соответствующие коллекции всегда могут быть заменены эквивалентной конструкцией из простых фактов. Об этом рассказано в описании отдельных тегов.
11.4.1.3 Идентификаторы.
В примере с мальчиком и собакой мы стремились снабдить каждый элемент, моделируемый при помощи фактов, идентификатором. В отличие от многих других приложений XML, в RDF идентификаторы играют особую роль. Они могут использоваться двумя способами.
Первый способ использования идентификаторов – обозначение целого факта. Для этого к тегу, выражающему данный факт, добавляется атрибут id. URL документа RDF, дополненный символом # и значением атрибута id какого-либо факта из данного документа, является уникальным идентификатором факта в глобальном масштабе. Согласно документу RFC 2369, URL такого вида указывает на фрагмент документа, а не на ресурс в целом. Однако в RDF ресурсом считается именно отдельный факт, даже если он является частью большего документа. Поэтому документ RDF может рассматриваться как группа или коллекция ресурсов. Этот подход значительно отличается от принятого в HTML, где теги <A> без атрибута HREF, на которые ссылается часть URL после символа #, маркируют лишь определенное место в едином документе-ресурсе. Вот пример идентификатора RDF:
<Description ID="printEnabled" ... />
Возможно, этот файл содержит информацию о состоянии подсистемы печати, и атрибут ID позволяет обратиться к конкретному факту, используя осмысленное имя.
Второй способ использования идентификаторов в RDF – замена локальных литералов, используемых в документе RDF. Так, в листинге 11.5 фрагмент информации "теннис", указывающий на тип мяча, хранится непосредственно внутри соответствующего факта.
Однако такая непосредственность не обязательно должна иметь место. Так, на том же листинге записано несколько фактов о Томе. При этом сам Том – реальный мальчик – не присутствует в этих фактах непосредственно. Вместо этого мы используем число (1), имея в виду, что в данной группе фактов оно представляет Тома. RDF предлагает лучший идентификатор для Тома, чем простое число, – URL. В документе RDF этот URL будет представлять Тома точно так же, как и число 1 в нашем примере. Возможно, это будет адрес электронной почты ( mailto:) или URL web-документа, содержащего запись о Томе. Любой факт, субъектом которого является строка, совпадающая с этим URL, является фактом о Томе. В терминологии web-разработчика Том является ресурсом, на который указывает URL.
Однако RDF идет дальше в этом направлении. URL может быть идентификатором не только субъекта, но и объекта. И собака Тома, и его мяч имеют собственные URL (в примере в листинге – числовые идентификаторы).
Примечательно, что RDF позволяет выразить с помощью URL и предикат/свойство факта. URL предиката рассматривается как ссылка на ресурс, в котором описан данный предикат. URL является идентификатором предиката, он замещает фактический предикат, который может находиться на сайте какого-либо учреждения или организации по стандартизации или, например, на корпоративном сервере. Фактически RDF позволяет описать предикат при помощи атрибута id, значением которого должен быть корректный URL. Для удобства чтения URL предиката как правило содержит слово, поясняющее его общий смысл, например http://www.example.com/#Owner (владелец).
Таким образом, при необходимости факты можно выражать при помощи одних лишь идентификаторов-URL. Фактически такие идентификаторы являются указателями на термы, из которых составлены факты. Такие документы RDF являются одним из источников трудностей для начинающих пользователей, которым кажется, что документ должен автоматически взаимодействовать с уделенными ресурсами, на которые указывают URL. Это не так – URL в данном случае ничем, кроме своей структуры, не отличается от простой строки, которая могла бы содержать обычный почтовый адрес. Спецификация RDF не требует автоматического обращения к ресурсам Internet для обработки такого документа, хотя разработчик конкретного приложения может добавить такую функцию. Mozilla не содержит подобной функциональности и при обработке RDF-документов не обращается к URL-идентификаторам. URL в данном случае рассматриваются как простые данные, которые должны лишь однозначно идентифицировать термы фактов.
Здесь, однако, существует одна сложность. Любой URL в документе RDF может указывать на другой RDF-файл. Таким образом, факты из разных документов могут ссылаться друг на друга. Это плохая практика для большинства приложений, поскольку в результате может возникнуть запутанный клубок зависимостей между файлами. В некоторых специальных случаях, например при реализации протоколов аутентификации, такая практика может быть оправданной. Кроме того, факты в одном документе могут содержать URL, указывающие на метаданные или элементы схемы, описанные в другом файле. В таких ситуациях ссылки между документами RDF могут иметь смысл, но лучше не злоупотреблять ими.
Строго говоря, идентификаторы, заменяющие термы факта, могут иметь более общий синтаксис – URI (универсальный указатель ресурса). Синтаксис URI охватывает как URL, так и URN (универсальное имя ресурса). Возможные применения имен URN в качестве идентификаторов обсуждаются ниже в этой лекции.
RDF допускает наличие фактов, у которых тег <Description> или контейнер не имеют идентификатора. Это факты с неопределенным субъектом или анонимные факты. Документ RDF, не имеющий анонимных фактов, считается определенным. Для нормальной работы с запросами рекомендуется использовать только определенные документы. Поэтому не следует оставлять теги-контейнеры и <Description> без идентификаторов.