WikidataWikimediaのプロジェクトの一つで,人間と機械が同じように参照・編集可能なフリーな知識ベースです.誰もが簡単に構造化データを作れます.WikidataはすでにWikipediaの言語間リンク等に利用されています.

技術的に見ると,WikidataはLinked Dataを基盤としています.まず,http://ja.wikipedia.org/wiki/森薫のWikidataページはhttp://www.wikidata.org/wiki/Q433255になります.DBpediaと異なり,一つのアイテム毎にユニークなid (Qの後のXXXXX)があり,それに多言語のラベルが付くようになっています.WikipediaとWikidataの対応関係を知るためにはリゾルバがあります.リゾルバのURI設計はhttp://www.wikidata.org/wiki/Special:ItemByTitle/{site}/{title}です.森薫の例だと,http://www.wikidata.org/wiki/Special:ItemByTitle/jawiki/森薫となります.

一方で,アイテム自体を識別するためのURIはhttp://www.wikidata.org/entity/Q{id}となっています.Q433255を識別するためのURIはhttp://www.wikidata.org/entity/Q433255です.Linked DataとしてのURI設計は以下の通りになります.connegはhttp,https両方受け付けるみたい.

  • Item URI: http://www.wikidata.org/entity/Q{id}
  • データURI: http://www.wikidata.org/wiki/Special:EntityData/Q{id}
  • HTMLページ URI: http://www.wikidata.org/wiki/Q{id}
  • JSON URI: http://www.wikidata.org/wiki/Special:EntityData/Q{id}.json
  • Turtle URI: http://www.wikidata.org/wiki/Special:EntityData/Q{id}.ttl
  • RDF/XML URI: http://www.wikidata.org/wiki/Special:EntityData/Q{id}.rdf
  • N-Triples URI: http://www.wikidata.org/wiki/Special:EntityData/Q{id}.nt
$ curl -LH 'Accept: text/turtle' http://www.wikidata.org/entity/Q433255
@prefix data: <http://www.wikidata.org/wiki/Special:EntityData/> .
@prefix schema: <http://schema.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix entity: <http://www.wikidata.org/entity/> .
@prefix cc: <http://creativecommons.org/ns#> .
@prefix wikibase: <http://www.wikidata.org/ontology#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .

data:Q433255
  schema:version 103373967 ;
  schema:dateModified "2014-01-19T13:20:45Z"^^xsd:dateTime ;
  a schema:Dataset ;
  schema:about entity:Q433255 ;
  cc:license <http://creativecommons.org/publicdomain/zero/1.0/> .

entity:Q433255
  a wikibase:Item ;
rdfs:label "森薰"@zh-hans, "森薰"@zh-hant, "森薰"@zh-hk, "森薰"@zh-cn, "森薰"@zh-sg, "森薰"@zh-tw, "Kaoru Mori"@de, "森薫"@ja, "Kaoru Mori"@fr, "Мори, Каору"@ru, "모리 카오루"@ko, "Kaoru Mori"@en, "Kaoru Mori"@sv, "Kaoru Mori"@nl, "Kaoru Mori"@es, "Kaoru Mori"@pl, "森薰,"@zh ;
  skos:prefLabel "森薰"@zh-hans, "森薰"@zh-hant, "森薰"@zh-hk, "森薰"@zh-cn, "森薰"@zh-sg, "森薰"@zh-tw, "Kaoru Mori"@de, "森薫"@ja, "Kaoru Mori"@fr, "Мори, Каору"@ru, "모리 카오루"@ko, "Kaoru Mori"@en, "Kaoru Mori"@sv, "Kaoru Mori"@nl, "Kaoru Mori"@es, "Kaoru Mori"@pl, "森薰,"@zh ;
  schema:name "森薰"@zh-hans, "森薰"@zh-hant, "森薰"@zh-hk, "森薰"@zh-cn, "森薰"@zh-sg, "森薰"@zh-tw, "Kaoru Mori"@de, "森薫"@ja, "Kaoru Mori"@fr, "Мори, Каору"@ru, "모리 카오루"@ko, "Kaoru Mori"@en, "Kaoru Mori"@sv, "Kaoru Mori"@nl, "Kaoru Mori"@es, "Kaoru Mori"@pl, "森薰,"@zh ;
  schema:description "japanische Manga-Zeichnerin"@de, "japońska mangaka"@pl ;
  skos:altLabel "森薫"@zh, "Mori Kaoru"@de, "森薫"@de, "県文緒"@ja, "森薫"@fr, "Mori Kaoru"@fr, "Fumio Agata"@fr, "Agata Fumio"@fr, "県文緒"@fr, "Мори Каору"@ru, "Каору Мори"@ru, "모리 가오루"@ko, "Mori"@sv .

