Tutorial for publishing linked open data.
Permalink
Failed to load latest commit information.
assets
images
README.mkd tutorialの2のsparqlクエリを追加 Mar 23, 2012
index.html
starter-template.html
tutorial2.rdf
tutorial2_1.rq
tutorial2_2.rq

README.mkd

Linked Data チュートリアル

この資料ではLinked Dataについての様々なツールや方法論を紹介し、実際にLinked Dataを構築するための手順について説明していきます。

Linked Dataを構成する要素

Linked Dataは分散されたデータをWebによってつなげることによって実現されるもの、またはその活動のことを指します。Webが普及してから、様々な機関や企業がデータを蓄積し、システムに活かしてきました。各ドメインにあるデータは、外部のデータと連携することでより良いものを生み出す可能性があります。色々な団体がデータをオープンにすることによってWebをより便利なものにしていこうという理念のもと進められているのが、Linked Dataの活動です。

各団体が保有しているデータを公開する手段はいくつかあります。

Linked Data 5 Stars

  1. Available on the web (whatever format) but with an open licence, to be Open Data
  2. Available as machine-readable structured data (e.g. excel instead of image scan of a table)
  3. as (2) plus non-proprietary format (e.g. CSV instead of excel)
  4. All the above plus, Use open standards from W3C (RDF and SPARQL) to identify things, so that people can point at your stuff
  5. All the above, plus: Link your data to other people’s data to provide context

機械可読であり、W3C標準の技術を利用してデータを公開することを進めています。また、自分の公開したデータを外部で作成されたデータと関連付けることでより役に立たせることができます。

Web上でデータを提供する方法としてはWebAPIによる公開が一般的なのではないか、と考えられる方も多いでしょう。Linked Dataではデータそのものを参照できるようにするため、WebAPI用のエンドポイントを実装する必要がなくなります。WebAPIのための認証機構や設計をするコストを割くことができない場合もあるでしょう。Linked Dataでは構造化されたデータを参照可能にすることで、グローバルなWebの空間で利用されることを期待しているため、W3Cで標準化されている方法でデータの公開ができてしまえばあとは余分な設計をする必要はありません。外部の開発者がデータを使いやすい形で提供するためのインフラとしての役割こそが、Linked Dataが期待されている点であると言えるでしょう。

ではLinked Dataであるためにはどのようなことを守れば良いのでしょうか。Linked Dataであるための4原則は以下のとおりです。

  1. Use URIs as names for things.
  2. Use HTTP URIs so that people can look up those names.
  3. When someone looks up a URI, provide useful information, using the standards (RDF*, SPARQL)
  4. Include links to other URIs. so that they can discover more things.

全ての物事にURIによる名前をつけ、URIは人間が読んでも理解可能であるようにし、URIを参照した際に有用な情報が提供されるようにし、より多くの情報が見つかるように他のURIへのリンクを含むことであると述べられています。この原則を守ることにより、データ同士の連携が深まっていくことになります。

Linked Dataに関する一般的な情報は以下のサイトが参考になります。

Linked Data作成チュートリアル ~ 1. TDBの利用 ~

では実際にLinked Dataを作成して行きましょう。今回は軽量なRDFデータストアであるTDBを利用することにします。

実習環境について

今回の実習では全ての操作をコマンドラインから行います。Windowsユーザの方はCygwinを利用するか、VMでBashの使えるOSを用意してください。Mac / Linuxユーザの方はデフォルトのコンソールを利用すれば大丈夫です。

TDBのインストール

Windowsの場合

まずはTDBをダウンロードしましょう。TDBはApache Incubatingプロジェクトの一部として提供されています。

jena-tdb-0.9.0-incubating-distribution.zipをダウンロードして解凍しましょう。

Linux / Mac / Cygwinの場合

