Сухая теория: введение в RDF
Вся информация, опубликованная на сайте, организована в соответствии с моделью RDF. Это значит, что весь сайт построен из ресурсов и утверждений о них.
Сообщение – это ресурс, опубликовавший его пользователь – тоже ресурс.
Утверждение определяет некое свойство ресурса и всегда содержит три части: субъект (ресурс, чьё свойство мы определяем), предикат (название свойства) и объект (значение свойства). Объект в утверждении может быть как числом или строкой (по-научному – литералом, то есть “буквальным значением”), так и другим ресурсом.
Например, когда Вася Пупкин публикует на сайте сообщение “Паццталом!”, субъектом утверждения будет сообщение, предикатом – свойство “автор”, а объектом – сам Вася. Можно условно записать так: (<”Паццталом!”> <автор> <Вася Пупкин>).
То, что запись сильно условная, видно невооружённым взглядом, и не только по угловым скобкам – Васей Пупкиных в мире множество, желающих подписаться этим славным именем – ещё больше, да и как отличить “Паццталом!” Васи Пупкина от такого же возгласа нашего Петровича в соседней дискуссии?
В RDF для этого используются URI, причём чаще всего URI оказывается URL-ом, то есть адресом, по которому данный ресурс доступен в Web. В Samizdat схема назначения ресурсам URI предельно проста – в пределах одного сайта каждому ресурсу назначается серийный номер, а URI составляется из адреса сайта и этого номера. Например, пользователь, опубликовавший данное сообщение, представлен ресурсом с URI https://belarus.indymedia.org/1.
В результате выходит, что каждый идентифицированный таким образом ресурс – уникальная сущность, не размытое пятно, а конкретная точка в пространстве знаний. Соответственно, описание, сделанное средствами RDF, представляет собой именованный ориентированный граф, узлы которого – ресурсы, а дуги – утверждения. Причём постольку, поскольку идентификаторы ресурсов уникальны в масштабах всего Интернета, а свойства, используемые в качестве предикатов, чётко определены, все RDF-сайты в сети можно объединить в один большой граф и анализировать как единую базу знаний.
Подробнее об RDF можно узнать в первоисточниках, нам же осталось разобраться только с одним ещё понятием, скрывающимся под мудрёным словом “реификация” (Reification). Реификация – представление утверждения в виде самостоятельного ресурса, о котором в свою очередь можно делать новые утверждения.
Вот подумайте: чего стоит утверждение, которое нельзя подвергнуть сомнению? Именно эту возможность нам и даёт реификация – вместо того, чтобы рассматривать любое утверждение как непокобелимый факт, мы можем рассмотреть, кем и когда это утверждение сделано, кто с ним согласен, а кто – нет, можем такому же анализу подвергнуть любое утверждение об утверждении и так далее.
В Samizdat эта возможность используется для того, чтобы описывать связи между ресурсами и фокусами. Каждый раз, когда вы привязываете сообщение к фокусу, утверждение этой связи реифицируется, и о нём делаются новые утверждения: пользователь такой-то оценивает верность этой связи в такое-то значение, средневзвешенный рейтинг связи вышел таким-то. При желании можно раскопать всю эту цепочку и выяснить, кто какое сообщение повесил под какой фокус: поскольку утверждения связи – тоже ресурсы, их тоже можно просматривать по их серийным номерам и находить с помощью поиска по RDF.
Сырая практика: язык запросов Squish
На странице поиска можно редактировать запросы на языке Squish.
Главная часть запроса – шаблон, которому должны удовлетворять найденные ресурсы. Шаблон запроса составляется из шаблонов утверждений – троек “предикат – субъект – объект”. Предикат выбирается из перечисленных ниже поддерживаемых в Samizdat свойств.
Субъект может быть заранее известным ресурсом (можно указывать как полный URI, так и номер ресурса на сайте) или переменной (свободным узлом – blank node), которая задаётся в формате ”?имя” и обозначает любой ресурс, подходящий под это утверждение. Переменная с тем же именем может встречаться и в других утверждениях шаблона, в пределах одного найденного результата она везде будет обозначать один и тот же ресурс. При помощи переменных утверждения можно связывать между собой в цепочки вроде “найдите мне автора такого сообщения, у которого есть комментарий, который написан по-английски и привязан к фокусу “Перевод”.
Объект утверждения может быть либо ресурсом (в том числе и переменной), либо литералом, в записимости от предиката. Одни свойства подразумевают, что объект – ресурс определённого типа (например, объект свойства “автор” – всегда ресурс типа “участник”), у других объектом может быть только литерал (например, заголовок – это всегда строка).
В дополнение к шаблону запроса, определяющему вид подграфа RDF, в который должен вписываться каждый найденный результат, в поле “буквального условия” можно вписать дополнительные условия, которым должны удовлетворять найденные литералы.
Свойства ресурсов в Samizdat
Формальное опреление свойств можно просмотреть в RDF-схеме Samizdat в формате Notation 3.
Общие свойства
- s::id – идентификатор (серийный номер) ресурса
- dc::date – дата публикации
Свойства участников
- s::login – имя учётной записи
- s::fullName – видимое имя
Свойства сообщений
- dc::title – заголовок
- s::inReplyTo – родительское сообщение (объект – сообщение)
- dc::creator – автор сообщения (объект – участник)
- dc::format – формат
- dc::language – язык сообщения
- dc::description – краткое описание сообщения (объект – сообщение)
- s::hidden – скрыто ли сообщение
- s::content – текст сообщения, если сообщение – не файл
- dct::isVersionOf – текущая версия сообщения (субъект – одна из старых версия, объект – текущая версия)
- s::openForAll – открыто ли сообщение для редактирования другими пользователями
Реифицированные утверждения
- rdf::predicate – предикат (объект – ресурс, хранящий URI предиката)
- rdf::subject – субъект утверждения (любой ресурс)
- rdf::object – объект утверждения (если объект – литерал, он также хранится в отдельном ресурсе)
Фокусы
- dc::relation – связанный с ресурсом фокус (субъект – любой ресурс, объект – фокус)
- s::rating – средневзвешенный рейтинг утверждения о связи между ресурсом и фокусом (субъект – реифицированное утверждение, объект – число)
- s::voteProposition – реифицированное утверждение, вес которого оценивает участник (субъект – ресурс “голос”, объект – реифицированное утверждение)
- s::voteMember – участник, оценивающий утверждение (субъект – голос, объект – участник)
- s::voteRating – оценка утверждения одним участником (субъект – голос, объект – литерал)