<http://zh.wikipedia.org/wiki/%E6%A3%AE%E8%96%B0>
  a schema:Article ;
  schema:about entity:Q433255 ;
  schema:inLanguage "zh" .
....

参考

最近自分が何をしているかはここよりslideshareをみたほうが良いという感じになってしまっています.先日2013年7月5日に人工知能学会主催で行ったセミナーがこれまでのまとめのような内容なのでここでも共有しておきます.Linked Open Dataについて一から知りたい人向けです.

私も翻訳に参加したLinked Dataの本が2/4に発売されます.日本語でLinked Dataについて包括的に解説するはじめての本ですので,Linked Dataやオープンデータ,Web技術に興味がある方皆様に役立つとおもいます.是非お手にとって頂ければ幸いです.(目次案)

アマゾンのサーバでエラーが起こっているかもしれません。
一度ページを再読み込みしてみてください。

今年は全然ブログ書く気力がなかったので最後に軽くまとめを書いておこうとおもいます.まだ書いていないことも色々ありますが,総じて今年はオープンデータ・オープンガバメントが日本でも花開きそうな一年でした.

LODチャレンジJapan

オープンデータのコンテストとして,昨年度LODチャレンジ Japan 2011を開催しました.一委員として,主にチャレンジデーの運営等を担当していました.震災後から活動のお手伝いをしているsaveMLAKについて,オープンデータとして整備したので応募したところデータセット部門 最優秀賞を頂きました.これは私個人というよりsaveMLAKコミュニティ全体が評価されたということだとおもいます.

LODチャレンジは今年度も絶賛募集中です.応募〆切は2013年1月31日なので興味のある方は是非応募をご検討下さい.

DBpedia Japanese

長年日本のLinked Data業界的に懸念だった”日本語のハブがない”問題を解決するために,DBpediaの日本語版であるDBpedia Japaneseを立ち上げました.DBpediaはWikipediaのダンプデータを変換してLODとして再公開するコミュニティプロジェクトです.それの日本語Wikipedia分を担当しています.

DBpedia Japaneseまだ発展途上で,WikipediaのテンプレートやテーブルをDBpedia の語彙 (DBpedia OntologyやFOAF等)に対応付ける作業を進める必要があります.現時点でのマッピング状況はMapping Statistics for jaで見ることができます.
もしこの作業に興味のある方は http://lod.ac/wiki/DBpedia_Mappings を読んでいただければとおもいます.

特定非営利活動法人リンクト・オープンデータ・イニシアティブ

Linked Data / Open Dataの普及,利活用を推進していくためにNPO法人
今年4月に申請,8月に設立しました.社会的貢献として,主に技術面から日本のオープンデータ,オープンガバメント推進の手助けをしていく予定です.

すでに福井県鯖江市と技術面での共同作業をしていますし,関係者が省庁や地方自治体のオープンデータ・オープンガバメント関連委員会の委員を勤めたりしているなど,様々な活動を開始しています.今まで福井に行ったことなかったのに今年鯖江に4回も行く事になるとは去年の段階では想像していませんでした...

CKAN

