Запрос Sparql с пустым узлом может быть сложным

Я читал эту статью в блоге, Проблемы модели RDF: пустые узлы, и там упоминалось, что использование пустых узлов может усложнить обработку данных.

Можете ли вы привести пример, почему использование пустых узлов затрудняет выполнение запроса SPARQL? Я не понимаю сложности пустых узлов. Можете ли вы объяснить мне значение и семантику экзистенциальной переменной? Я не совсем понимаю это объяснение, данное в Рекомендации по семантике RDF, 1.5. Пустые узлы как экзистенциальные переменные.

1 ответ

Решение

Экзистенциальные переменные

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

hasUserId(JoshuaTaylor,1281433)

влечет за собой предложение

x.hasUserId (x, 1281433)

Конечно, есть много сценариев, в которых второе предложение может быть правдой, а первое не верно. В этом смысле второе предложение дает нам меньше информации, чем первое. Также важно отметить, что переменная x во втором предложении не обеспечивает какого-либо способа выяснить, какой элемент в области дискурса на самом деле имеет заданный userId. Он также не претендует на то, что есть только одна вещь, которая имеет данный идентификатор пользователя. Чтобы сделать это более понятным, мы могли бы использовать пример:

Has y.hasAge (y, 29)

Это, по-видимому, верно, поскольку кому-то или чему-то там 29 лет. Обратите внимание, что мы не можем говорить о y как о человеке, которому 29 лет, потому что их может быть много. Все это предложение говорит нам, что есть хотя бы один.

Несмотря на то, что мы использовали разные переменные в двух предложениях, нечего сказать, что лица с указанными свойствами могут не совпадать. Это особенно важно при вложенной количественной оценке, например,

x.∃ y.likes (x, y)

Это предложение может быть правдой, потому что есть один человек в домене, который любит себя. просто потому, что x и y имеют разные имена в предложении, не означает, что они могут не относиться к одному и тому же человеку.

Пустые узлы как экзистенциальные переменные

Существует определенная модель реализации RDF, определенная в семантике RDF. Это было описано более подробно в другом вопросе переполнения стека, RDF Graph Entailment. Идея состоит в том, что граф RDF рассматривается как большая экзистенциальная квантификация по пустым узлам, упомянутым в графе. Например, если тройки на графике - это t 1,…, t n, а пустые узлы, которые появляются в этих тройках, - это b 1,…, b m, то график представляет собой формулу:

1b 1,…, b m. (T 1 ∧… ∧ t n)

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

Пустые узлы в реальных данных

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

@prefix : <https://stackru.com/q/20629437/1281433/> .

:Carol :hasAddress [ :hasNumber 4222 ;
                     :hasStreet :Clinton_Way ] .

мы вполне можем попытаться сказать, что существует один адрес с указанными свойствами, но в соответствии с моделью реализации RDF это не то, что мы делаем.

На практике это не такая большая проблема, потому что мы обычно не используем RDF. Однако проблема в том, что поскольку область пустых переменных является локальной для графа, мы не можем выполнить SPARQL-запрос к конечной точке, запрашивающей адрес Кэрол, и вернуть IRI, который мы можем использовать повторно. Если мы запустим такой запрос:

prefix : <https://stackru.com/q/20629437/1281433/>

construct {
  :Mike :hasAddress ?address
}
where {
  :Carol :hasAddress ?address
}

тогда мы получим следующий (бесполезный) график в результате:

@prefix :      <https://stackru.com/q/20629437/1281433/> .

:Mike   :hasAddress  []  .

У нас не будет способа получить больше информации об адресе, потому что все, что у нас сейчас есть, это пустой узел. Если бы мы использовали IRI, например,

@prefix : <https://stackru.com/q/20629437/1281433/> .

:Carol :hasAddress :address1267389 .
:address1267389 :hasNumber 4222 ;
                :hasStreet :Clinton_Way .

тогда запрос дал бы что-то более полезное:

@prefix :      <https://stackru.com/q/20629437/1281433/> .

:Mike   :hasAddress  :address1267389 .

Почему это более полезно? Первый случай похож на данные

∃ x.(HasAddress(Carol,x) ∧ hasNumber(x,4222) ∧ hasStreet(x,ClintonWay))

и получить обратно результат

Has y.hasAddress(Майк, у)

Конечно, возможно, что Майк и Кэрол имеют один и тот же адрес, но из этих предложений невозможно узнать наверняка. Гораздо полезнее иметь такие данные, как

hasAddress (Carol, address1267389)
hasNumber (address1267389,4222)
hasStreet (address1267389, ClintonWay))

и получить обратно результат

hasAddress(Mike,address1267389)

Исходя из этого, вы знаете, что они имеют один и тот же адрес, и вы можете что-то спросить об этом.

Заключение

Насколько это повлияет на ваши данные и их потребителей, зависит от типичных вариантов использования. Для автоматически построенных графиков может быть трудно заранее знать, какие именно данные вам понадобятся, чтобы иметь возможность ссылаться на них позже, поэтому рекомендуется генерировать IRI для максимально возможного количества ваших ресурсов. Поскольку IRI имеют свободную форму, обычно это не так сложно сделать. Например, если у вас есть какой-то разумный "базовый" IRI, например,

http://example.org/myData/

тогда вы можете легко добавлять суффиксы для идентификации ваших ресурсов. Например,

http://example.org/myData/addresses/addr1
http://example.org/myData/addresses/addr2
http://example.org/myData/addresses/addr3
http://example.org/myData/individuals/ind34
http://example.org/myData/individuals/ind35
Другие вопросы по тегам