sparqlから入門するlinked open data(lod)ハンズオン 第2回
TRANSCRIPT
Linked Open Data(LOD)ハンズオン -‐ Pinpoint ReminderによるLODアプリ構築 -‐
第2回
山口琢(D3)@高橋修研究室
はこだて未来大
v1.1、2013-‐05-‐09
2013-‐05-‐09 1
前回までのLODハンズオン
• 「函館○○情報」にSPARQLで問い合わせてみた – hCp://210.226.0.93/sparql/ – Webページのフォームから人がクエリーを入力すると、
結果がHTMLで表示された。
• SPARQLで情報を取り出す – 必要な知識
• SPARQLの文法などなど
• データセットの知識
– 自分がLODデータを公開したら、世界の開発者が、自分のデータに対して、同じように悩むのです。 ↑ これ大事
2013-‐05-‐09 2
今回は
• プログラムから問い合わせる – プログラムからSPARQLで問い合わせる… …ときにやることを、手作業で体験
– URL合成、パーセントエンコード、JSON、変数(入力をクエリーに埋め込む、出力JSONから値を取り出す)
• Pinpoint Reminder概要 – LODアプリの例
– Pinpoint ReminderにおけるSPARQL ← ここまでは
• Pinpoint Reminderのハブを作ってみよう
2013-‐05-‐09 3
次回、次々回、…があれば:
• 「はこだてMap+」の仕組み・設計 by 観光系の誰か • 他のアプリにおけるSPARQL(LOD)利用方法
– ブラウザーのWebアクセスモニター
• 発表(ライトニングトーク、3分/人) by みんな – 20人 x 3分/人 = 1時間!
• 適用分野の観点で、個別・詳細トピック – 開発ドキュメント管理: 要求 -‐ 仕様 -‐ … – 地理情報: 地理的近さ、Geohash、…
• 開発の観点で、個別・詳細トピック パーセントエンコーディング、IRI、処理方式・性能、…
2013-‐05-‐09 4
プログラムから問い合わせる
2013-‐05-‐09 5
DBpedia Japanese
hCp://ja.dbpedia.org/
2013-‐05-‐09 6
エンドポイント: hCp://ja.dbpedia.org/sparql
2013-‐05-‐09 7
クリック!
2013-‐05-‐09 8
select discnct * where { <hCp://ja.dbpedia.org/resource/東京都> ?p ?o . }
<hCp://ja.dbpedia.org/resource/東京都> ?p ?o
hCp://ja.dbpedia.org/resource/東京都が主語になっている…
*
全ての変数の組: ?pと?oを…
discnct
重複しないように…
…取り出しなさい!
問合せ結果のURL
1. コピーしてテキストエディターに貼り付けておく
2. パーセントデコードする
3. デコード結果を、テキストエディターに貼り付ける
2013-‐05-‐09 9
hCp://ja.dbpedia.org/sparql?default-‐graph-‐uri=hCp%3A%2F%2Fja.dbpedia.org&query=select+discnct+*+where+%7B+%3ChCp%3A%2F%2Fja.dbpedia.org%2Fresource%2F%E6%9D%B1%E4%BA%AC%E9%83%BD%3E+%3Fp+%3Fo+.+%7D&format=text%2Fhtml&cmeout=0&debug=on
hCp://ja.dbpedia.org/sparql?default-‐graph-‐uri=hCp%3A%2F%2Fja.dbpedia.org&query=select+discnct+*+where+%7B+%3ChCp%3A%2F%2Fja.dbpedia.org%2Fresource%2F%E6%9D%B1%E4%BA%AC%E9%83%BD%3E+%3Fp+%3Fo+.+%7D&format=text%2Fhtml&cmeout=0&debug=on
↓
hCp://ja.dbpedia.org/sparql?default-‐graph-‐uri=hCp://ja.dbpedia.org&query=select discnct * where { <hCp://ja.dbpedia.org/resource/東京都> ?p ?o . }&format=text/html&cmeout=0&debug=on
2013-‐05-‐09 10
query parameter strings
hCp://ja.dbpedia.org/sparql?default-‐graph-‐uri=hCp://ja.dbpedia.org&query=select discnct * where { <hCp://ja.dbpedia.org/resource/東京都> ?p ?o . }&format=text/html&cmeout=0&debug=on
2013-‐05-‐09 11
query parameter strings
hCp://ja.dbpedia.org/sparql ?default-‐graph-‐uri=hCp://ja.dbpedia.org
&query=select discnct * where { <hCp://ja.dbpedia.org/resource/東京都> ?p ?o . }
&format=text/html
&cmeout=0 &debug=on
2013-‐05-‐09 12
エンドポイント
SPARQLのクエリ
出力(応答)形式
ちなみに、見るだけなら… ネットワークのモニター
• Chrome – 「ツール」-‐「デベロッパー ツール」 → 「Network」
• Firefox – 「ツール」-‐「Web開発」-‐「Firebug」 (インストールしてれば)
• Opera – Dragonfly
2013-‐05-‐09 13
Chrome Developer Tools
2013-‐05-‐09 14
Firefox Firebug
2013-‐05-‐09 15
Opera Dragonfly
2013-‐05-‐09 16
東京都のところを、函館にして…
select discnct * where { <hCp://ja.dbpedia.org/resource/函館> ?p ?o . }
<hCp://ja.dbpedia.org/resource/函館> ?p ?o
hCp://ja.dbpedia.org/resource/函館が主語になっている…
*
全ての変数の組: ?pと?oを…
discnct
重複しないように…
…取り出しなさい!
2013-‐05-‐09 17
フォームを使わずにやってみる
…逆をやってみる
1. SPARQLクエリーを組み立てる
2. クエリーパラメタの値をパーセントエンコードする
3. クエリーパラメタをつなげてURL(の元)を組み立てる
4. URLをブラウザーで開く
2013-‐05-‐09 18
今やったこと
1. 入力: { "東京都", "函館", … }
2. 問合せ – 入力からSPARQLクエリーを組み立てる
– クエリーパラメタの値をパーセントエンコードする
– クエリーパラメタをつなげてURL(の元)を組み立てる
– URLをブラウザーで開く
3. 出力: { p: ○○, o: □□ }という組の一覧を得る
2013-‐05-‐09 19
プログラムがやること
1. 入力: { "東京都", "函館", … }
2. 問合せ – 入力からSPARQLクエリーを組み立てる
– クエリーパラメタの値をパーセントエンコードする
– クエリーパラメタをつなげてURLの元を組み立てる
– URLを開く: f = urlopen(URL, ...)など
– 結果を読み出す: res = f.read()
– 閉じる
3. 出力: { p: ○○, o: △△ }という組の一覧を得る
2013-‐05-‐09 20
query parameter strings
入力変数 = "hCp://ja.dbpedia.org/resource/東京都"
パーセントエンコード前URL = "hCp://ja.dbpedia.org/sparql?default-‐graph-‐uri=hCp://ja.dbpedia.org&query=select discnct * where { <入力変数> ?p ?o . }&format=text/html&cmeout=0&debug=on"
2013-‐05-‐09 21
プログラムで処理しやすい形で 結果をもらう
• JSON • XML
2013-‐05-‐09 22
結果をいつも同じ変数で処理したい
• SPRQLでの変数名はこちらが決められる – さまざまなエンドポイントに、
– それぞれ異なるクエリを投げて、
– 欲しい情報を、同じ変数で取り出すことができる。
2013-‐05-‐09 23
LODアプリの仕組み例
入力 hCp://ja.dbpedia.org/resource/東京都
クエリー select discnct ?o where { <入力> ?p ?o . }
出力 ?o
2013-‐05-‐09 24
入力
hCp://ja.dbpedia.org/resource/香雪園
クエリーのもと
select discnct ?o where { { <入力> ?p <hCp://ja.dbpedia.org/resource/日本国指定名勝の一覧> . <hCp://ja.dbpedia.org/resource/日本国指定名勝の一覧> ?q ?o . } UNION { ?o ?r <hCp://ja.dbpedia.org/resource/日本国指定名勝の一覧> . <hCp://ja.dbpedia.org/resource/日本国指定名勝の一覧> ?t <入力> . } }
出力
?o
2013-‐05-‐09 25
入力
石川啄木
クエリーのもと
PREFIX dcterms:<hCp://purl.org/dc/terms/> PREFIX foaf:<hCp://xmlns.com/foaf/0.1/> select discnct ?o from <hCp://purl.org/net/aozora/resources> where { { # set creator, get other ctles [] dcterms:creator ?creator ; dcterms:ctle [ rdf:value ?o ] . ?creator <hCp://www.w3.org/2000/01/rdf-‐schema#seeAlso> <hCp://ja.dbpedia.org/resource/入力> . } UNION { # set ctle, get creator ?uri dcterms:creator ?creator ; dcterms:ctle [ rdf:value "入力" ] . ?creator <hCp://www.w3.org/2000/01/rdf-‐schema#seeAlso> ?o . } UNION { # set ctle, get other ctles of the same creator ?uri dcterms:creator ?creator ; dcterms:ctle [ rdf:value "入力" ] . ?ctle dcterms:creator ?creator ; dcterms:ctle [ rdf:value ?o ] . } } LIMIT 250
出力
?o
2013-‐05-‐09 26
PINPOINT REMINDER
LODアプリの例
2013-‐05-‐09 27
Pinpoint Reminder
LODアプリ、です。
2013-‐05-‐09 28
PinQAで、「五稜郭」に興味を持った観光客に、 森町の「榎本軍鷲ノ木上陸地」
hCp://pinqa.com/spots/245
2013-‐05-‐09 29
PinQAで「六義園」を見た人に、 「日本の名勝」つながりで、函館の「香雪園」を提示
hCp://pinqa.com/spots/13415
2013-‐05-‐09 30
中島ノブユキのサイトを見た人に、 「八重の桜」つながりで、森町の「榎本軍鷲ノ木上陸跡地」
hCp://www.nobuyukinakajima.com/
2013-‐05-‐09 31
処理の流れ
2013-‐05-‐09 32
選択
ハブ
"香雪園"
"六義園" SPARQL
• DBpedia • 青空文庫
• 青空文庫 Linked Open Data
• ヨコハマ・アートLOD • PinQA • 函館まちあるきルート情報 • 函館映画ロケ地情報 • 函館土木遺産情報
Webページ参照
SPARQL
結果
結果
六義園
香雪園 名勝 巣鴨
香雪園 名勝 巣鴨
(こうではない)
処理の流れ
2013-‐05-‐09 33
選択
ハブ "六義園" SPARQL
• DBpedia • 青空文庫
• 青空文庫 Linked Open Data
• ヨコハマ・アートLOD • PinQA • 函館まちあるきルート情報 • 函館映画ロケ地情報 • 函館土木遺産情報
Webページ参照
SPARQL
結果
結果
六義園
香雪園 名勝 巣鴨
香雪園 名勝 巣鴨
(こうではない)
知識処理っぽいところ
"香雪園"
処理の流れ
2013-‐05-‐09 34
選択
ハブ "六義園" SPARQL
• DBpedia • 青空文庫
• 青空文庫 Linked Open Data
• ヨコハマ・アートLOD • PinQA • 函館まちあるきルート情報 • 函館映画ロケ地情報 • 函館土木遺産情報
Webページ参照
SPARQL
結果
結果
六義園
香雪園 名勝 巣鴨
香雪園 名勝 巣鴨
(こうではない)
リンク処理っぽいところ
"香雪園"
処理の流れ: 2段階
1. 入力: タグなど 2. ハブ(関連展開) – 入力されたタグを、それに関連するリソース群に展開
– SPARQLなどを利用
3. マッチング: SPARQLなど – ハブで展開されたリソース群と、思い出し対象との比較
– SPARQLなどを利用、RSSも読む
4. 出力: Webページ(へのURL)
2013-‐05-‐09 35
システム構成
2013-‐05-‐09 36
登録情報 • WebページのRSS • SPARQLエンドポイント
[ 選択処理 ]
ハブ • WebページのRSS • SPARQLエンドポイント
[ 連想処理 ]
リマインド/推薦
問合せ ハブ • DBpedia • 青空文庫LOD
推薦対象
• 青空文庫 • ヨコハマ・アート • PinQA • 函館まちあるき • 函館映画ロケ地 • 函館土木遺産
SPARQL RSS
SPARQL
Google App Engine Python • etree(XML操作) • …(その他ライブラリー)
Google Chrome JavaScript • jQuery
PINPOINT REMINDERの ハブを作ってみよう
2013-‐05-‐09 37
ハブお試しページ
hCp://pinpoint-‐reminder.appspot.com/remind-‐try リンクされてない隠しページです。
2013-‐05-‐09 38
"%(term)s"などが、 入力"六義園"などと 置き換わることで、 クエリーが組み上がる。
組み上がったクエリーで、エンドポイントに問い合わせる。
2013-‐05-‐09 39
既存のハブを参考にして試す
2013-‐05-‐09 40
すでに登録されているハブを参考に試してみる
%(hub)s変数は使えないので、具体的なIRIに置き換える
{ <%(term_q)s> ?p <%(hub)s> . <%(hub)s> ?q ?o . } ↓ { <%(term_q)s> ?p <hCp://ja.dbpedia.org/resource/東京都> . <hCp://ja.dbpedia.org/resource/東京都> ?q ?o . }
課題
2013-‐05-‐09 41
「オダギリジョー」と「函館」を関連付けてみよう
• 課題: – オダギリジョーと函館の関係を示すSPARQLのクエリ – DBpedia Japaneseに問い合わせる
– これらは何も返ってこない、直接の関係はないらしい… SELECT * WHERE { <hCp://ja.dbpedia.org/resource/オダギリジョー> ?q <hCp://ja.dbpedia.org/resource/函館市> }
などなど
– では、どうすれば?
2013-‐05-‐09 42
なにかを間にはさめば…
• ハンズオンで出た案: 「斎藤一」役でNHK大河ドラマ「新選組!」に出てたので… select discnct ?o where { { <%(term_q)s> ?p <hCp://ja.dbpedia.org/resource/新選組!> . <hCp://ja.dbpedia.org/resource/新選組!> ?q ?o . } UNION { ?o ?r <hCp://ja.dbpedia.org/resource/新選組!> . <hCp://ja.dbpedia.org/resource/新選組!> ?t <%(term_q)s> . }
2013-‐05-‐09 43
つづく
2013-‐05-‐09 44