Upload
taku-yamaguchi
View
3.835
Download
0
Embed Size (px)
DESCRIPTION
Citation preview
SPARQLから入門する Linked Open Data(LOD)ハンズオン
-‐ Pinpoint ReminderによるLODアプリ構築 -‐
山口琢(D3)@高橋修研究室
はこだて未来大
v1.0、2013-‐04-‐25
2013-‐04-‐25 1
このハンズオンの目的・狙い
• LODの利用方法・アプリを具体的にイメージできる
• LODデータを設計できる
参考: 山口の狙い – LODアプリの多様性: どんなアプリが考えられるのか
– LODアプリ開発環境への要求仕様
2013-‐04-‐25 2
Agenda
1. イントロ -‐ Linked Open Data(LOD)とは -‐ 2. SPARQLでLODを使ってみよう ← 今日は、ここまでは是非 3. Pinpoint Reminder -‐ LODアプリの例 -‐ 4. Pinpoint Reminderのハブを作ってみよう
次回、次々回、…があれば: – 「はこだてMap+」の仕組み・設計 by 観光系の誰か
– 発表(ライトニングトーク、3分/人) by みんな • 20人 x 3分/人 = 1時間!
– 適用分野の観点で、個別・詳細トピック
• 開発ドキュメント管理: 要求 -‐ 仕様 -‐ …
• 地理情報: 地理的近さ、Geohash、…
– 開発の観点で、個別・詳細トピック パーセントエンコーディング、IRI、処理方式・性能、…
2013-‐04-‐25 3
用意するもの
• ネットにつながるPC • Webブラウザー: Firefox、Chrome、IE、Opera、…
– Chromeもあればベター、Pinpoint Reminder拡張機能をインストールできるので。 • 今日は、そこまでいかない…
…未来大ではIEユーザーをあまり見かけないが、それは特殊な状況だということを覚えておこう。
• テキスト編集ができるエディター – 一括置換、エンコーディング、文字コードを扱えるとベター
2013-‐04-‐25 4
あると/できると/知ってると便利
• パーセントエンコーディング(URLエンコード)を、エンコード/デコードするツール
• ブラウザーのネットワーク要求・応答をモニターするツール – Firefox: 開発ツール、Firebug
– Chrome: Developer Tools
• JSONを整形(pre\y print)するツール (などなど…)
2013-‐04-‐25 5
パーセントエンコーディング やってみよう
• パーセントエンコード/デコードできるツール – Webサイト – そのツールページのエンコーディングは?
• Unicodeになってるツールを選ぶ。Shi^-‐JISはNG。
• Wikipediaで「函館」の項目を表示 – ブラウザのURL欄は、こう見える h\p://ja.wikipedia.org/wiki/函館
– でも、コピーしてテキストエディターに貼り付けると… h\p://ja.wikipedia.org/wiki/%E5%87%BD%E9%A4%A8
– 「%E5%87%BD%E9%A4%A8」は、「函館」をパーセントエンコードしたもの • ツールでデコードして、「函館」になることを確かめよう
2013-‐04-‐25 6
イントロ
Linked Open Data(LOD)とは
2013-‐04-‐25 7
Linked Open Data(LOD) あるデータがあります。それは… • オープンデータ(Open Data)だ。オープンデータとは? • インターフェースがWebに公開されている。
– インターフェース = URL + 問合せ(クエリ)言語。データを取得するには、URLに問い合わせる。
– URL: エンドポイント
– 問合せ内容を記述する言語: SPARQL(スパークル)
• 「リンク」が設定されている(Linked)。 – 「リンクが設定されてるって、なにそれ?」
– それを分かることがこのゼミの目標。
ハンズオン: 百聞は一見にしかず – SPARQLを使ってエンドポイントからLODにアクセス
– 「リンク」を体感
– 開発者向け、not エンドユーザー向け
2013-‐04-‐25 8
参考資料
セマンティック HTML/XHTML – 神崎正英さん
– 毎日コミュニケーションズ
– 未来大の情報ライブラリーにもある。
– SPARQLは、後半のp.346から。「いきなり、ここから入ろう」というのが、今回のハンズオン。
2013-‐04-‐25 9
SPARQLでLODを使ってみよう
2013-‐04-‐25 10
エンドポイント
1. DBpedia Japanese h\p://ja.dbpedia.org/sparql DBpedia Japanese by DBpedia Community
2. 函館○○情報 h\p://210.226.0.93/sparql/
函館まちあるきマップ by 函館市; はこだてフィルムコミッション by 函館市; 函館近代化遺産ポータルサイト by 函館高専、ノース技研
運営 by はこだて未来大学 高度ICT演習観光系プロジェクト?
3. DBpedia h\p://dbpedia.org/sparql
2013-‐04-‐25 11
SPARQLで「函館○○情報」を使ってみよう
2013-‐04-‐25 12
函館○○情報
たどり着いてみよう 1. LODチャレンジ2012
h\p://lod.sfc.keio.ac.jp/challenge2012/index.html
2. エントリー / データセット部門 3. d055 函館まちあるきルート情報
4. データセットのURL h\p://210.226.0.93/status/
5. Execute a test query h\p://210.226.0.93/test/
2013-‐04-‐25 13
SPARQLで書かれた問合せ(クエリ)
• SPARQLで書かれた問合せ PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT * WHERE { ?s ?p ?o . } LIMIT 10
• 実行「Execute」してみる…! – ブラウザに表示される
– or ダウンロードが始まる ← テキストエディターで開く
2013-‐04-‐25 14
問合せ結果
<?xml version="1.0"?> <sparql xmlns="h\p://www.w3.org/2005/sparql-‐results#"> <head> <variable name="s"/> <variable name="p"/> <variable name="o"/> </head> <results> <result> <binding name="s"><uri>urn:日本最古のコンクリート電柱</uri></binding> <binding name="p"><uri>h\p://purl.org/dc/elements/1.1/date</uri></binding> <binding name="o"><literal>1923</literal></binding> </result> <result> <binding name="s"><uri>urn:旧戸井線</uri></binding> <binding name="p"><uri>h\p://schema.org/image</uri></binding> <binding name="o"><literal>h\p://u.jimdo.com/www19/o/s8a796cc0310d2bed/img/i9a4c6cff5aae4279/1338284028/thumb/image.jpg</literal></binding> </result> … </results> </sparql>
2013-‐04-‐25 15
解釈
「urn:日本最古のコンクリート電柱」の 「h\p://purl.org/dc/elements/1.1/date」は 「1923」です。
– urn:日本最古のコンクリート電柱 • 主語、Subject
– h\p://purl.org/dc/elements/1.1/date • 述語、Predicate
• Dublin Coreという語彙での「日付」
– 1923 • 目的語、Object。これを目的語と呼ぶ。
• 1923
「urn:日本最古のコンクリート電柱」の「日付」は「1923」です。
2013-‐04-‐25 16
?s ?p ?o .
• 変数
• s、p、oの文字列は、何でもよい。順番・位置に意味がある。
2013-‐04-‐25 17
トライ!
PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT * WHERE { ?s ?p ?A . } LIMIT 10
2013-‐04-‐25 18
?o → ?A
結果
<?xml version="1.0"?> <sparql xmlns="h\p://www.w3.org/2005/sparql-‐results#"> <head> <variable name="s"/> <variable name="p"/> <variable name="A"/> </head> <results> <result> <binding name="s"><uri>urn:日本最古のコンクリート電柱</uri></binding> <binding name="p"><uri>h\p://purl.org/dc/elements/1.1/date</uri></binding> <binding name="A"><literal>1923</literal></binding> </result> <result> <binding name="s"><uri>urn:旧戸井線</uri></binding> <binding name="p"><uri>h\p://schema.org/image</uri></binding> <binding name="A"><literal>h\p://u.jimdo.com/www19/o/s8a796cc0310d2bed/img/i9a4c6cff5aae4279/1338284028/thumb/image.jpg</literal></binding> </result> … </results> </sparql>
2013-‐04-‐25 19
トライ!
PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT ?o WHERE { ?s ?p ?o . } LIMIT 10
2013-‐04-‐25 20
* → ?o
トライ!
PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT * WHERE { <urn:日本最古のコンクリート電柱> ?p ?o . } LIMIT 10
2013-‐04-‐25 21
?s → urn:日本最古のコンクリート電柱
トライ!
PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT ?o WHERE { ?s <h\p://schema.org/url> ?o . } LIMIT 10
2013-‐04-‐25 22
?p → <h\p://schema.org/url>
トライ!
PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT * WHERE { ?s ?p "1923" . } LIMIT 10
2013-‐04-‐25 23
?o → "1923"
文法
PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT ?s WHERE { ?s ?p "1923" . } LIMIT 10
2013-‐04-‐25 24
WHERE { … } …というパターンに当てはまる
?s(主語)、?p(述語)、?o(目的語)の組から
?s 変数?sを
SELECT 取り出しなさい
絞り込み
PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT * WHERE { ?s <h\p://purl.org/dc/elements/1.1/date> ?o . FILTER ( "1923" <= ?o ) } LIMIT 10
2013-‐04-‐25 25
?oが"1923"より大きい
トライ!
「函館○○情報」データセットから 「恵山山頂」よりも「北」にあるものをリストアップ
2013-‐04-‐25 26
問合せ例 #1
1. とにかく情報をたくさん取り出して、
2. 「恵山山頂」の情報を手作業で探し出して、
3. 「恵山山頂」緯度をゲットしてから、
4. クエリを書く
2013-‐04-‐25 27
問合せ例 #1 1. とにかく情報をたくさん…
• クエリ PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT * WHERE { ?s ?p ?o . } LIMIT 500
2013-‐04-‐25 28
問合せ例 #1 2. 「恵山山頂」の情報を…
… <result> <binding name="s"><uri>urn:新島橋_13</uri></binding> <binding name="p"><uri>h\p://www.w3.org/2003/01/geo/wgs84_pos#lat</uri></binding> <binding name="o"><literal>41.769647</literal></binding> </result> <result> <binding name="s"><uri>urn:恵山山頂_20</uri></binding> <binding name="p"><uri>h\p://www.w3.org/2003/01/geo/wgs84_pos#lat</uri></binding> <binding name="o"><literal>41.810507498395</literal></binding> </result> <result> <binding name="s"><uri>urn:函館漁港船入澗防波堤</uri></binding> <binding name="p"><uri>h\p://www.w3.org/2003/01/geo/wgs84_pos#lat</uri></binding> <binding name="o"><literal>41.7732320517</literal></binding> </result> …
2013-‐04-‐25 29
問合せ例 #1 3. 「恵山山頂」緯度を…
「h\p://www.w3.org/2003/01/geo/wgs84_pos#lat」が緯度
… <result> <binding name="s"><uri>urn:新島橋_13</uri></binding> <binding name="p"><uri>h\p://www.w3.org/2003/01/geo/wgs84_pos#lat</uri></binding> <binding name="o"><literal>41.769647</literal></binding> </result> <result> <binding name="s"><uri>urn:恵山山頂_20</uri></binding> <binding name="p"><uri>h\p://www.w3.org/2003/01/geo/wgs84_pos#lat</uri></binding> <binding name="o"><literal>41.810507498395</literal></binding> </result> <result> <binding name="s"><uri>urn:函館漁港船入澗防波堤</uri></binding> <binding name="p"><uri>h\p://www.w3.org/2003/01/geo/wgs84_pos#lat</uri></binding> <binding name="o"><literal>41.7732320517</literal></binding> </result> …
2013-‐04-‐25 30
問合せ例 #1 4.クエリを書く
?
2013-‐04-‐25 31
問合せ例 #1 4.クエリを書く
PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT * WHERE { ?s <h\p://www.w3.org/2003/01/geo/wgs84_pos#lat> ?o . filter ( "41.810507498395" < ?o ) } LIMIT 250
2013-‐04-‐25 32
問合せ例 #1 3. 「恵山山頂」緯度を…
ところで、
h\p://www.w3.org/2003/01/geo/wgs84_pos#lat が緯度
↑
って、なぜ分かるの?
2013-‐04-‐25 33
問合せ例 #1ができたら…
別の書き方を考えてください
2013-‐04-‐25 34
問合せ例 #2
?
2013-‐04-‐25 35
問合せ例 #2
PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT ?s ?q WHERE { <urn:恵山山頂_20> <h\p://www.w3.org/2003/01/geo/wgs84_pos#lat> ?q . ?s <h\p://www.w3.org/2003/01/geo/wgs84_pos#lat> ?q . filter (?q < ?o) } LIMIT 250
2013-‐04-‐25 36
#1と#2の違い
地殻変動で恵山の緯度が変わった後… • #1
filter ( "41.810507498395" < ?o ) – 緯度の値がベタに書かれている。 – クエリを書き直さなくてはならない。
• #2 <urn:恵山山頂_20> <h\p://www.w3.org/2003/01/geo/wgs84_pos#lat> ?q . filter (?q < ?o) – 緯度の値を「函館○○情報」から取得している。 – 「函館○○情報」が更新されていれば、 – クエリを書き直さなくてよい。
2013-‐04-‐25 37
問合せ例 #3
PREFIX rdf: <h\p://www.w3.org/1999/02/22-‐rdf-‐syntax-‐ns#> PREFIX rdfs: <h\p://www.w3.org/2000/01/rdf-‐schema#> SELECT ?s ?q WHERE { ?e <h\p://www.w3.org/2003/01/geo/wgs84_pos#lat> ?o . ?s <h\p://www.w3.org/2003/01/geo/wgs84_pos#lat> ?q . filter ( ?o < ?q ) filter ( regex(str(?e), "恵山山頂", "i") ) } LIMIT 250
PS: – "i"は不要
– disznct ?s ?qがベター
…
2013-‐04-‐25 38
#1、#2と#3の違いは?
?
2013-‐04-‐25 39
SQL知ってる人 (^-‐^)/
たいていは、 「SPARQLはSQLに似てます。…以上っ!」
と説明されます。
2013-‐04-‐25 40
体験したこと…
• SPARQLを書いてみた。 • SPARQLで、情報を取り出してみた。…悩んだ。
– 大丈夫、みんな悩んでます。
– 自分がLODデータを公開したら、世界の開発者が、自分のデータに対して、同じように悩むのです。
2013-‐04-‐25 41
つづく
2013-‐04-‐25 42