Неправильная оценка запроса с агрегацией подзапроса
Пожалуйста, обратитесь к конечной точке Factforge, чтобы выполнить этот запрос. Подзапрос не возвращает никаких результатов. ?myVar
будет спроецирован на содержащий запрос, а затем соединен с тройным шаблоном ?myVar ?p ?o.
, Но так как нет результатов внутреннего выбора, соединение не должно привести ни к чему. Однако это не тот случай, когда выполняется запрос. Разве это не ошибка?
SELECT
?myVar ?p ?o
WHERE
{
{
SELECT ?myVar
WHERE {
?myVar <http://www.example.com/arbitraryNonExistent> ?xx.
}
GROUP BY ?myVar
}
?myVar ?p ?o.
}
LIMIT 10
1 ответ
Это ожидаемое поведение. Согласно https://www.w3.org/TR/sparql11-query/, если есть GROUP BY:
Group(exprlist, Ω) = { ... | μ in Ω }
и у нас нет совпадений, тогда Ω пусто, так что:
Group(exprlist, {}) = {}
В результате подзапрос возвращает единственное решение, в котором "myVar" не связан, а соединение со следующим шаблоном оператора соответствует всему для "myVar". В конце вы получаете множество решений для всего запроса.
Существует даже тестовый сценарий соответствия W3C SPARQL, охватывающий конкретный сценарий:
https://www.w3.org/2009/sparql/docs/tests/data-sparql11/aggregates/agg-empty-group.rq
https://www.w3.org/2009/sparql/docs/tests/data-sparql11/aggregates/agg-empty-group.srx
А также старые обсуждения на https://web.archive.org/web/20131109081257/http://answers.semanticweb.com/questions/17410/semantics-of-sparql-aggregates.