GLOCOM主催のオープンデータ活用アイデアソンがきっかけで,CKANの日本語化プロジェクトをスタートしました.CKANはデータポータルサイトのFLOSSで,データカタログやデータストア,API等の機能を持っています.大分本家にフィードバックされているのですがまだまだ足りない作業もありますし,今後は日本語化だけではなくてCKAN自体にコミットして行くことが望まれるかなと.

この手のソフトウェアでは,他にOGPLがFLOSSになりました.SocrataもFLOSSになる予定らしいです.そんな中CKANを個人的に推している理由は,これがいくつかの意味でLinked Dataのプラットフォームでもあるからです.

CKANで入力されたカタログデータは実はLinked Dataとして公開されています.例えばブルガリア政府の支出についてのデータ.また,LOD Cloudに載せてもらうための手続きは,CKANで構築されたサイトthe Data Hub決められた情報を追加することです.

CKANについてはいずれまとまった文章を書くつもりです.

生物学関係

昨年から生物種名のLinked Dataについてあれこれやってきました.LODチャレンジ2011にLODAC BDLSを出し,それをベースにLODAC Speciesという種名のLinked Dataを構築しました.生物種に関するデータのハブになることを目指しています.また,これを利用した検索拡張のデモ (1, 2)とかも作りました.

生物学は分散データの統合プラットフォームとしてLinked DataやSPARQLの採用が進んでいる分野です.私もBiohackathon等様々なイベントに参加させて頂いて大変刺激になりました.

mmmap: Yet Another 学会支援システム

奈良で開催されたACM Multimedia 2012JIST2012用のスケジュール等をLinked Dataのアプリケーションとして作成しました.

Evernote APIの連載

技術評論社で昨年からEvernote APIについての不定期連載を書いていました.しかし,上記のOpen Data/Linked Data関連の仕事が今年一気に来たので執筆時間が取れず,途中で連載終了にさせて頂きました.Evernoteはユーザとしては今後も使い続けていきます.

ニコニコ学会β

