29
サーバサイドコース Sinatra + SPARQL 編 ROIS&LODI 加藤文彦 第6回LODチャレンジデー 2013-11-24 1

サーバサイドコース Sinatra + SPARQL 編

Embed Size (px)

DESCRIPTION

2013-11-24 に行われた第6回LODチャレンジデー パートナーリソース活用ハッカソン サーバサイドコースでの資料.

Citation preview

Page 1: サーバサイドコース Sinatra + SPARQL 編

サーバサイドコースSinatra + SPARQL 編

ROIS&LODI 加藤文彦第6回LODチャレンジデー

2013-11-24

1

Page 2: サーバサイドコース Sinatra + SPARQL 編

サンプルコード• https://github.com/fumi/lod2013-examples

• 言語: Ruby + JavaScript• フレームワーク: Sinatra• deployまではやらずにテスト環境だけ•上のサイトを開いて続きはそこで説明

2

Page 3: サーバサイドコース Sinatra + SPARQL 編

ディレクトリ構成src/Gemfile ... 必要なパッケージ指定

Gemfile.lock ... Gemfileから生成されるファイル (依存関係・バージョン固定用)

app.rb ... アプリ本体

public ... 静的ファイル (JS, CSS,画像)

vendor ... インストールしたパッケージ

views ... HTML表示部分

3

Page 4: サーバサイドコース Sinatra + SPARQL 編

Sinatra• 軽量Webフレームワーク

• 1分でWebアプリ

• 他言語でも類似品あり

• http://www.sinatrarb.com/

• サンプル起動でshotgunを使っているのは変更したものを即時反映するため

4

Page 5: サーバサイドコース Sinatra + SPARQL 編

5

Page 6: サーバサイドコース Sinatra + SPARQL 編

6

Page 7: サーバサイドコース Sinatra + SPARQL 編

クエリ言語

• データの検索や操作を行うための言語• データモデルやDBシステムに合わせて設計

• 例: SQL

–データモデル: 関係モデル

–DBシステム: RDBMS

• LOD: RDFモデル(グラフデータモデル)

7

Page 8: サーバサイドコース Sinatra + SPARQL 編

グラフのクエリ

• グラフの最小単位: 3つ組 (トリプル)

• グラフパターン1. 完全一致

• dbp:東京都 dbp-owl:country dbp:日本 .

2. 変数によるパターンマッチ

• dbp:東京都 dbp-owl:country ?country .

3. 1と2の組み合わせ

dbp:東京都 dbp:日本dbpedia-‐owl:country

8

Page 9: サーバサイドコース Sinatra + SPARQL 編

:Amy :Bob :Cathy

:Dan

:Jim

:Ed

:Kate

:Gil

:Flo

:Hal

:Ian

:Lee:May

:like :like

:like

:like :like

:like

:like

:dislike

:dislike

:dislike :dislike

:dislike

:dislike :dislike

:dislike

好き嫌いグラフ

9

Page 10: サーバサイドコース Sinatra + SPARQL 編

:Amy :Bob :Cathy

:Dan

:Jim

:Ed

:Kate

:Gil

:Flo

:Hal

:Ian

:Lee:May

:like :like

:like

:like :like

:like

:like

:dislike

:dislike

:dislike :dislike

:dislike

:dislike :dislike

:dislike

Amyが好きな人グラフパターン:Amy  :like  ?person  .

10

Page 11: サーバサイドコース Sinatra + SPARQL 編

:Amy :Bob :Cathy

:Dan

:Jim

:Ed

:Kate

:Gil

:Flo

:Hal

:Ian

:Lee:May

:like :like

:like

:like :like

:like

:like

:dislike

:dislike

:dislike :dislike

:dislike

:dislike :dislike

:dislike

“Amyが好きな人”が好きな人グラフパターン:Amy  :like  ?person1  .?person1  :like  ?person2  .

11

Page 12: サーバサイドコース Sinatra + SPARQL 編

SPARQL• LOD用クエリ言語

• SQLのような文法

• データモデル: RDF

• プロトコル: HTTP

• W3C仕様

• 2013-03-21に1.1勧告

RDB

Query

DB

ModelRDF Model

SQL

Relational Model

RDF Store

SPARQL

12

