Redlandでリテラルノードのデータ型が知りたい

Redlandを使うようになってしばらく悩んだリテラルノードのデータ型取得方法。答えが出たのでまとめてみました。

作成
2011-04-16
更新
2011-04-19
執筆
任那伽耶
分類
,

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

                

ってかんじでしょうか。これで心置きなく型付きリテラルを駆使できますね!

その他、関連するコンテンツは以下のとおり。

次の記事
目次
任那伽耶の徒然日記 in 2011年

当ページにリンクを貼ったりブックマークする時は以下のURIにすると便利です。

パーマリンク
http://www1.kcn.ne.jp/~solomon/kaja/diary/2011/0416234303

Copyright(c) 2011 Wandaring Visionary some rights reserved. See detail.