2013-08-20 2 views
12

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

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

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

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

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

ответ

14

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

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

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

The COPY operation is a shortcut for inserting all data from an input graph into a destination graph. Data from the input graph is not affected, but data from the destination graph, if any, is removed before insertion.

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

is similar in operation to:

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

The difference between COPY and the DROP/INSERT combination is that if COPY is used to copy a graph onto itself then no operation will be performed and the data will be left as it was. Using DROP/INSERT in this situation would result in an empty graph.

If the destination graph does not exist, it will be created. By default, the service may return failure if the input graph does not exist. If SILENT is present, the result of the operation will always be success.

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

3.2.5 ADD

The ADD operation is a shortcut for inserting all data from an input graph into a destination graph. Data from the input graph is not affected, and initial data from the destination graph, if any, is kept intact.

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

is equivalent to:

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

If the destination graph does not exist, it will be created. By default, the service may return failure if the input graph does not exist. If SILENT is present, the result of the operation will always be success.

+2

Альтернативой 'COPY', конечно,' ADD', это копирует данные из источника в цель и сохраняет целевые графики существующих данных. – RobV

+0

@RobV Хорошая точка! Я не делал много обновлений SPARQL 1.1, и, я думаю, я не читал достаточно далеко в спецификации после обнаружения COPY. Я добавлю ДОБАВИТЬ. –