Page 13: サーバサイドコース Sinatra + SPARQL 編

SPARQLエンドポイント• SPARQLクエリを受け付ける場所

• SPARQLエンドポイントURI

• プログラムからSPARQLを使うときに指定

• 入力フォームがある場合もあり

• 例: http://ja.dbpedia.org/sparql

13

Page 14: サーバサイドコース Sinatra + SPARQL 編

dbp-‐owl:AdministraHveRegiondbp:サイボーグ009

dbp-‐owl:ComicsCreator

dbp:宮城県

dbp:石ノ森章太郎

rdfs:label

rdf:type

rdfs:label

dbp-‐prop:生年

dbp-‐owl:notableWork

dbp-‐owl:award

dbp-‐owl:birthPlace

rdf:type

サイボーグ009

宮城県 foaf:Person

1938石ノ森章太郎

rdf:type

rdfs:labeldbp:村井嘉浩

dbp-‐owl:leaderName

DBpedia Japaneseのグラフ例

dbp:手塚治虫文化賞

dbp-‐owl:Comics

rdf:type

14

Page 15: サーバサイドコース Sinatra + SPARQL 編

dbp-‐owl:AdministraHveRegiondbp:サイボーグ009

dbp-‐owl:ComicsCreator

dbp:宮城県

dbp:石ノ森章太郎

rdfs:label

rdf:type

rdfs:label

dbp-‐prop:生年

dbp-‐owl:notableWork

dbp-‐owl:award

dbp-‐owl:birthPlace

rdf:type

サイボーグ009

宮城県 foaf:Person

1938石ノ森章太郎

rdf:type

rdfs:labeldbp:村井嘉浩

dbp-‐owl:leaderName

dbp:手塚治虫文化賞

dbp-‐owl:Comics

rdf:type

クエリ:  石ノ森章太郎の出身地PREFIX  dbp:  <hVp://ja.dbpedia.org/resource/>PREFIX  dbp-‐owl:  <hVp://dbpedia.org/ontology/>

SELECT  ?birthPlaceWHERE  {    dbp:石ノ森章太郎  dbp-‐owl:birthPlace  ?birthPlace  .

}

15

Page 16: サーバサイドコース Sinatra + SPARQL 編

16

Page 17: サーバサイドコース Sinatra + SPARQL 編

• SELECT:  取得したい変数を指定• SELECT  *  は全ての変数指定と同等• 結果形式:  XML,  JSON,  CSV,  TSV,  ...

• WHERE:    {}内にグラフパターンの組み合わせを記述• LIMIT:    件数の制限• 100だと1-‐100まで取得• LIMITがない場合は全件取得• 量が多い場合はサーバに負荷をかけるので注意

• PREFIX:    URIを短縮して記述するための仕組み• dbp:東京都  =  <hVp://ja.dbpedia.org/resource/東京都>

PREFIX  dbp:  <hVp://ja.dbpedia.org/resource/>PREFIX  dbp-‐owl:  <hVp://dbpedia.org/ontology/>

SELECT  ?birthPlaceWHERE  {    dbp:石ノ森章太郎  dbp-‐owl:birthPlace  ?birthPlace  .

}

17

Page 18: サーバサイドコース Sinatra + SPARQL 編

dbp-‐owl:AdministraHveRegiondbp:サイボーグ009

dbp-‐owl:ComicsCreator

dbp:宮城県

dbp:石ノ森章太郎

rdfs:label

rdf:type

rdfs:label

dbp-‐prop:生年

dbp-‐owl:notableWork

dbp-‐owl:award

dbp-‐owl:birthPlace

rdf:type

サイボーグ009

宮城県 foaf:Person

1938石ノ森章太郎

rdf:type

rdfs:labeldbp:村井嘉浩

dbp-‐owl:leaderName

dbp:手塚治虫文化賞

dbp-‐owl:Comics

rdf:type

クエリ:  手塚治虫文化賞を受賞した漫画家PREFIX  dbp:  <hVp://ja.dbpedia.org/resource/>PREFIX  dbp-‐owl:  <hVp://dbpedia.org/ontology/>

SELECT  ?creatorWHERE  {    ?creator  rdf:type  dbp-‐owl:ComicsCreator  ;        dbp-‐owl:award  dbp:手塚治虫文化賞  .

}

