すでに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に少しでも興味がありましたら是非ご参加ください.

先日LinkedDataの勉強会を企画して行いました.今回はLinked Dataに興味があるけどどうやったらいいのかわからないという疑問に答えを見つけるために,プログラミング以外の方法でLinked Dataを作成するための支援ツールについて,有志に発表して頂きました.各発表資料はLinkedData.jpのページにまとめてあります.また,これを期にLinkedData.jp自体も少しずつ作り直しています.

個人の感想としては,Google Refineは今後データクリーニングをしたい人には必須のツールになるのではないかなと思いました.日本語がどの程度できるのかは未知なのですが,英語に関してはかなり良い精度でクリーニングできるようです.

これからは定期的に勉強会を開催していきたいと考えていますので,是非ご興味がある方はご参加ください.

ORFのサイトにはまだ掲載されていませんが,来週11/23(火祝) 10:30-11:00にORF2010 40Fカフェでトークセッションをすることになりました.午前中で且つ裏番組達が強力なのですが,Web技術,地域情報・コミュニティ,Open Governmentなどに興味がある方もそうでない方も是非お越しいただければ幸いです.入場費は無料です.

Open Research Forum “And You?” AWA lab. セッション
Linked Dataとコミュニティが拓くオープンガバメント

  • 11/23(火・祝)10:30~11:00
  • 場所:40カフェ
  • 加藤文彦 SFC第9期生 情報システム研究機構 国立情報学研究所特任研究員 LinkedData.jp
  • 小林巌生 Open Community Data Initiative/ 横浜Linked Open Data Project 主宰
  • 司会:深見嘉明 政策・メディア研究科 次世代Web応用技術・ラボ 特別研究助教

世界最大のドキュメントデータベースであるウェブ。そのウェブを、データ共有・活用のためのプラットフォームに進化させる技術、それがLinked Open Data(LOD)です。LODはオープンガバメント戦略の中で重要な技術として位置づけられており、イギリス・アメリカでは政府が積極的に取り組んでいます。

本セッションでは、SFC卒業生で国立情報学研究所にて学術情報のLOD化に尽力されている加藤文彦氏と、地域コミュニティの活性化をLODを通じて行う横浜Linked Open Data プロジェクトを主催する小林巌生氏を迎え、アカデミックコミュニティと地域コミュニティによるボトムアップでのオープンガバメントの実現への方策、課題について議論します。

Twitterを見れば分かるとおり最近RDF Storeの調査をしているのですが、その過程でOntoWikiを使おうとして色々嵌っているので、ログを残しておきます。現在Ubuntu10.04での動作を確認しています。

Virtuosoのインストール

Open Link Virtuosoは複数のデータ形式を統合して扱えるデータベースです。RDF Triple/Quad Storeとしても使え、SPARQLにも対応しています。Open Source版とClosed Source版があり、Closed版ではClusterやSnapshoなどの追加機能があります。ここではOpen Source版を使います。

まずVirtuoso Open Source Editionのインストールです。Ubuntuのrepositoryにあるのが6.1.0で、これだと最新のOntoWikiが不具合起こすので、debian squeezeから最新のソースパッケージ持ってきて再構築しました。


$ wget http://ftp.de.debian.org/debian/pool/main/v/virtuoso-opensource/virtuoso-opensource_6.1.1+dfsg1-1.dsc
$ wget http://ftp.de.debian.org/debian/pool/main/v/virtuoso-opensource/virtuoso-opensource_6.1.1+dfsg1.orig.tar.gz
$ wget http://ftp.de.debian.org/debian/pool/main/v/virtuoso-opensource/virtuoso-opensource_6.1.1+dfsg1-1.diff.gz
$ dpkg-source -x virtuoso-opensource_6.1.1+dfsg1-1.dsc
$ cd virtuoso-opensource-6.1.1

再構築に必要なパッケージをインストールします。

$ aptitude build-dep virtuoso-opensource
$ aptitude install quilt fakeroot

変更点はbuild formatを変えるだけです。changelogとかもそのままでbuildします。

$ echo "3.0 (quilt)" >debian/source/format
$ debuild -us -uc

ライブラリが足りなければ適宜インストールしてください。もし問題がなければ、上のディレクトリに*.debができているのでインストールします。インストール時にデータベースのパスワードを聞かれるので設定します。

