比較的簡単にDBpediaのようにLinked Open Data(LOD)を公開する方法

# DBpediaとは

Linked Open Data(LOD)としてデータ公開する最も有名なサイトのひとつに[DBpedia](http://ja.dbpedia.org/)があります。
DBpedia では、Wikipediaの記事の一部をRDF化して提供しています。[コンテントネゴシエーション](https://httpd.apache.org/docs/current/ja/content-negotiation.html)によりリクエストにあわせたファイルフォーマットでデータを取得できます。

![DBpediaの仕組み](https://qiita-image-store.s3.amazonaws.com/0/62575/4fcb7594-9910-40c4-0ec0-fe23cc855b7e.png)
※ <http://wiki.dbpedia.org/about/about-dbpedia/architecture> より引用

例えば、[ja.dbpedia:東京駅](http://ja.dbpedia.org/page/%E6%9D%B1%E4%BA%AC%E9%83%BD)をブラウザで開くと東京に関する情報をWebページとして閲覧できますが、ここに掲載されているデータをXMLやJSONでほしい場合、リクエストヘッダーにその要求を記述すれば取得できるようになっています。

![コンテントネゴシエーション](https://qiita-image-store.s3.amazonaws.com/0/62575/af8e26f6-41a0-e794-ef28-2d980afb9e40.jpeg)
※ コンテントネゴシエーションにより、HTMLを取得する例。<http://www.slideshare.net/fumihiro/20140904-bodik> より引用

# Simple LODI

今までDBpediaのような仕組みで公開する場合、自前のデータベースを作成しなければいけなかったりと若干難しい部分がありました。そこで、RDF記述言語の一種である[Turtle](http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/REC-turtle-20140225.html)ファイルを作成すればDBpediaのようにRDFデータをHTMLだけでなくXMLやJSONで取得できるサイトを作れるPHPプログラムを作りました。

[Simple LODI: Simple Linked Open Data Interface](https://github.com/uedayou/simplelodi)

以下が、設置例になります。

<http://uedayou.net/simplelodi/uedayou>

これは、

    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix foaf: <http://xmlns.com/foaf/0.1/> .
    
    <http://uedayou.net/simplelodi/uedayou>
        a foaf:Person ;
        foaf:mbox <mailto:yooueda@gmail.com> ;
        foaf:homepage <http://uedayou.net/> ;
        foaf:name "Hiroshi Ueda" .
<https://github.com/uedayou/simplelodi/blob/master/data/uedayou.ttl>

このTurtleのデータを表示した例になります。Webブラウザで開くと、表形式でデータが表示されます。

これを例えば、cURL などで、以下のようにリクエストを投げると

`$ curl -H "Accept: application/rdf+xml" http://uedayou.net/simplelodi/uedayou`

XML形式でデータが返ってきます。

    <?xml version="1.0" encoding="utf-8" ?>
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:foaf="http://xmlns.com/foaf/0.1/">
    
      <foaf:Person rdf:about="http://uedayou.net/simplelodi/uedayou">
        <foaf:mbox rdf:resource="mailto:yooueda@gmail.com"/>
        <foaf:homepage rdf:resource="http://uedayou.net/"/>
        <foaf:name>Hiroshi Ueda</foaf:name>
        <foaf:Image rdf:resource="http://uedayou.net/uedayou.jpg"/>
      </foaf:Person>

    </rdf:RDF>

N-Triples だと
`$ curl -H "Accept: application/n-triples" http://uedayou.net/simplelodi/uedayou`
JSON-LD だと
`$ curl -H "Accept: application/ld+json" http://uedayou.net/simplelodi/uedayou`
のようになります。

コンテントネゴシエーション以外にも、ファイル拡張子を変更することで同様のデータを手軽に取得できるようにもなっています。

Turtle
<http://uedayou.net/simplelodi/uedayou.ttl>
XML
<http://uedayou.net/simplelodi/uedayou.xml>
JSON-LD
<http://uedayou.net/simplelodi/uedayou.jsonld>
N-Triples
<http://uedayou.net/simplelodi/uedayou.nt>

# 設置方法

以下の手順により設置できます。PHPは5.4以上をインストールしてください。また、.htaccessでmod_rewrite が使えるようにしてください。

+ simplelodi フォルダをWebサーバ上の任意の場所にコピーしてください。
+ simplelodi フォルダをリネームしてください(たとえば、resource など)
+ data フォルダに　サンプルファイル(data/uedayou.ttl)を参考にTurtle ファイルを作成し、コピーしてください。
+ `http:// ... /resource/[拡張子を省略したファイル名]` をブラウザで開くと、HTMLが表示されます。  
※ たとえば uedayou.ttl の場合は、 `http:// ... /resource/uedayou` となります
+ 対応する拡張子(対応フォーマット節　参照)をつけると、出力フォーマットを変更できます。

※ <https://github.com/uedayou/simplelodi> より

# Linked Dataとして公開するためのTurtleファイル作成方法

[Simple LODI](https://github.com/uedayou/simplelodi) で使用するTurtleファイルの作成方法によっては、[Linked Data](https://ja.wikipedia.org/wiki/Linked_Open_Data)とすることもできます。

Turtleファイル自体のURIと実際にアクセスできるURLを同じにすれば Linked Data として公開できます。Turtleファイルのライセンスが[CC BY](https://creativecommons.org/licenses/by/4.0/deed.ja)、[CC BY-SA](https://creativecommons.org/licenses/by-sa/4.0/deed.ja)などオープンライセンスなら、Linked Open Dataになります。

    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix foaf: <http://xmlns.com/foaf/0.1/> .
    
    <http://uedayou.net/simplelodi/uedayou>
        a foaf:Person ;
        foaf:mbox <mailto:yooueda@gmail.com> ;
        foaf:homepage <http://uedayou.net/> ;
        foaf:name "Hiroshi Ueda" .

例えば、上記サンプルデータのURIは`<http://uedayou.net/simplelodi/uedayou>`なので、<http://uedayou.net/simplelodi/uedayou> のURLでアクセスできればLinked Dataです。
そのために、`uedayou.net`の部分は自分が管理できる(持っている)ドメインである必要があり、そのドメインがアクセスできるサーバの公開領域に simplelodi フォルダをコピーする必要があります。

まとめると
(1) サーバに simplelodi フォルダをコピーする。simplelodiはリネームしてください。
(2) simplelodi/data/ フォルダの中に Turtleファイルを .ttl 拡張子に変更してコピーする。
(3) コピーするTurtle ファイル自体のURI を 

`http://[サーバのドメイン]/[simplelodiフォルダの名前]/[(2)の拡張子なしファイル名]`

にする。

なお、上記のデータのファイル名は uedayou.ttl ですが、Simple LODI では、.ttlの部分は省略されます。
また、data フォルダの中のデータは実際にはひとつ上の階層
(例では、`http://uedayou.net/simplelodi/data/uedayou`ではなく `http://uedayou.net/simplelodi/uedayou`)
でアクセスできます。