$ cd /path/to/your/working/directory
$ wget https://repository.apache.org/content/repositories/releases/org/apache/jena/jena-tdb/0.9.0-incubating/jena-tdb-0.9.0-incubating-distribution.zip
$ unzip jena-tdb-0.9.0-incubating-distribution.zip
$ cd jena-tdb-0.9.0-incubating

/usr/local/lib/jena にjenaプロジェクトのシンボリックリンクを作成してもよいでしょう。

$ cd /usr/local/lib
$ ln -s /path/to/jena-tdb-0.9.0-incubating jena

コマンドラインからのTDBの利用

簡単のため、Pathを通しておきましょう。

$ TDBROOT=/path/to/jena-tdb-0.9.0-incubating
$ PATH=$TDBROOT/bin:$PATH

ではさっそく利用してみます。tdbコマンドを実行しましょう。

$ tdb
Usage: /usr/local/lib/jena/bin/tdb classname [args ...]

クラスを指定するように言われます。Pathは正常に通っているようです。

実際にデータベースを作成してみましょう。作業用のディレクトリに移動し、tdbtestディレクトリを作成します。

$ cd /path/to/your/working/directory
$ mkdir tdbtest
$ ls
tdbtest

サンプルのRDFを用意しました。test.rdfという名前で保存し、読み込んでみます。

$ cat test.rdf
<?xml version="1.0"?>

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:test="http://www.keio.ac.jp/test/">

<rdf:Description rdf:about="http://www.yamaguti.comp.ae.keio.ac.jp/">
  <test:title>Yamaguchi Laboratory, Keio University</test:title>
  <test:author>Yamaguchi Laboratory</test:author>
</rdf:Description>

</rdf:RDF>

$ tdbloader --loc=tdbtest test.rdf
-- Start triples data phase
** Load empty triples table
Load: test.rdf -- 2012/03/22 20:32:21 JST
-- Finish triples data phase
2 triples loaded in 0.17 seconds [Rate: 11.98 per second]
-- Start triples index phase
** Index SPO->POS: 2 slots indexed
** Index SPO->OSP: 2 slots indexed
-- Finish triples index phase
** 2 triples indexed in 0.00 seconds [Rate: 2,000.00 per second]
-- Finish triples load
** Completed: 2 triples loaded in 0.18 seconds [Rate: 10.93 per second]

これにより、tdbtestディレクトリにRDFが読み込まれました。しかし、ただRDFが読み込まれだわけではなく、RDFストアが作成されています。

$ ls tdbtest
GOSP.dat      GPOS.idn      OSP.dat       OSPG.idn      POSG.dat      SPO.idn       journal.jrnl  nodes.dat     prefixIdx.dat
GOSP.idn      GSPO.dat      OSP.idn       POS.dat       POSG.idn      SPOG.dat      node2id.dat   prefix2id.dat prefixIdx.idn
GPOS.dat      GSPO.idn      OSPG.dat      POS.idn       SPO.dat       SPOG.idn      node2id.idn   prefix2id.idn prefixes.dat

では先程読み込んだtest.rdfに関する情報を取り出してみましょう。

$ tdbquery --loc=tdbtest "SELECT ?website WHERE {?website <http://www.keio.ac.jp/test/title> 'hoge'}"
-----------
| website |
===========
-----------

タイトルがhogeのWebサイトを取得しようとしましたが取得できませんでした。挿入したtest.rdfにはタイトルをYamaguchi Laboratory, Keio Universityと設定していました。もう一度クエリを投げてみましょう。

$ tdbquery --loc=tdbtest "SELECT ?website WHERE {?website <http://www.keio.ac.jp/test/title> 'Yamaguchi Laboratory, Keio University'}"
---------------------------------------------
| website                                   |
=============================================
| <http://www.yamaguti.comp.ae.keio.ac.jp/> |
---------------------------------------------

予想通りクエリが実行され、Webサイトのインスタンスを取得することが出来ました。http://www.yamaguti.comp.ae.keio.ac.jp/というのはWebサイトのURIです。