18

Page 19: サーバサイドコース Sinatra + SPARQL 編

19

Page 20: サーバサイドコース Sinatra + SPARQL 編

dbp-‐owl:AdministraHveRegiondbp:サイボーグ009

dbp-‐owl:ComicsCreator

dbp:宮城県

dbp:石ノ森章太郎

rdfs:label

rdf:type

rdfs:label

dbp-‐prop:生年

dbp-‐owl:notableWork

dbp-‐owl:award

dbp-‐owl:birthPlace

rdf:type

サイボーグ009

宮城県 foaf:Person

1938

rdf:type

rdfs:labeldbp:村井嘉浩

dbp-‐owl:leaderName

dbp:手塚治虫文化賞

dbp-‐owl:Comics

rdf:type

クエリ:  手塚治虫文化賞を受賞した漫画家の代表的な漫画PREFIX  dbp:  <hVp://ja.dbpedia.org/resource/>PREFIX  dbp-‐owl:  <hVp://dbpedia.org/ontology/>

SELECT  ?creatorName  ?comicNameWHERE  {    ?creator  a  dbp-‐owl:ComicsCreator  ;  dbp-‐owl:award  dbp:手塚治虫文化賞  ;

         dbp-‐owl:notableWork  ?comic  ;  rdfs:label  ?creatorName  .    ?comic  a  dbp-‐owl:Comics  ;  rdfs:label  ?comicName  .}

石ノ森章太郎

20

Page 21: サーバサイドコース Sinatra + SPARQL 編

21

Page 22: サーバサイドコース Sinatra + SPARQL 編

SPARQL 1.0• データ取得

• SELECT

• ASK

• DESCRIBE

• CONSTRUCT

• ほぼどこでも使える

22

Page 23: サーバサイドコース Sinatra + SPARQL 編

SPARQL 1.1• データ管理

• 作成・更新・削除用句

• INSERT, UPDATE, DELETE, LOAD, DROP

• サービス記述

• Graph Store HTTP Protocol

• 結果形式の追加: JSON, CSV, TSV

• 様々な追加機能

• プロパティパス,集約,条件,数値関数,文字列関数,サブクエリ,Federatedクエリなど

• 実装の差

• 最新の実装だと大分カバーされている

• 実働中のエンドポイントは差あり

• 特にFederatedクエリやBINDあたりは使えないところも多い

23

Page 24: サーバサイドコース Sinatra + SPARQL 編

集約• COUNT: 個数

• SUM: 合計

• AVG: 平均

• MIN: 最小値

• MAX: 最大値

• GROUP BY:

24

Page 25: サーバサイドコース Sinatra + SPARQL 編

COUNT

例)  森薫リソースのオブジェクトの数

SELECT  (COUNT(?o)  AS  ?count)WHERE  {    <hVp://dbpedia.org/resource/Kaoru_Mori>  ?p  ?o  .}

25

Page 26: サーバサイドコース Sinatra + SPARQL 編

GROUP BY例)  クラス毎のインスタンスの数上位100件を降順

SELECT  ?class  (COUNT(?instance)  AS  ?noOfInstances)WHERE  {      ?instance  a  ?class  .}GROUP  BY  ?classORDER  BY  DESC(?noOfInstances)LIMIT  100

26

Page 27: サーバサイドコース Sinatra + SPARQL 編

SPARQLクライアントライブラリ

• Ruby: sparql-client

• Python: SPARQLWrapper

• Java: ARQ

• C: Rasqal

• R: SPARQL

• Haskell: hsparql

• 等々

• http://linkeddata.jp/wiki/ツール

• http://www.w3.org/wiki/SparqlImplementations

27

Page 28: サーバサイドコース Sinatra + SPARQL 編

Leaflet

• サービス非依存のJS地図ライブラリ

• OpenStreetMapも地理院地図もこれで利用可能

• http://leafletjs.com

28

Page 29: サーバサイドコース Sinatra + SPARQL 編

Sgvizler• JavaScriptのSPARQL可視化ライブラリ• https://code.google.com/p/sgvizler/

• 主にGoogle Visualization API• 使い方• div要素に埋め込む• 直接Javascriptを書く • クエリフォームから入力する

29