Atom Login Admin

Above the clouds

Apache JenaでRDFの基礎を学ぶ (1)

written on Sunday,August 16,2015

[Apache Jenaとは]

セマンティックWeb、Linked Dataサービス実現のための機能を搭載したオープンソースのフレームワーク。 Sparql Endpointとしても利用できるWebインターフェイス(Fuseki2)を提供している。またTDBというRDFの格納を行うAPIも提供している。

Apache Jena Tutorial

  • 序文

このチュートリアルはJenaのJava APIとW3CのRDFの紹介となっている。RDFに詳しくないプログラマーが素早く実装を進める必要がアル場合や、プロトタイピングしたり、また他の理由で学習をする場合の目的で書かれている。JavaとXMLには触れたことがある事を前提としている。

RDFのデータモデルを理解することなく、実装を素早く進めると骨が折れる。まだデータモデルについて学習したことがない場合はつまらないもので難しく感じるもの。そこで、よりよい方法としてはデータモデルとそれをどうやって使うかを並行して理解する。少しデータモデルの学習を行い、試行する。そして、また勉強して試行する。実践して理論を理解する。
データモデルは全くシンプルなもので、このアプローチであれば理解にそう長くかかるものでもない。

RDFはよく親しんでいるXMLを使っているので、RDFは文法だと考えがちだが、それは間違っている。RDFはデータモデルだ。RDFはXMLで表現できるが、データモデルを理解するもので、文法などは二の次である。

話が変わるが、ドキュメント内で仕様されているJena API実装の動くソースコードと例は以下からダウンロードできる。jena.apache.org/download/index.cgi.

Introduction

Resource Description Framework(RDF)はリソースの記述の為に標準化されたものである。
リソースって?それはむしろ深い質問で、正確な定義についてはまだ議論の対象である。
我々の目的のために、我々はそれを我々が確認することができる何とでもみなすことができる。例えば、あなたはリソースで、ホームページ、このチュートリアル、Moby Dickの大きな白クジラ(意味不明。)

このチュートリアルの我々の例は人に関することになる。RDF representation of VCARDSを使う。RDFはノードと弧ダイアグラムの公式を考えるのに適している。RDFではvcardは以下のように表す。

スクリーンショット 2015-08-16 22.55.09.png

リソースのJohn Smithは楕円系で示されているもので、URIで識別される。この場合ではhttp://.../JohnSmith。ブラウザーでアクセスしても成功はしないが。。四月のジョークでもあるまいし、あなたのブラウザーからJohnSmithのリソースにアクセスできたら逆に驚くぜ。。
URIに親しみがない場合は変わった名前だと思って理解してもらえば結構だ。

リソースは属性を持っている。この例では、John Smithのビジネスカードの属性に関心を持っている。図1が示すようにJohn Smithのフルネームの属性一つを持っている。属性は属性名でラベルされた弧で示される。属性名もまたURIであるが、URIは長くて扱いづらいので、ダイアグラムはXMLのqnameで表す。:の前の部分は名前空間のプレフィクスで名前空間を表す。
:の後ろの部分はローカルネームで名前空間内の名前を表している。属性をqnameで表現するのXMLで記述したりダイアグラムとか文章で表すときに便利である。しかし、厳密には属性はURIで識別されるものである。nsprefix:localnameの形式はURIのローカルネームと名前空間を簡単にするためのものである。属性のURIは何でもブラウザでアクセスできるものである必要はない。

それぞれの属性は値を持っている。この場合では値はリテラルで、文字列として考えることができる。上図ではリテラルは四角で表されている。

JenaはこのようなRDFグラフをJava APIでつくることができる。Jenaはグラフ、リソース、属性、リテラルを表現するクラスを定義している。リソース、属性、リテラルをそれぞれResource, Property, LiteralのInterfaceとしている。グラフはモデルと呼び、Model Interfaceとして扱う。

下記コードは上図のグラフを作成した例である。

// some definitions
static String personURI    = "http://somewhere/JohnSmith";
static String fullName     = "John Smith";

// create an empty Model
Model model = ModelFactory.createDefaultModel();

// create the resource
Resource johnSmith = model.createResource(personURI);

// add the property
johnSmith.addProperty(VCARD.FN, fullName);

始めに静的な値を定義し、ModelFactoryのcreateDefaultModel()メソッドで、メモリベースの空のModelを作成している。Jenaは他のModelインターフェースも実装して、RDBを使用したり、その他のタイプのモデルもModelFactoryより使用することができる。

John Smithリソースが作成され属性の追加された。その属性はVCARDスキーマの定義オブジェクトを全て持つ静的クラスのVCARDによって提供される。JenaはRDFとRDFスキーマ、DublinCoreとOWLなど良く知られているスキーマについては静的クラスを提供している。

また以下のようにコンパクトに記述することもできる。

Resource johnSmith =
        model.createResource(personURI)
             .addProperty(VCARD.FN, fullName);

動くソースコードの例としては/src-exampleディレクトリにある。エクササイズとしてコードを変更して自分でVCARDモデルを作ってみるのもいいであろう。

では、VCARDの詳細について追加するのと、RDFとJenaの機能についてみていこう。

一つ目の例では属性の値はリテラルだった。RDFの属性は他のリソースを値として持つ事もできる。共通のRDFのテクニックを用いると、この例はJohn Smithの名前の別の部分をどうやって
表現するかを示すものである。

ここではJohn Smithの名前の構造を表現するために、vcard:Nという新しい属性を追加する。
このモデルに関していくつか興味深いものがある。vcard:N属性は値としてリソースを持ってきている。また、楕円はURIなしで結合した名前を示している。これはブランクノードという。

Jenaで記述するととてもシンプルである。

// some definitions
String personURI    = "http://somewhere/JohnSmith";
String givenName    = "John";
String familyName   = "Smith";
String fullName     = givenName + " " + familyName;

// create an empty Model
Model model = ModelFactory.createDefaultModel();

// create the resource
//   and add the properties cascading style
Resource johnSmith
  = model.createResource(personURI)
         .addProperty(VCARD.FN, fullName)
         .addProperty(VCARD.N,
                      model.createResource()
                           .addProperty(VCARD.Given, givenName)
                           .addProperty(VCARD.Family, familyName));

Apache JenaでRDFの基礎を学ぶ(2)へつづく。

Comments

Add Comment

Login
This entry was tagged #OpenData #LinkedData #RDF