13

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

たとえば、いくつかのトリプルがありますか?s?p?oここで、?oは文字列であり、?oに文字列「gotit」が含まれるすべてのトリプルに対して、「gotit」が「 haveit」、どうすればこれを行うことができますか?私はこれを達成しようとしています。Sesame2.6.0です。

私はこの素朴なアプローチを試しました:

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

しかし、これにより構文エラーが発生しました。

また、次のようなクエリの結果リストでreplaceを使用できませんでした。

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

残念ながら、SPARQLドキュメントには、この関数の使用方法の例が含まれていません。

既存の値をテストするだけでなく、関数を使用して新しい値を作成することは可能ですか?はいの場合、どのように行いますか?

4

2 に答える 2

16

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

代わりに、次のように句で新しいバージョンの値を使用できるようにするには、句でBINDaを使用する必要があります。WHEREINSERT

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

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

関心のあるSPARQL仕様の関連部分は、割り当てに関するセクションです。

于 2012-05-23T15:32:51.770 に答える
6

仕様replaceによると、見た目の使用法は正しいです。比較的最近、仕様の最後のリビジョンに追加されたと思います-おそらくSesameはまだそれをサポートしていませんか?REPLACE

クエリが行を返すだけの場合はどうSELECT ?s ?p ?o WHERE { ?s ?p ?name . FILTER(regex(?name,"gotit","i")) }なりますか?

于 2012-05-22T19:58:57.853 に答える