web-dev-qa-db-ja.com

SPARQLを使用して、特定の部分文字列を含むトリプルを抽出します

件名に「alice」という単語が含まれているトリプルを抽出したいと思います。私が使用したクエリは次のとおりです。

SELECT ?s ?p ?o  WHERE { ?s ?p ?o .FILTER regex(?s, \"alice\") .}

この制約を満たすトリプルがあるにもかかわらず、これでは結果が得られません。

一方、同じクエリを使用して、オブジェクトにWordブリリアントを含むトリプルを抽出すると、2つの可能な一致のうちの1つのみが返されます。

使用されるクエリは次のとおりです。

SELECT ?s ?p ?o  WHERE { ?s ?p ?o .FILTER regex(?o, \"brillant\") .}

どこが間違っているのか、そしてこの動作の理由を教えてください。

14
user2335580

引用符の周りのエスケープは、コピーと貼り付けの残りの部分にすぎないと思います。 regex の最初の引数はリテラルである必要がありますが、リテラルをRDFのトリプルのサブジェクトにすることはできないため、このパターンに一致する必要のあるデータがあるとは限りません。ただし、URIに文字列「alice」が含まれているサブジェクトがあり、 str 関数を使用してURIの文字列表現を取得できます。例えば。、

SELECT ?s ?p ?o  WHERE { ?s ?p ?o .FILTER regex(str(?s), "alice") .}

説明のために、2つの値<http://example.org>"string containing example"を使用して、元のクエリで行ったようにフィルタリングしてみましょう。

select ?x where {
  values ?x { <http://example.org> "string containing example" }
  filter( regex(?x, "exam" ))
}
-------------------------------
| x                           |
===============================
| "string containing example" |
-------------------------------

他の値が文字列ではなかったため、"string containing example"しか取得できなかったため、regexの適切な引数ではありませんでした。ただし、呼び出しをstrに追加すると、正規表現が考慮するのはURIの文字列表現です。

select ?x where {
  values ?x { <http://example.org> "string containing example" }
  filter( regex(str(?x), "exam" ))
}
-------------------------------
| x                           |
===============================
| <http://example.org>        |
| "string containing example" |
-------------------------------
19
Joshua Taylor