Как перебрать запрос SPARQL со ссылкой на виртуальный граф?
Я занимаюсь разработкой хранимой процедуры Virtuoso. Я хочу выполнить цикл над результатом запроса SPARQL к графику. Проблема возникает, когда запрос содержит ссылку на виртуальный граф (который физически отсутствует в триплет-хранилище и является результатом операции отображения R2RML). Во всех моих попытках я получаю не ошибку, а пустой набор результатов. Я попробовал следующее
create procedure R2RML.DBA.try() returns integer
{
for (sparql define input:storage ""
select ?s ?p
from <http://example.com/resource>
where {
?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o .
} LIMIT 5 ) do
{
use_the_value("s");
}
};
а также следующее
create procedure R2RML.DBA.try() returns integer
{
declare srcgraph varchar;
srcgraph := 'http://ec.example.com/resource';
for (sparql define input:storage ""
select ?s ?p
where {
GRAPH `iri(?:srcgraph)`
{
?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o .
}
} LIMIT 5 ) do
{
use_the_value("s");
}
};
В обоих случаях итерация не выполняется, несмотря на то, что один и тот же запрос при выполнении в конечной точке SPARQL возвращает результат.
Если я удаляю ссылку на график, выполняются итерации:
create procedure R2RML.DBA.try() returns integer
{
for (sparql define input:storage ""
select ?s ?p
where {
?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o .
} LIMIT 5 ) do
{
use_the_value("s");
}
};
Кто-нибудь имеет представление о том, что я ошибаюсь?
1 ответ
Поскольку график является виртуальным, хитрость заключается в том, чтобы добавить имя хранилища квадратов в define
директива в заявлении SPARQL. Например, если используется хранилище карт Virtuoso Quad, define
Директива станет следующей.
sparql define input:storage "http://www.openlinksw.com/schemas/virtrdf#DefaultQuadStorage"