2008/02/05

SPARQL - FILTER functions

SPARQLのFILTERに関する話.

などを参考にFILTERを試みる.

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

No comments: