CONSTRUCT в названный граф

Я пытаюсь использовать запрос SPARQL Construct для создания нового именованного графика из существующего. Запрошенная база данных содержит http://graph.com/old как существующий именованный граф. Я использую Jena TDB как базу данных, доступную через конечную точку Jena Fuseki. Следующий запрос дает мне ошибку:

CONSTRUCT
{
    GRAPH <http://graph.com/new> {
        ?s ?p ?o
    }
}

WHERE
{
    GRAPH <http://graph.com/old> {
        ?s ?p ?o
    }
}

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

Насколько я мог найти, раздел SPARQL 1.1 в CONSTRUCT ничего не говорит о построении в именованные графы. Есть ли способ сделать это?

Ответ 1

Так же, как SELECT-запросы используются, когда вы заинтересованы в получении набора привязок переменных назад, используются запросы CONSTRUCT, которые вы заинтересованы в возвращении модели. Подобно тому, как переменные, связанные в наборе результатов SELECT, не помещаются в какую-либо модель или постоянный набор привязок, ни одна из них не построена на основе CONSTRUCT. Вы хотите использовать SPARQL 1.1 INSERT. Функции обновления описаны в 3 языке обновления SPARQL 1.1. Таким образом, ваш запрос на обновление можно записать так:

INSERT {
  GRAPH <http://graph.com/new> {
    ?s ?p ?o
  }
}
WHERE {
  GRAPH <http://graph.com/old> {
    ?s ?p ?o
  }
}

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

Операция COPY - это ярлык для вставки всех данных из ввода график в граф назначения. Данные из входного графика не являются, но данные из графика назначения, если таковые имеются, удаляются перед вставкой.

COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT )

аналогичен операции:

DROP SILENT (GRAPH IRIref_to | DEFAULT);
      INSERT { ( GRAPH IRIref_to )? { ?s ?p ?o } } WHERE { ( GRAPH IRIref_from )? { ?s ?p ?o } }

Разница между COPY и комбинацией DROP/INSERT заключается в том, что если COPY используется для копирования графика на себя, тогда никакая операция не будет и данные будут оставлены как есть. Использование DROP/INSERT в эта ситуация приведет к пустому графу.

Если граф назначения не существует, он будет создан. От по умолчанию, служба может вернуть сбой, если входной график не существовать. Если присутствует SILENT, результат операции всегда будет быть успешным.

Если COPY не подходит, ADD может быть тем, что вы ищете:

3.2.5 ADD

Операция ADD - это ярлык для вставки всех данных с входа график в граф назначения. Данные из входного графика не являются и исходные данные из графика назначения, если таковые имеются, сохраняются нетронутыми.

ADD ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT)

эквивалентно:

INSERT { ( GRAPH IRIref_to )? { ?s ?p ?o } } WHERE { ( GRAPH IRIref_from )? { ?s ?p ?o } }

Если граф назначения не существует, он будет создан. По умолчанию служба может вернуть сбой, если входной граф не существует. Если присутствует SILENT, результат операция всегда будет успешной.