$ dpkg -i ../*.deb

次のコマンドで問題なく起動できればインストール完了です。

$ /etc/init.d/virtuoso start

ODBCの設定 (要確認)

NOTE: この設定は必要ないかもしれないので要確認

まずodbcinstをインストールします。

$ aptitude install odbcinst odbcinst1debian1

その後、/etc/odbcinst.ini,odbc.iniを以下のように作成します。

- /etc/odbcinst.ini
[virtuoso-odbc]
Driver  = /usr/lib/odbc/virtodbc.so

- /etc/odbc.ini
[ODBC Data Sources]
VDS  = Virtuoso

[VDS]
Driver  = virtuoso-odbc
Description  = Virtuoso Open-Source Edition
ServerName  = localhost:1111

[VOS]
Driver  = /usr/lib/odbc/virtodbc.so
Description  = Virtuoso OpenSource Edition
Address = localhost:1111

OntoWiki

OntoWIkiはRDF用の閲覧・編集環境です。CMSと言ったほうがいいかもしれません。

とりあえずphp5とapacheの基本的な設定をしておく必要があります。解説を書いている方がたくさんいるので、やり方はググってください。一点追加で必要なのが、php5-odbcのインストールです。

$ sudo aptitude install php5-odbc

php5とapacheをインストールしたら、InstallFromMercurialに書かれている通りに、レポジトリから最新のソースをインストールします。

$ cd /var/www
$ hg clone https://ontowiki.googlecode.com/hg/ owrep
$ cd owrep/ontowiki/src/libraries
$ ln -s ../../../erfurt/src/Erfurt .
$ ln -s ../../../RDFauthor .

$ wget http://framework.zend.com/releases/ZendFramework-1.9.4/ZendFramework-1.9.4-minimal.tar.gz
$ tar xvzf ZendFramework-1.9.4-minimal.tar.gz
$ mv ZendFramework-1.9.4-minimal/library/Zend .
$ rm -rf ZendFramework-1.9.4-minimal.tar.gz ZendFramework-1.9.4-minimal

$ cd /var/www/owrep/ontowiki/src
$ cp htaccess-dist .htaccess
$ cp config.ini-dist config.ini

次にUsingOntoWikiWithVirtuosoを参考にconfig.iniの設定をします。

[private]
store.backend = virtuoso
store.virtuoso.dsn = VOS
store.virtuoso.username = dba
store.virtuoso.password = dba

その後OntoWikiに必要なディレクトリ作成します。


$ mkdir cache log uploads
$ chown www-data:www-data cache log uploads 

Apacheの設定をします。そのままトップに置くのなら/etc/apache2/sites-enabled/000-defaultのDocumentRootと該当Directoryを変更します。

DocumentRoot /var/www/owrep/ontowiki/src
<Directory /var/www/owrep/ontowiki/src>

Apacheを再起動した後、http://localhostにアクセスしてください。問題なければOntoWikiが表示されます。ユーザ名 Admin パスワードなしでログインすると管理画面になります。

Conference Model Demo

FirstStepにConferenceデータのデモの作り方がかかれています。注意する必要があるのは、もしlocalhost以外で動かす場合、Google Maps API Keyの設定が必要です。API Key取得ページで生成した文字列をontowiki/extensions/components/map/component.iniに設定します。

- ontowiki/extensions/components/map/component.ini
apikey.google = "生成した文字列"

オライリーさんの”Programming the Semantic Web”を有志で監訳した本が6/26に出ます.サンプルコードは監訳者一同が結構書き直して動くようにしたので,試しながら読めます.言語はPythonなんですが,Linked Dataなど,現在Web上にあるデータをどうやって使うのかという話がメインなので,他の言語でも役立つはずです.よろしかったら是非.

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

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

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

念願のiPadを昨日手に入れたので,色々いじっている最中です.最初の印象はやはり”でかいiPhone”でしたが,色々触ってみると面白いです.

まず,Photosがかなりいいです.iTunesがiPadとの同期の際に,写真をiPad用に変換してくれます.この作業のために最初の同期に時間がかかるのですが,おかげでかなり綺麗に写真をみることができます.また,ScanSnapで取り込んである名刺のビュアーとしても良いですね.

iPad用アプリとして良くできていると思ったのはBloombergやBBCなどのニュースサイトのアプリです.ここらへんの人々は気合い入れて作っているようです.日本のメディアもそうなるといいんですが.

また,書籍やコミック用のアプリも純正のiBookをはじめとして色々あるようです.iBook,FreeBook, Comics,Cloud Readerを使ってみましたが,視認性は悪くないです.というか普通に読めます.正直ハードはもうこれでいいじゃんと思ってしまいました.今更ハードウェアから議論せずに,Googleのように各デバイス対応の市場を作るというアプローチのほうが正しいと思いますね.

iPad用アプリケーションはユニバーサル版(iPhone/iPad両用)とiPad用に別版が作られている場合と二通りあるようで,有料版は改めて買わせるために分かれている場合が多いようです.また,一部のアプリケーションはUSのApp storeアカウントがないと手に入りません.具体的にはApple純正ソフトのPages, Keynote, Numbers, iBookとAdobe Ideasです(他にもあるかもしれません).iBookを使うだけのためにでも,USのアカウントを取得したほうが良いです.私は"$ドルのギフトカードを買う方法 アメリカiTunes Music Store(iTMS) USで自由気ままに洋楽を買う法"を参考に,eBayで購入して作りました.

現在Evernoteのoffline syncをしているのですが全然終わりません.Evernote自体既に2年以上使っていて,それ以前のデータも全て変換して入れてあるので,流石に詰め込みすぎなんでしょうかね.ちゃんと使えるようになったらレポートします.

"Apple iPad 総合まとめWiki"は参考になりました.現状一番情報が集まっているのは2chの各種iPadスレだと思います.

Webを支える技術 – HTTP、URI、HTML、そしてREST

Amazonで予約して購入していたのですが,やっと読みました.Webアーキテクチャや基礎技術についてのとても良い教科書だと思います.去年まで3年ほど分散情報システム構成法という講義を何人かで担当していましたが,この講義の最初の数回分の教科書として使えます.

15-17章の郵便番号検索サービスはcontent-negotiationでRDFも返してくれると嬉しいなと思いましたが無理ですかね?ここでも読み仮名語彙問題はでてくるのですが.

後,この本読んだ後にはArchitecture of the World Wide Web, Volume Oneを読むのがお勧めです.

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

今日有志でSemweb&LOD勉強会を行いました.そこでとりあえず日本語で議論できる場所が必要ということになったため,Google GroupsにLinkedData.jpというグループを作りました.LinkedDataやSemantic Webについて議論したり開発したりする場になれば良いなと思っています.ご興味のある方は是非ご参加下さい.

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メーリングリストで遠慮なく聞いて下さい。