Россия, Звенигород |
RDF
11.3.4 Факты о фактах
Факты могут описывать другие факты. В некоторых особых ситуациях это следует иметь в виду, но в большинстве случаев полезнее игнорировать такую возможность. Некоторые базовые сведения о фактах, описывающих факты, приведены в этом разделе. Факты, зафиксированные в примере с мальчиком и собакой, неявно подразумевают множество других фактов, которые могут быть выражены в явном виде. Некоторые из них следуют из устройства нашей маленькой коллекции фактов, другие истинны почти автоматически. Все следующие примеры основаны на единственном факте:
<- 1, имя, Том ->
Одна из групп дополнительных фактов, следующих из устройства коллекции, – информация о типах. Программист, разрабатывающий коллекцию фактов, может решить хранить в ней типизированные данные. Например, следствием единственного факта, указанного выше, могут быть следующие факты:
<- 1, тип, integer -> <- Том, тип, string ->
Эти факты указывают типы для субъекта и объекта ранее приведенного факта. Они содержат дополнительную информацию о другом факте и являются аналогом словаря данных или схемы базы данных. Однако, в отличие от баз данных, информация о структуре которых хранится отдельно от самих данных, факты о фактах ничем не отличаются от "обычных" фактов и могут храниться вместе с ними. Эти факты могут использоваться, например, приложением на платформе Mozilla для моделирования данных.
Здесь уместно повторить сказанное в начале этой лекции. Многие специалисты называют информацию такого рода метаданными. Предполагается, что этот термин позволяет разграничить информацию (в данном случае – содержание web-документа, на который указывает URL) и "информацию об информации" (описание документа и самого URL), которая и называется метаданными. На практике, если программист пишет код для работы с файлом закладок, единственной интересной для него информацией являются так называемые метаданные – содержание этого файла. С его точки зрения метаданные оказываются данными, с которыми он должен работать. То, что для одного человека является метаданными, для другого – просто данные. Таким образом, при изучении RDF концепция метаданных может лишь запутать и без того сложную тему.
Говоря коротко, термин "метаданные" часто используется без необходимости. С точки зрения программиста единственным элементом RDF, который заслуживает звания метаданных, является информация о типах. Все остальное следует рассматривать как простые данные или, точнее, простые факты. С точки зрения самого формата RDF нет какой-то отдельной категории фактов, имеющих статус "метафактов".
Следующие три факта являются истинными автоматически:
<- пример-факта, субъект, 1 -> <- пример-факта, предикат, имя -> <- пример-факта, объект, Том ->
Здесь пример-факта означает факт, приведенный в начале этого раздела. Первый из трех фактов (с предикатом субъект) утверждает, что субъектом исходного факта является 1. Согласно второму факту, предикатом исходного факта является имя. Иными словами, все это факты об исходном факте. Процесс построения таких фактов называется реификация3Англ. reification – буквально "овеществление".. В данном контексте этот термин означает примерно следующее – что высказывания на языке (факты) становятся "вещами", о которых можно вести речь на этом языке (формулировать факты о них).
Реификация сходна с извлечением метаданных, однако потенциально ведет к гораздо более запутанным следствиям. Рассмотрим, например, следующую проблему. Как было сказано выше, все существующие (зафиксированные) факты считаются истинными, а все прочие – ложными. Можем ли мы утверждать, что исходный факт (пример-факта) имеет субъект, если не сформулирован первый из фактов реификации? Поскольку факт о субъекте исходного факта отсутствует, ответ должен быть отрицательным. Однако исходный факт существует, и наличие субъекта следует из его структуры. Итак, мы пришли к противоречию – мнимому, поскольку в нашем рассуждении есть изъяны. Однако в любом случае размышления в этом направлении вряд ли представляют ценность для практически мыслящего разработчика. Немного пользы и в размышлениях о том, можно ли подвергнуть реификации сами факты реификации. Возможная область практического использования таких фактов ограничена приложениями Mozilla/RDF для анализа текстов или работы с естественным языком.
Еще одна группа фактов, которые можно сформулировать на основе существующих фактов, связана с именами. Разработчик, формирующий группу фактов, может пожелать дать имена элементам этих фактов. Используя все тот же пример, можно присвоить имена субъекту или объекту, подобно тому, как даются имена полям записи в базе данных, или король жалует дворянские титулы своим подданным:
<- 1, имя, идентификатор-лица-> <- Том, имя, имя-лица-> <- пример-факта, имя, определение-лица->
Эта процедура тоже создает возможности для путаницы. Исходный факт утверждает, что существует лицо по имени Том. Однако согласно первому из приведенных здесь фактов, строка "Том" имеет имя (тип) имя-лица, а исходный факт в целом – "существует лицо по имени Том" – имеет имя определение-лица. Итак, имя Тома – "Том", но оно, в свою очередь имеет имя имя-лица. Все эти тонкости не имеют практического значения для большинства разработчиков.
Наконец, следует отметить, что большинство аспектов многих подходов к моделированию данных могут быть выражены при помощи фактов с предикатами. Например, при помощи следующих предикатов можно формулировать факты, описывающие объектно-ориентированную модель:
является-подклассом имеет использует является-экземпляром
А этот набор предикатов может использоваться для описания реляционной модели:
имеет-ключ имеет-внешний-ключ один-ко-многим один-к-одному имеет-необязательный
С помощью подобных предикатов можно надстраивать сложные слои семантики (например, объектную модель) над базовой системой простых фактов. Однако это сложный процесс, с которым вряд ли справится начинающий разработчик. Некоторые возможности такого рода предусмотрены в самом языке RDF, однако при решении обычных задач стоит избегать их использования. Факты с подобными предикатами могут выглядеть как метаданные, однако в последних "является- подклассом" отношения должны быть выражены объектом, а не предикатом. Корректный пример метаданных – "стрелка-UML-5 имеет- свойство является-подклассом", а не "сущность-UML-3 является-подклассом сущность-UML-2". Последний вариант представляет собой сложное, многослойное решение, которое может привести к большим трудностям.
Наконец, новые факты могут быть выведены из существующих. В примере с мальчиком и собакой следующий факт может рассматриваться как следствие сформулированных фактов:
<- Том, играет-с, Спот->
Следует ли рассматривать его как следствие, зависит от правил вывода и других допущений, принятых в конкретной системе. В конце концов, если мальчик и собака играют с одним и тем же мячом, они, вероятно, играют друг с другом. Вывод таких фактов является функцией дедуктивных систем. Mozilla не выполняет дедукции из фактов, записанных на языке RDF.
Факты, собранные вместе для обработки, содержатся в хранилище фактов. Последнее является аналогом базы данных применительно к фактам и, как правило, находится в оперативной памяти, а не на диске.
Подводя итоги этого введения, отметим, что триплеты с предикатом представляют собой полезное подмножество простых кортежей. Такие триплеты используются для выражения фактов. RDF-документы содержат факты. Факты представляют собой высказывания, а не просто данные. Сформулированные факты считаются истинными. Существуют сложные аспекты работы с фактами, но их практическая полезность ограничена. Использование фактов в качестве информации о другой именованной информации, не имеющей характера фактов (например, URL), не должно представлять сложности. Использование фактов в качестве информации о других фактах лучше оставить до тех пор, пока не освоены другие, более простые применения RDF.
11.3.5 Запросы, фильтры и определенные факты
Хранилище фактов не имеет практического смысла, если нет возможности извлекать из него факты. Разработчику необходим способ получать нужные факты, игнорируя остальные.
По документам RDF, как и по любым другим документам XML, можно перемещаться "вручную" или обращаться к ним с запросами. Универсальный способ перемещения по документам XML основан на использовании объектной модели документа (DOM). Возможные способы запроса – использование методов поиска, таких как getElementById(), или более сложных технологий, таких как XML Query или XPath. Однако ни один из этих способов не используется при работе с документами RDF.
Вместо этого документы RDF читаются или создаются как потоки фактов. Любой разработчик предпочел бы получить лишь информацию, нужную ему, а не любую возможную информацию. В контексте RDF "нужная информация" означает "нужные факты". Чтобы ограничить получаемый поток фактов, используется процесс сопоставления с образцом, отбрасывающий ненужные факты. По сути, этот процесс представляет собой разновидность запроса или пропускания потока данных через фильтр, как в случае SQL или grep(1).
Системы запросов не рассматриваются подробно в этой лекции, однако они основаны на концепции определенного факта. Определенный факт (иногда называемый конкретным фактом), представляет собой полностью известный факт. Все факты, обсуждавшиеся в этой лекции до настоящего момента, были определенными фактами.
В качестве примера рассмотрим следующее высказывание: "Том – хозяин Спота". Мы можем установить субъект (Том), объект (Спот) и предикат (хозяин). Нам известно все об этом высказывании, поэтому его следует признать определенным. Мы легко можем записать и соответствующий определенный факт:
<- Том, хозяин, Спот ->
Мы можем сформулировать и другое высказывание: "Том владеет собакой". Эквивалентный факт можно записать как:
<- Том, хозяин, собака ->
Однако если принять во внимание, что в мире существует множество собак, нужно сделать вывод, что данное высказывание не позволяет ответить на вопрос "Какой собакой владеет Том?" В этом случае высказывание "Том владеет собакой" является неопределенным, поскольку оно не позволяет однозначно установить объект (конкретную собаку). Адвокат мог бы сказать: "Это утверждение необоснованно, поскольку вы не можете указать конкретную собаку, которой владеет Том". Таким способом он подчеркнул бы, что ваше высказывание слишком туманно, чтобы быть истинным. Лучший факт, который мы можем записать в такой ситуации, имеет следующий вид:
<- Том, хозяин, ??? ->
Знаки вопроса не являются какой-либо специальной синтаксической конструкцией, они лишь указывают на неопределенный объект. Вы вряд ли сможете сделать что-либо с таким неопределенным фактом, представляющим собой противоположность определенному.
Однако если компьютер, в отличие от вас, знает, какая собака принадлежит Тому, вы можете передать неполный факт компьютеру в качестве запроса. Компьютер, исполняя соответствующую программу, может сопоставить неполный факт (называемый целью) со всеми зафиксированными фактами и возвратить лишь те факты, которые согласуются с ним. Этот процесс называется унификацией, в реализации Mozilla он представляет собой простое сопоставление с образцом. Таким образом вы найдете всех собак, принадлежащих Тому, или всех животных, принадлежащих Тому, или вообще все, что принадлежит Тому. То, что вы получите в ответ, зависит от того, какие факты содержатся в хранилище фактов. В любом случае, системы запросов и фильтрации Mozilla выполнят необходимые действия.
Разработчик осуществляет поиск или фильтрацию определенных фактов RDF при помощи факта или фактов, которые не являются определенными и называются целью. С помощью RDF можно выражать как определенные, так и неопределенные факты, однако на практике неопределенные факты используются редко и, как правило, являются признаком ошибок проектирования. Для поддержки целей необходимы функции, специфичные для Mozilla.
Подводя итоги, отметим, что факты могут храниться подобно данным и извлекаться при помощи системы сопоставления цели с определенными данными.