件名に「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\") .}
どこが間違っているのか、そしてこの動作の理由を教えてください。
引用符の周りのエスケープは、コピーと貼り付けの残りの部分にすぎないと思います。 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" |
-------------------------------