Разница между пустыми узлами и переменными в запросах SPARQL

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

Я не могу найти какой-либо пример запроса с пустым узлом, который возвращает разные результаты, чем тот же запрос с переменными вместо пустых узлов.

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

  • SELECT ?a ?b
    WHERE {
        ?a :predicate _:blankNode .
        _:blankNode :otherPredicate ?b .
    }
    
  • SELECT ?a ?b
    WHERE {
        ?a :predicate ?variable .
        ?variable :otherPredicate ?b .
    }
    

Возможно, существуют более сложные запросы, которые вызывают различное поведение?

В частности, я задаюсь вопросом, есть ли примеры различных результатов запросов, выполняемых на графике RDF, который не имеет пустых узлов.

Спасибо.

PS. Да, я знаю, что пустые узлы могут использоваться только в одном BasicGraphPattern, а не в переменных. Но это не та разница, о которой я говорю.

Ответ 1

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

4.1.4 Синтаксис для пустых узлов

Пустые узлы в графических шаблонах действуют как переменные, а не как ссылки на конкретные пустые узлы в запрошенных данных.

Пустые узлы обозначаются либо формой ярлыка, например "_: abc", или сокращенную форму "[]". Пустой node, который используется только в одном место в синтаксисе запроса можно указать с помощью []. Уникальный пробел node будет использоваться для формирования тройного шаблона. Пустое обозначение nodeнаписанный как "_: abc" для пустой node с меткой "abc". Тот же пустой Метка node не может использоваться в двух разных основных графических шаблонах в тот же запрос.

Таким образом, ваши запросы

SELECT ?a ?b
WHERE {
    ?a :predicate _:blankNode .
    _:blankNode :otherPredicate ?b .
}
SELECT ?a ?b
WHERE {
    ?a :predicate ?variable .
    ?variable :otherPredicate ?b .
}

ведут себя одинаково. Преимущество использования пустой node вместо переменной заключается в том, что вы можете использовать более компактный синтаксис. В этом случае вы можете написать:

SELECT ?a ?b
WHERE {
    ?a :predicate [ :otherPredicate ?b ] .
}

На самом деле, в этом случае, поскольку вы ищете только одно свойство для того, что соответствует пробелу node, вы можете использовать путь свойства:

SELECT ?a ?b
WHERE {
    ?a :predicate/:otherPredicate ?b .
}

Ответ 2

Для большинства режимов вхождения пустые узлы являются переменными в базовом графическом шаблоне. Для OWL-DL (и других) вы можете получить больше ответов (примеры включают примеры "маленький дом" и "Эдип" - подробное описание справочника описания).

В defn из SPARQL http://www.w3.org/TR/sparql11-query/#BasicGraphPattern для простого вхождения сопоставление экземпляров σ (b) ведет себя так же, как отображение решения μ (v).