Upload
fumihiro-kato
View
1.788
Download
2
Embed Size (px)
DESCRIPTION
2013-11-24 に行われた第6回LODチャレンジデー パートナーリソース活用ハッカソン サーバサイドコースでの資料.
Citation preview
サーバサイドコースSinatra + SPARQL 編
ROIS&LODI 加藤文彦第6回LODチャレンジデー
2013-11-24
1
サンプルコード• https://github.com/fumi/lod2013-examples
• 言語: Ruby + JavaScript• フレームワーク: Sinatra• deployまではやらずにテスト環境だけ•上のサイトを開いて続きはそこで説明
2
ディレクトリ構成src/Gemfile ... 必要なパッケージ指定
Gemfile.lock ... Gemfileから生成されるファイル (依存関係・バージョン固定用)
app.rb ... アプリ本体
public ... 静的ファイル (JS, CSS,画像)
vendor ... インストールしたパッケージ
views ... HTML表示部分
3
Sinatra• 軽量Webフレームワーク
• 1分でWebアプリ
• 他言語でも類似品あり
• http://www.sinatrarb.com/
• サンプル起動でshotgunを使っているのは変更したものを即時反映するため
4
5
6
クエリ言語
• データの検索や操作を行うための言語• データモデルやDBシステムに合わせて設計
• 例: SQL
–データモデル: 関係モデル
–DBシステム: RDBMS
• LOD: RDFモデル(グラフデータモデル)
7
グラフのクエリ
• グラフの最小単位: 3つ組 (トリプル)
• グラフパターン1. 完全一致
• dbp:東京都 dbp-owl:country dbp:日本 .
2. 変数によるパターンマッチ
• dbp:東京都 dbp-owl:country ?country .
3. 1と2の組み合わせ
dbp:東京都 dbp:日本dbpedia-‐owl:country
8
: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
: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
: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
SPARQL• LOD用クエリ言語
• SQLのような文法
• データモデル: RDF
• プロトコル: HTTP
• W3C仕様
• 2013-03-21に1.1勧告
RDB
Query
DB
ModelRDF Model
SQL
Relational Model
RDF Store
SPARQL
12
SPARQLエンドポイント• SPARQLクエリを受け付ける場所
• SPARQLエンドポイントURI
• プログラムからSPARQLを使うときに指定
• 入力フォームがある場合もあり
• 例: http://ja.dbpedia.org/sparql
13
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
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
16
• 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
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
19
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
21
SPARQL 1.0• データ取得
• SELECT
• ASK
• DESCRIBE
• CONSTRUCT
• ほぼどこでも使える
22
SPARQL 1.1• データ管理
• 作成・更新・削除用句
• INSERT, UPDATE, DELETE, LOAD, DROP
• サービス記述
• Graph Store HTTP Protocol
• 結果形式の追加: JSON, CSV, TSV
• 様々な追加機能
• プロパティパス,集約,条件,数値関数,文字列関数,サブクエリ,Federatedクエリなど
• 実装の差
• 最新の実装だと大分カバーされている
• 実働中のエンドポイントは差あり
• 特にFederatedクエリやBINDあたりは使えないところも多い
23
集約• COUNT: 個数
• SUM: 合計
• AVG: 平均
• MIN: 最小値
• MAX: 最大値
• GROUP BY:
24
COUNT
例) 森薫リソースのオブジェクトの数
SELECT (COUNT(?o) AS ?count)WHERE { <hVp://dbpedia.org/resource/Kaoru_Mori> ?p ?o .}
25
GROUP BY例) クラス毎のインスタンスの数上位100件を降順
SELECT ?class (COUNT(?instance) AS ?noOfInstances)WHERE { ?instance a ?class .}GROUP BY ?classORDER BY DESC(?noOfInstances)LIMIT 100
26
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
Leaflet
• サービス非依存のJS地図ライブラリ
• OpenStreetMapも地理院地図もこれで利用可能
• http://leafletjs.com
28
Sgvizler• JavaScriptのSPARQL可視化ライブラリ• https://code.google.com/p/sgvizler/
• 主にGoogle Visualization API• 使い方• div要素に埋め込む• 直接Javascriptを書く • クエリフォームから入力する
29