SPARQLのFILTERに関する話.
- SPARQL Query Language for RDF - 3.1 Restricting the Values of Strings
- SPARQLでRDFデータを検索する
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE {
?x dc:title ?title
FILTER regex(?title, "web", "i" )
}
これはW3Cの解説クエリ例を引っ張ってきたものだが,通常のFILTERはこのように記述できる.
?titleは比較対象であり,webが含まれるものを抽出する.
第三引数の"i"は,case-insensitive(英語での大文字小文字の区別なし)を意味する.
比較対象がintであるならば,
FILTER (?price < 30.5)
このようにさらに単純になる.
--
しかしこの第二引数に日本語を入力するとどうしても比較できず,No Matchという何も抽出されない状況になって非常に困った.これは前々からできなくて何度も挫折してたんだが,今日は気合を入れて検索結果と睨めっこしまくった.
するとhttp://thefigtrees.net/lee/blog/2006/04/sparql_calendar_demo_retrievin.htmlで,
FILTER regex(str(?g_wrapped), str(?g))
こんな表記を発見した.
よくわからないけど,比較対象をstrでくくっていたので,同様にしてみたところなんと解決.
しっかりとフィルタリングされた.
× FILTER ( regex(?s_relate, "年金問題","i"))
○ FILTER ( regex(str(?s_relate), "年金問題","i"))
たったこの違いである.
はじめは日本語だからフィルタがかからないのかと思ったけど,そうじゃないのかもしれない.
多分strでくくることで,その対象がstring型だと指定しているのかな.
でもそうすると,
FILTER regex(?title, "web", "i" )
これは?ってことになる. うーん.
とりあえずこの発見はメチャクチャ大きい.よっしゃああああ!(叫)
[キーワード]SPARQL,FILTER,regex,RDF,OWL