Ответ 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 .
}