深く運営に関わっているわけではないですが,ニコニコ学会βは手伝える範囲でお手伝いしています.今年はマッドネスの投票サイト(第2回,第3回を作ったりニコニコ超会議でスタッフやったりしていました.

EPUB3仕様書翻訳手伝い

とあるきっかけによりEPUB3仕様書の翻訳の手伝い(主に校正)をしています.電子書籍関係は元々興味対象なので,EPUBが広まるきっかけになればと.

LinkedData.jpに投げたのをこちらにも載せます.

FacebookのOpen Graph Protocol (Web pageに埋め込むほう)は元々RDFaやMicroformatsから派生して作られていますが,今回のf8からの変更で,Open Graph API (グラフの情報を取得するほう)がJSONだけではなくてTurtleを返すようになりました.

例えば私のfacebookの情報はhttp://graph.facebook.com/fumihiroから取れます.

% curl -H 'Accept: text/turtle' http://graph.facebook.com/fumihiro
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix api: <tag:graph.facebook.com,2011:/> .
@prefix og: <http://ogp.me/ns#> .
@prefix fb: <http://ogp.me/ns/fb#> .
@prefix : <http://graph.facebook.com/schema/~/> .
@prefix user: <http://graph.facebook.com/schema/user#> .
</1209165766#>
       user:id "1209165766" ;
       user:name "Fumihiro Kato" ;
       user:first_name "Fumihiro" ;
       user:last_name "Kato" ;
       user:link <http://www.facebook.com/fumihiro> ;
       user:username "fumihiro" ;
       user:gender "male" ;
       user:locale "en_US" .

@base <http://graph.facebook.com> .があったほうが良いとおもうのですが,そこらへんは修正されることを期待します.同じものをntriplesにしてみると,以下のようになります.こちらのほうがURIがはっきりしていてわかりやすいかもしれません.

% rapper -i turtle -o ntriples 'http://graph.facebook.com/fumihiro'
rapper: Parsing URI http://graph.facebook.com/fumihiro# with parser turtle
rapper: Serializing with serializer ntriples
<http://graph.facebook.com/1209165766#>
<http://graph.facebook.com/schema/user#id> "1209165766" .
<http://graph.facebook.com/1209165766#>
<http://graph.facebook.com/schema/user#name> "Fumihiro Kato" .
<http://graph.facebook.com/1209165766#>
<http://graph.facebook.com/schema/user#first_name> "Fumihiro" .
<http://graph.facebook.com/1209165766#>
<http://graph.facebook.com/schema/user#last_name> "Kato" .
<http://graph.facebook.com/1209165766#>
<http://graph.facebook.com/schema/user#link>
<http://www.facebook.com/fumihiro> .
<http://graph.facebook.com/1209165766#>
<http://graph.facebook.com/schema/user#username> "fumihiro" .
<http://graph.facebook.com/1209165766#>
<http://graph.facebook.com/schema/user#gender> "male" .
<http://graph.facebook.com/1209165766#>
<http://graph.facebook.com/schema/user#locale> "en_US" .
rapper: Parsing returned 8 triples

f8でのもう一つの変更は,ページやアプリの作成者がActionとObjectを定義できるようになったことです.Actionは動作,Objectは対象物として,User => Action => Object という関係を取れるようになります.これは,今までのUser => Like => Page の関係が発展したものです.見ての通りこれはトリプルになります.今はまだ出していないですが,今後Turtleでこの関係が取れるようにしてくるでしょう.

schemaもrdfsでとれるようになっています.

ユーザのschema

% curl -H 'Accept: text/turtle' 'http://graph.facebook.com/schema/user'

ページのschema

% curl -H 'Accept: text/turtle' 'http://graph.facebook.com/schema/page'

また,もっと様々な付加情報が欲しい場合は,’?metadata=1’をつけると取れます.

% curl -H 'Accept: text/turtle' 'http://graph.facebook.com/fumihiro?metadata=1'
</1209165766#>
       user:home <http://graph.facebook.com/fumihiro/home> ;
       user:feed <http://graph.facebook.com/fumihiro/feed> ;
       user:friends <http://graph.facebook.com/fumihiro/friends> ;
       user:mutualfriends <http://graph.facebook.com/fumihiro/mutualfriend> ;
       user:family <http://graph.facebook.com/fumihiro/family> ;
......

但しこれらのURIの先はOAuth認証しないと取れないようになっています.

やはりすでに大量の人URIを持っているauthorityが提供し始めるとインパクトが違いますね.Twitterのメタデータ埋め込みがまったく音沙汰なくなっていて悲しいですが,Google+とかにも頑張ってもらいたいです.

色々試した画面キャプチャや参考リンクなどをGoogle+にまとめています.

すでにEbookは販売されているのですが,O’reilly MediaからLearning SPARQLという本がでています.紙は7/22からのようです.一通り読みましたが,今のところ唯一のSPARQL解説本ですし,SPARQL1.1の細かい内容まで含んでいるのでお薦めです.セマンティックWeb プログラミングではSPARQLの話は少しでてくるだけでしたが,この本が補完してくれます.

既にWeb上では,SPARQLを使うことで政府データや音楽データ,生物データなどの多種多様なデータにアクセスできるようになっています.単なるWebAPIと異なるのは,SPARQLを一度覚えることで,SPARQLに対応しているサイトであればどこでも同じ仕組みでデータを使えるということです.他には複数のサイトからデータを取得してマージするときなどにメリットがあったりします.

日本でもすでに国立国会図書館典拠データ検索・提供サービス (Web NDL Authorities)DBCLSのAllie: A Search Service for Abbreviation / Long Form,我々のプロジェクトであるLODACなど,SPARQL Endpointを持っているサイトがでてきています.これらのデータを使うためにSPARQLを勉強するには良い本だと思います.

ちなみに今週末開催の第2回LinkedData勉強会のメインテーマはSPARQLです.SPARQLに少しでも興味がありましたら是非ご参加ください.

しばらく慌ただしかったのでブログを書けずにいました.twitterでは報告済みなのですが,新しいプロジェクトを始めるために4月末で早々に前職を退職し,5月中旬から別の職場に転職しました.Interop2010のW3Cブースにて概要を話しましたので,紹介代わりにスライドを貼っておきます.

同時期にW3CでもLibrary Linked Data Incubator Groupが始まりました.1年時限付きのグループで,既存の事例集めや要求事項まとめなどが目標のようです.このプロジェクトからも取り敢えず数名参加しています.しかし,一度標準化の世界に関わるとどこ行っても関わることになっているような気がしてこの世界狭いなと.

RubyからRDFを使うライブラリをいくつか紹介してきましたが,最近急ピッチで開発されているRDF.rbが本命になりそうです.まだSPARQLは使えず,基本的なことしかできませんが,やっとどれを使ったらいいのかよくわからないという状況が変わりそうです.

ちゃんとした紹介を日本語で書こうと思っていたら,作者達が良くできたチュートリアルを書いてくれたので,それを翻訳することにしました.とりあえずここに置いておくことにします.

RubyによるRDFデータの解析と永続化 (Parsing and Serializing RDF Data with Ruby)

original text 2010/04/21 by Arto

このチュートリアルでは、Ruby用のライブラリRDF.rbを使ったRDFデータの解析と永続化の方法を学びます。RDFを基礎としたLinked Dataの永続化形式には色々ありますが、RDF.rbでは多くの形式が使えます。

このチュートリアルに沿ってコード例を試すには、RubyとRubygemsだけが必要です。最近のRuby 1.8.xや1.9.x、またはJRuby1.4.0以上なら動きます。

サポートしているRDF形式

現在RDF.rbで解析や永続化できるRDF形式は以下の通りです。


形式        | 実装                  | RubyGems gem
------------|-----------------------|-------------
N-Triples   | RDF::NTriples         | rdf
Turtle      | RDF::Raptor::Turtle   | rdf-raptor
RDF/XML     | RDF::Raptor::RDFXML   | rdf-raptor
RDF/JSON    | RDF::JSON             | rdf-json
TriX        | RDF::TriX             | rdf-trix

RDF.rb自体は比較的軽量なgemで、N-Triples形式のみビルトインでサポートしています。その他の形式についてはRDF::Raptor, RDF::JSON, RDF::TriXのようなプラグインとして、個別のgemにパッケージ化されています。このアプローチによって、コアライブラリを他から切り離して、RDF.rb自体がいかなるXMLやJSONパーサへの依存しないようにしています。

これら全ての形式サポートを一度に簡単にインストールできます。

$ sudo gem install rdf rdf-raptor rdf-json rdf-trix
Successfully installed rdf-0.1.9
Successfully installed rdf-raptor-0.2.1
Successfully installed rdf-json-0.1.0
Successfully installed rdf-trix-0.0.3
4 gems installed

注: RDF::Raptor gemはRaptor RDF Parser ライブラリとそのコマンドラインツールがシステムにインストールされている必要があります。MacやLinux, BSDディストリビューションのための簡単なRaptorのインストール方法は以下の通りです。

$ sudo port install raptor             # Mac OS X with MacPorts
$ sudo fink install raptor-bin         # Mac OS X with Fink
$ sudo aptitude install raptor-utils   # Ubuntu / Debian
$ sudo yum install raptor              # Fedora / CentOS / RHEL
$ sudo zypper install raptor           # openSUSE
$ sudo emerge raptor                   # Gentoo Linux
$ sudo pkg_add -r raptor               # FreeBSD
$ sudo pkg_add raptor                  # OpenBSD / NetBSD

Raptorのインストールや使用方法についての更なる情報は、我々の以前のチュートリアル RDF for Intrepid Unix Hackers: Trasmuting N-Triplesを見てください。

RDFデータの読み込み

もしあなたが急いでいて、すぐにRDFデータの正しい読み込み方を知りたいのなら、あなたが知る必要があることは本当に以下だけです。

require 'rdf'
require 'rdf/ntriples'

graph = RDF::Graph.load("http://datagraph.org/jhacker/foaf.nt")

この例では、まずはじめにRDF.rbとN-Triples形式のサポートを読み込んでいます。その後、RDF::Graphクラスの便利なメソッドを使って、RDFデータを一度に直接ウェブURLから取得して解析します。(loadメソッドはファイル名かURLを受け付けます。)

全てのRDF.rbパーサプラグインは、処理可能なMIMEタイプとファイル拡張子を宣言します。それが、上の例でRDF.rbが、与えられたURLにあるfoaf.ntファイルを読むためのN-Triplesパーサのインスタンスの作り方を知っている理由です。

同じ方法で、RDF.rbは他のいかなるRDFファイル形式を自動検知します。そのためには、以下のどれかを使って形式のサポートを読み込めば良いです。


require 'rdf/ntriples' # Support for N-Triples (.nt)
require 'rdf/raptor'   # Support for RDF/XML (.rdf) and Turtle (.ttl)
require 'rdf/json'     # Support for RDF/JSON (.json)
require 'rdf/trix'     # Support for TriX (.xml)

注: もし複数の名前付きグラフを含むRDFファイル(TriXのように名前付きグラフをサポートする永続化形式)を読む必要があるなら、おそらくRDF::Graphの代わりにRDF::Repositoryを使いたいでしょう。


repository = RDF::Repository.load("http://datagraph.org/jhacker/foaf.nt")

この2つの違いは、RDF::Repositoryインスタンス内のRDF文が、オプションとしてcontextを含められることです(すなわち4つ組(quad)になれます)。RDF::GraphインスタンスのRDF文は常に同じcontextとなります(すなわちこれらは3つ組(triple)です)。言い換えると、レポジトリは一つ以上のグラフを含み、以下のようにアクセスできます。

repository.each_graph do |graph|
  puts graph.inspect
end

RDF形式の内部処理

RDF.rbの解析や永続化APIは以下の3つの基底クラスを基にしています。

  • RDF::Formatは特定のRDF永続化形式を記述するために使われます。
  • RDF::ReaderRDFパーサ実装用の基底クラスです。
  • RDF::WriterRDF永続化実装用の基底クラスです。

もしあなたが解析や永続化をしたいファイル形式について何か知っているなら、形式指定用のクラスを以下の何れかの方法で取得できます。

require 'rdf/raptor'

RDF::Format.for(:rdfxml)       #=> RDF::Raptor::RDFXML::Format
RDF::Format.for("input.rdf")
RDF::Format.for(:file_name      => "input.rdf")
RDF::Format.for(:file_extension => "rdf")
RDF::Format.for(:content_type   => "application/rdf+xml")

一度そのような形式指定用のクラスを持てば、そこから解析/永続化実装を取得可能です。

format = RDF::Format.for("input.nt")   #=> RDF::NTriples::Format
reader = format.reader                 #=> RDF::NTriples::Reader
writer = format.writer                 #=> RDF::NTriples::Writer

また、RDF::ReaderとRDF::Writerにも、直接対応するファクトリメソッドがあります。

reader = RDF::Reader.for("input.nt")   #=> RDF::NTriples::Reader
writer = RDF::Writer.for("output.nt")  #=> RDF::NTriples::Writer

以上が、URLやファイル名をRDF::Graph.loadに渡したときに、RDF.rbが正しい解析実装を得るために内部で依存するものです。もちろん、永続化形式を自動検出して、解析や永続化用の適切な実装クラスに委譲する必要がある、他のいかなるメソッドも同様です。

RDFデータの解析

もし、より明示的にRDFデータの解析、例えばデータセットをメモリに読み込めないので文毎に処理したい、ということをする必要があるのなら、RDF::Readerを直接使う必要があります。

ファイルからRDF文を解析

RDFパーサ実装は一般的にRDF::Enumerableインタフェースのストリーミング互換なサブセットをサポートします。これは#each_statementメソッドを基にしています。以下はRDFファイルを文毎に列挙しながら読み込む方法です。

require 'rdf/raptor'

RDF::Reader.open("foaf.rdf") do |reader|
  reader.each_statement do |statement|
    puts statement.inspect
  end
end

RDF::Reader.openをRubyブロックと一緒に使うことで、入力ファイルが処理後に自動的に閉じられることが保障されます。

URLからRDF文を解析

前の通り、ファイル名を使えていた場所全てでhttp://https://のURLを使えます。

require 'rdf/json'

RDF::Reader.open("http://datagraph.org/jhacker/foaf.json") do |reader|
  reader.each_statement do |statement|
    puts statement.inspect
  end
end
文字列からRDF文を解析

時々、すでにメモリバッファ上のどこかに永続化されたRDFコンテンツを持っているときがあります。例えばデータベースから取得した場合です。そのような場合、前に示したパーサ実装を取得して、その後RDF::Reader.newを直接使います。

require 'rdf/ntriples'

input = open('http://datagraph.org/jhacker/foaf.nt').read

RDF::Reader.for(:ntriples).new(input) do |reader|
  reader.each_statement do |statement|
    puts statement.inspect
  end
end

RDF::Readerコンストラクタはダックタイピングを使用しているので、#readlineメソッドに応答するいかなる入力(例えばIOStringIOオブジェクト)を受け付けます。もし入力の引数が何も与えられないときは、入力データはデフォルトで標準入力から読み込まれます。

RDFデータの永続化

RDFデータの永続化は解析とほとんど同様です。名前付きの出力ファイルに永続化されるとき、与えられたファイル拡張子によって正しい永続化実装がファイル拡張子によって自動検出されます。

出力ファイルにRDF文を永続化する

RDF永続化実装は一般的にRDF::Mutableインタフェースのサブセットであり、追加だけ可能です。主に#insertメソッドとそのエイリアス#<<が対応します。以下がRDFファイルに文毎に出力する方法です。

require 'rdf/ntriples'
require 'rdf/raptor'

data = RDF::Graph.load("http://datagraph.org/jhacker/foaf.nt")

RDF::Writer.open("output.rdf") do |writer|
  data.each_statement do |statement|
    writer << statement
  end
end

またですが、RDF::Writer.openをRubyブロックと一緒に使うことで、処理後に出力ファイルが自動的にフラッシュされ閉じられることが保障されています。

RDF文を文字列結果に永続化

ある共通のユースケースは、文字列バッファにRDFグラフを永続化することです。例えばRailsアプリケーションからRDFデータを供給するときです。RDF::Writerには便利なbufferクラスメソッドがあり、StringIOに出力を溜め込んで最後に文字列として返してくれます。

require 'rdf/ntriples'

output = RDF::Writer.for(:ntriples).buffer do |writer|
  subject = RDF::Node.new
  writer << [subject, RDF.type, RDF::FOAF.Person]
  writer << [subject, RDF::FOAF.name, "J. Random Hacker"]
  writer << [subject, RDF::FOAF.mbox, RDF::URI("mailto:jhacker@example.org")]
  writer << [subject, RDF::FOAF.nick, "jhacker"]
end
永続化出力をカスタマイズ

もし特定の永続化実装が名前空間接頭辞宣言や基底URIのようなオプションをサポートしているなら、これらのオプションをRDF::Writer.openRDF::Writer.newにキーワード引数として与えることで指定できます。

RDF::Writer.open("output.ttl", :base_uri => "http://rdf.rubyforge.org/")
RDF::Writer.for(:rdfxml).new($stdout, :base_uri => "http://rdf.rubyforge.org/")

サポートチャンネル

皆さん、今はこれで終わりです。このチュートリル以上のAPIについての情報は、RDF.rb API文書を参照してください。何か質問があれば、#swigpublic-rdf-ruby@w3.orgメーリングリストで遠慮なく聞いて下さい。