2012-05-22 3 views
12

SPARQL 1.1では、特に更新コマンドでreplace関数をどのように使用できますか?SPARQL 1.1:置換機能の使い方は?

例えば、私がトリプルの数を持っていれば?oは文字列で、すべてのトリプルでは?oに "gotit"という文字列が含まれています。 "gotit"どのように私はこれを行うことができますか?私はこれを達成しようとしていますセサミ2.6.0です。

私はこの単純なアプローチを試みた:

INSERT { ?s ?p replace(?o,"gotit","haveit","i") . } 
WHERE { ?s ?p ?o . FILTER(regex(?o,"gotit","i")) } 

をが、これは構文エラーの原因となりました。

また、私はそうのようなクエリの結果リストに置き換える使用できませんでした:

SELECT ?s ?p (replace(?o,"gotit","haveit","i") as ?r) WHERE { .... } 

SPARQLの文書が、残念ながらこの機能を使用する方法の例が含まれていません。

既存の値をテストするだけでなく、新しい値を作成する機能を使用することは可能ですか?

答えて

14

あなたがしようとしたように、INSERT節で式を直接使用することはできません。また、?nameを最初のトリプルパターンでバインドしていますが、FILTER?oでフィルタリングしても結果は得られません(フィルタリングされていない変数をフィルタリングするとほとんどのフィルタ式で結果が得られません)。

代わりにあなたがそうのようなINSERT句で使用できる値の新しいバージョンを作るためにあなたのWHERE句でBINDを使用する必要があります。

INSERT 
{ 
    ?s ?p ?o2 . 
} 
WHERE 
{ 
    ?s ?p ?o . 
    FILTER(REGEX(?o, "gotit", "i")) 
    BIND(REPLACE(?o, "gotit", "haveit", "i") AS ?o2) 
} 

BINDはので、新しい変数に式の結果を割り当てその値をクエリ/更新の他の場所で使用することができます。私が想像のように

に興味がありますSPARQL仕様の関連部分がAssignment

+0

?oの代わりに?nameを使用するエラーを指摘していただきありがとうございます。ここで実際のクエリを単純化しようとしましたが、?nameを?oに変更するのを忘れました。 私のSESAMEインストールでBINDを使用してクエリを試しましたが、構文エラーが発生します...これが最新バージョンでサポートされているかどうかを判断する必要があります。 – Johsm

+0

私はこれをテストしたところ、OWLIM-LiteリポジトリでSesameバージョン2.6.5でうまくいきます。 – Johsm

5

replaceの使用は、specに従って正しく表示されます。私はREPLACEが比較的最近の仕様の最後のrevにちょうど追加されたと信じています - おそらくセサミはそれをまだサポートしていませんか?

を実行すると、クエリから行が返されますか?

+0

上のセクションでは、それが動作する必要があることをその安心いただき、ありがとうございます!正規表現のクエリは本当にうまく動作します。セサームの新しいバージョンにアップグレードするとすぐに、私はここに報告します。 – Johsm

+0

私は現在、Sesameバージョン2.6.5でテストしましたが、クエリが機能する間insertコマンドが機能せず、構文エラーが発生することが判明しました。以下のRobVがBINDを使用して提案する手法は、Sesame 2.6.5で動作します。 – Johsm

関連する問題