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

151
14

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


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


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


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

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

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


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


Спасибо.


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

спросил(а) 2014-02-17T12:14:00+04:00 6 лет, 8 месяцев назад
1
Решение
145

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


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 .
}

ответил(а) 2014-02-18T01:15:00+04:00 6 лет, 8 месяцев назад
82

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

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

ответил(а) 2014-02-17T13:23:00+04:00 6 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема