Как перебрать запрос 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"
Другие вопросы по тегам