挿入した全てのデータを表示するにはtdbdumpを利用します。

$ tdbdump --loc=tdbtest
<http://www.yamaguti.comp.ae.keio.ac.jp/> <http://www.keio.ac.jp/test/title> "Yamaguchi Laboratory, Keio University" .
<http://www.yamaguti.comp.ae.keio.ac.jp/> <http://www.keio.ac.jp/test/author> "Yamaguchi Laboratory" .

これでひと通りのtdbの挙動をつかむことができたと思います。

このチュートリアルでまだやっていないこと

  • SPARQLファイルを個別に書いてqueryを実行する
  • TDBにいれたデータをSPARQLエンドポイントとして公開する
  • データの更新。updateクエリ。
  • 挿入したデータの削除

参考にした資料

Linked Data作成チュートリアル ~ 2. SPARQLを効果的に利用する ~

1つ目のチュートリアルではTDBの導入と、簡単なデータの挿入を試しました。では、より実践に近い形でTDBを利用していきましょう。

新しく別のデータベースを作成することにします。今回はProtegeを利用して素となるRDFを作成してみます。今回のチュートリアル用に作成したオントロジーの仕様は以下のとおりです。

  • ベースとなる名前空間URI: http://www.yamaguti.ae.keio.ac.jp/tutorial2#
  • クラスとして大学、生徒、教授、場所を作成
  • それらのインスタンスを適宜作成
  • プロパティとして、通う、キャンパスを持っている、を作成

まず、クラス階層を作成します。Classesタブから以下のように作成しました。

scs1

次にプロパティを作成します。Object Propertiesから作成していきます。

scs2

次にインスタンスについて作成していきましょう。インスタンスについてはIndivisualsタブから作成できます。ここではPlaceに日吉や矢上などの実際の場所のインスタンスを作成しておきました。実際の生徒に関するインスタンスや大学についてなどもここで作成しておきましょう。

scs3

作成したクラスとプロパティはEntitiesタブから一覧できます。

scs4

では作成したオントロジーをRDFとして出力しましょう。File->Save AsからRDF/XMLを選択し、保存します。

scs5

これでRDFを出力することができました。作成されたRDFはtutorial2からダウンロードできます。ではこれをtdbを利用して読み込み、新しいデータベースに挿入してみましょう。

$ tdbloader --loc=tutorial2 tutorial2.rdf
-- Start triples data phase
** Load empty triples table
Load: tutorial2.rdf -- 2012/03/23 14:21:59 JST
-- Finish triples data phase
40 triples loaded in 0.11 seconds [Rate: 363.64 per second]
-- Start triples index phase
** Index SPO->POS: 40 slots indexed in 0.00 seconds [Rate: 10,000.00 per second]
** Index SPO->OSP: 40 slots indexed in 0.00 seconds [Rate: 13,333.33 per second]
-- Finish triples index phase
** 40 triples indexed in 0.01 seconds [Rate: 5,000.00 per second]
-- Finish triples load
** Completed: 40 triples loaded in 0.13 seconds [Rate: 312.50 per second]

無事挿入することが出来ました。試しにクエリを投げてみましょう。今回はSPARQLを別ファイルに保存して実行することにしましょう。

実行しているSPARQLは以下のとおりです。

PREFIX tutorial2: <http://www.yamaguti.comp.ae.keio.ac.jp/tutorial2#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?student
WHERE {
    ?student rdf:type tutorial2:Student.
}

以下のようにしてSPARQLを実行することができます。

$ tdbquery --loc=tutorial2 --file=tutorial2_1.rq
------------------------
| student              |
========================
| tutorial2:Kagawa     |
| tutorial2:Matsushita |
| tutorial2:Suzuki     |
| tutorial2:Tagawa     |
| tutorial2:Tamagawa   |
| tutorial2:Tanaka     |
| tutorial2:Wang       |
------------------------

