Redlandを使うようになってしばらく悩んだリテラルノードのデータ型取得方法。答えが出たのでまとめてみました。
RDFでは文字列に "2.5"^^xsd:float
といったかんじでデータ型を指定できます。これを使えばリテラルノードの値がどういうものなのか、という情報量を増やすことができるのですが、Redland Rubyのリファレンスには言語コードについての記述はあってもデータ型の取得方法については説明がありません。
じゃあ使えないのか? というとそうでもない。試しにこういった記述をしたRDFを読み込ませてみると、ちゃんとデータは保持している模様。どうやらアクセスするためのメソッドがリファレンスに明示されていないだけのようです。
というわけで色々コードを読み込み試行錯誤してみた結果、やり方としては以下のとおりと分かりました。サンプルコードは以下のとおり。
require 'rdf/redland'
model = Redland::Model.new
parser = Redland::Parser.new
parser.parse_into_model(model, "http://www1.kcn.ne.jp/~solomon/index.rdf")
created = Redland::Uri.new("http://purl.org/dc/terms/created")
model.find(nil, created, nil) do |s, v, o|
if o.literal? then
#データ型URIのハッシュ値を取得(Redland内部ではURIをハッシュで管理しているようです)
datatype_uri_hash = Redland.librdf_node_get_literal_value_datatype_uri(o.node)
#ハッシュのままだと明らかに使いにくいので対応するURIに
datatype_uri = Redland.librdf_uri_to_string(datatype_uri_hash)
p "value=#{o.value}, datatype=#{datatype_uri}"
end
end
個人的にはRubyらしくクラスにメソッドを追加してやればいいんじゃないかなと思います。イメージ的には上のコードをちょっといじって、
class Redland::Literal
def datatype
datatype_uri_hash = Redland.librdf_node_get_literal_value_datatype_uri(self.node)
#2011-04-17註記:最初、ifなしにRedland.librdf_uri_to_stringにかけていたのですが
#よく考えるとrdf:datatypeがないリテラルも(当たり前のように)あるため、
#そういう場合はnilが帰るように修正。
return Redland.librdf_uri_to_string(datatype_uri_hash) if datatype_uri_hash
end
end
ってかんじでしょうか。これで心置きなく型付きリテラルを駆使できますね!
Copyright(c) 2011 Wandaring Visionary some rights reserved. See detail.