2013-08-20 9 views
12

SPARQLコンストラクトクエリを使用して、既存の名前付きグラフから新しい名前付きグラフを作成しようとしています。私が照会しているデータベースには、既存の名前付きグラフとして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ブロックからグラフ文を削除した場合、クエリは完璧に動作しますが、私は、デフォルトの代わりに指定しているという名前のグラフにトリプルを配置したいと思います1。

私が見つけた限りでは、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では、最初にターゲット・グラフからすべてのデータを削除するので、実際のケースには当てはまらない可能性があります(提供したコードが最小限の例であり、実行しようとしている実際の更新と必ずしも一致しない場合があります)。 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 Updateをやっておらず、COPYを見つけた後で仕様を十分に読んでいないと思います。私は追加を追加します。 –

関連する問題