このクエリでは生徒の一覧を取得しました。想定通りの結果が得られました。ではこのデータベースに生徒のデータを追加してみます。これもSPARQLを利用して行うことができます。

SPARQLを利用したデータ更新及び挿入についてはW3CのSPARQL-Updateに仕様が詳しく記載されています。

このチュートリアルで説明していないこと

演習問題

各自で好きなドメインのデータをデザインし、TDBに格納してください。

結果の生成は以下のようにしましょう。

$ tdbdump --loc=tdbtest >> yourname.wi.n3
$ tdbstat --loc=tdbtest >> yourname.wi.tdbstats
(yournameにはあなたの名前を入れてください。)

生成された2つのファイルを添付し、提出してください。提出の際には、下記についても併記してください。

  • 名前
  • 学年
  • 学籍番号
  • どのようなデータを作成したか

提出方法については授業内で説明します。

Linked Data関連ツール

Linked Dataを構築するためのツールが開発されています。ここではそれらのツール類について紹介します。

RDFライブラリ

Cで書かれた汎用RDFライブラリ。非常に高速なパーサとシリアライザーが実装されています。また、Lua (experimental),Perl,PHP,Python,Rubyへのバインディングも実装されています。(実装の一覧: Redland librdf Language Bindings | http://librdf.org/bindings/

Javaで書かれたRDFライブラリ。フレームワークというだけあって、データベースとの連携やSPARQLなどもサポートされています。

Python用のRDFライブラリ。基本的なグラフ操作,SPARQL等もサポートされています。

Ruby製のRDFライブラリ。rubygemsから利用できるので便利です。

SwishはHaskellで書かれたRDFデータを利用するためのライブラリです。

JavaScriptのためのRDFプロセッサです。RDFの生成及び読み込みが可能です。要jQuery。

RDFバリデータ

RDFが正しい形式かどうかを検証するW3Cが提供しているツールがあります。各自でRDFを生成した場合には、ここで一度検証すると良いです。

RDFの体裁を検証するツールです。W3Cから提供されています。

検証機ではありませんが、RDFのテストケースというものも用意されています。これは、新しいRDFライブラリを開発する場合などに利用されるRDFのテストです。つまりこれらのRDFを正常に解釈できれば、動作の正確性を検証できます。

RDFストア

RDFを格納するためのストレージです。RDFストアも関係データベースなどと同じように、それぞれ特徴が異なります。特徴とあわせて以下にRDFストアを紹介します。

4storeはスケーラブルで安定したRDFデータベースです。15Gトリプル、数千人のユーザがいるアプリケーションで利用された実績があります。

Ontotext社が出しているストレージです。高速な推論エンジンを有しており、スケーラビリティにも優れています。

Franz社が開発しているRDFストレージ。高速に動作するようです。無償版およびアーキテクチャについては以下に説明があります。

基本的にはOWLIMと同様にSesameのようなHTTP(REST)ラッパーが用意されており、ラッパー経由でストレージを利用する形になっています。

TDBとSDBはJenaの利用を前提としたRDFストレージです。TDBは軽量のストレージで、20Mトリプル程度までならある程度非常に高速に動作します。SDBはロードバランシング、セキュリティ、クラスタリング、バックアップそして管理のための機能があります。可用性という面ではSDB, 手軽にストレージを利用したい場合にはTDBという選択になるでしょう。RDFの挿入や更新があるアプリケーションの場合にはSDBを利用したほうが良いです。

Cumulusはクラウドベースのアーキテクチャに置かれることを想定されたRDFストアです。CumulusはRESTベースのAPIを通じて、RDFデータのCRUD(作成、検索、更新、削除)を行うことができます。ストレージのバックエンドとしてApache Cassandoraを利用しています。

Apache Cassandoraの利用によってスケーラビリティと高可用性をパフォーマンスを失うことなく実現することができます。並列処理によって線形にスケールさせることができますし、RDFストレージは今後このような方向に進んでいくと考えられます。

HADOOP上に構築されたRDFストア