RDF構築
SPARQLハンズオン

2013/12/21
クラウド・テクノロジー活用部会
リーダー 荒本道隆
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

必要なミドルウエアのインストール•Java JDK 6以降• http://www.oracle.com/technetwork/java/javase/downloads/index.html• SDKがオススメ•Eclipse• http://www.eclipse.org/downloads/• Standardがオススメ• Windowsは、こんなbatファイルを作っておくと、便利
set PATH=C:¥Java¥jdk1.7.0_45¥bin
start C:¥eclipse¥eclipse¥eclipse.exe -data C:¥eclipse¥workspace• Workspace を切り替えることで、他プロジェクトと完全に切り離せる• JDKの切り替えも簡単＆確実• ショートカットでもOK

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

2

RDF構築•RDFの環境を各自のPC上に構築• 好きな件数で色々使ってみよう• まずは１件だけで挙動を把握• データ件数を増やして集計処理を実行• 高負荷のSPARQLを思う存分に実行•PC上でうまく動かない場合は• 回避策を準備済み•今回は検索（SELECT）のみですが• SPARQLにはINSERT, DELETE もあります• http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/REC-sparql11update-20130321.html•SPARQLに慣れたら• Dbpediaなどにアクセスしてみる• http://ja.dbpedia.org/

ハルミン
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

3使用するファイルのダウンロード•sparql 実行環境
• http://cloud.aitc.jp/20131221/• ダウンロードが終わったら、workspace内に解凍• 解凍後は755MByte• Eclipse でプロジェクトをインポート

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

4使用するファイルのダウンロード•Eclipse でプロジェクトをインポートの続き

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

5使用するファイルのダウンロード•Eclipse でプロジェクトをインポートの続き

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

6使用するミドルウエア•Apache Jena
• http://jena.apache.org/

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

7

Jenaの特徴•SPARQL 1.1に対応• 2008年1月15日勧告版• http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/rdf-sparql-query.html•ファイルシステム上に、RDFを構築できる• RDBが不要なので、非常に簡単• メモリキャッシュが効く• ２回目以降の問い合わせが高速• 別JavaVMから更新しないように• 注意！
• エラーハンドリングが不十分でcloseを忘れると• 不整合が起こって２度とアクセスできなくなってしまう•JavaでRDFを登録できる• RDFの書き方が分からなくても、何とかなる
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

8

今回、使用するデータ•気象庁XMLを配信するためのfeedメッセージ• http://xml.kishou.go.jp/• 2013年1月1日～12月2日の途中まで、131,617件（391件/日）• Atom形式• RSS(RDF site summary)から派生したもの• IETFにおいてRFC4287として仕様が公開されている• feedの中に、気象庁XML本文のURLが書いてある• feed内の要素「title, id, updated, author, link, content」• RDFに合わない部分を強引に変換•気象台情報• http://www.jma.go.jp/jma/kishou/link/link2.html• 気象官署名, 郵便番号, 所在地等, 電話番号
• 所在地から、Geocoding APIで緯度・経度を取得• http://www.geocoding.jp/api/• 皆が一斉に実行すると負荷がかかるので、事前に取得済み• JenaのAPIを使って登録
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

9気象庁XMLで配信されているデータ

http://xml.kishou.go.jp/jmaxml_20130628_format_v1_1_hyo1_1.pdf
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

10気象庁XMLで配信されているデータ

http://xml.kishou.go.jp/jmaxml_20130628_format_v1_1_hyo1_1.pdf
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

11

元feedメッセージ<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja"><title>JMAXML publishing feed</title><subtitle>this feed is published by JMA</subtitle><updated>2013-01-01T07:41:02+09:00</updated><id>urn:uuid:e61634ec-d49e-30d8-9dda-b8eea453750b</id><link href="http://www.jma.go.jp/" rel="related" /><link href="http://xml.kishou.go.jp/feed/regular.xml" rel="self" /><rights>Published by Japan Meteorological Agency</rights><entry><title>府県天気概況</title><id>urn:uuid:aa21d835-f6bd-35e6-94f0-f4dbbb387323</id><updated>2012-12-31T22:40:06Z</updated><author><name>京都地方気象台</name></author><link
href="http://xml.kishou.go.jp/data/aa21d835-f6bd-35e6-94f0-f4dbbb387323.xml"
type="application/xml" /><content type="text">【天気概況】</content></entry></feed>Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

12変換後feedメッセージ<?xml version="1.0" encoding="UTF-8"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><entry rdf:about="urn:uuid:aa21d835-f6bd-35e6-94f0-f4dbbb387323"
xmlns="http://www.w3.org/2005/Atom#"><title>府県天気概況</title><id>urn:uuid:aa21d835-f6bd-35e6-94f0-f4dbbb387323</id><updated>2012-12-31T22:40:06Z</updated><author rdf:resource="http://cloud1.projectla.jp/sparql/link2/京都地方気象台"></author><link>http://xml.kishou.go.jp/data/aa21d835-f6bd-35e6-94f0-f4dbbb387323.xml</link><content>【天気概況】</content></entry><feed xmlns="http://www.w3.org/2005/Atom#" rdf:about="urn:uuid:e61634ec-d49e-30d8-9ddab8eea453750b"
xml:lang="ja"><title>JMAXML publishing feed</title><subtitle>this feed is published by JMA</subtitle><updated>2013-01-01T07:41:02+09:00</updated><id>urn:uuid:e61634ec-d49e-30d8-9dda-b8eea453750b</id><link>http://www.jma.go.jp/</link><link>http://xml.kishou.go.jp/feed/regular.xml</link><rights>Published by Japan Meteorological Agency</rights><entry rdf:resource="urn:uuid:aa21d835-f6bd-35e6-94f0-f4dbbb387323" /></feed></rdf:RDF>
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

13

このRDFを可視化するとhttp://www.kanzaki.com/works/2005/rap/graph-check
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

14

使いそうな部分のみを拡大表示

http://www.kanzaki.com/works/2005/rap/graph-check
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

15京都地方気象台の情報も付加

http://www.kanzaki.com/works/2005/rap/graph-check
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

16

この時のRDF<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2005/Atom#"xmlns:j.0="http://cloud1.projectla.jp/sparql/link2/"><feed rdf:about="urn:uuid:e61634ec-d49e-30d8-9dda-b8eea453750b"><entry><entry rdf:about="urn:uuid:aa21d835-f6bd-35e6-94f0-f4dbbb387323"><title>府県天気概況</title><id>urn:uuid:aa21d835-f6bd-35e6-94f0-f4dbbb387323</id><updated>2012-12-31T22:40:06Z</updated><author><rdf:Description rdf:about="http://cloud1.projectla.jp/sparql/link2/京都地方気象台"><j.0:name>京都地方気象台</j.0:name><j.0:url>http://www.jma-net.go.jp/kyoto/index.html</j.0:url><j.0:tel>075-823-4302</j.0:tel><j.0:location rdf:parseType="Resource"><j.0:address>京都府京都市中京区西ノ京笠殿町38</j.0:address><j.0:postalCode>604-8482</j.0:postalCode><j.0:lat rdf:datatype="http://www.w3.org/2001/XMLSchema#double">35.0143771</j.0:lat><j.0:lng rdf:datatype="http://www.w3.org/2001/XMLSchema#double">135.7342517</j.0:lng></j.0:location></rdf:Description></author><link>http://xml.kishou.go.jp/data/aa21d835-f6bd-35e6-94f0-f4dbbb387323.xml</link><content>【天気概況】</content></entry></entry><title xml:lang="ja">JMAXML publishing feed</title><id xml:lang="ja">urn:uuid:e61634ec-d49e-30d8-9dda-b8eea453750b</id><updated xml:lang="ja">2013-01-01T07:41:02+09:00</updated><link xml:lang="ja">http://www.jma.go.jp/</link><link xml:lang="ja">http://xml.kishou.go.jp/feed/regular.xml</link><subtitle xml:lang="ja">this feed is published by JMA</subtitle><rights xml:lang="ja">Published by Japan Meteorological Agency</rights></feed></rdf:RDF>
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

17

注意事項
•AtomはそのままではRDFには入りません• 今回は、強引に変換して登録しています• 他のfeedで同じ変換をしてもダメの可能性大•SPARQLにコメントアウト機能はありません• 今回は、お手製で機能追加しました• 他の環境で実行する時は注意してください•10万件をインポートするにはとても時間がかかります• 検索も、書き方次第でとても時間がかかります• Webでやると、キャッシュが効くので分かり難い

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

18

ファイルの説明
ClientAPI.java

HTTPでSPARQLリクエストを受け付けるServlet

Import.java

気象庁XMLのfeedをRDFに変換してJenaに登録

Import2.java

気象台情報をJenaに登録

RDF.java

SPARQLを実行するコマンド

data.zip

2013/01/01～2013/12/02までのfeedを圧縮したもの

feed_135699366581
0_original.xml

feedデータのオリジナル

feed_135699366581
0_rdf.xml

feed_1356993665810_original.xml をRDF形式に変換したもの

link2.txt

気象台情報

query.txt

RDF.javaで実行するSPARQL

resource.properties

１件だけ、１ヶ月分、１年分を切り替える

Dataset1

１件だけデータを登録したもの

DatasetAll

2013/01/01～2013/12/02までのデータを登録したもの

DatasetOneMonth2013/01/01～2013/01/31までのデータを登録したもの

logs

ログの出力先Sample.html

１件分のRDFを図化したもの

Sample.xml

１件分のRDF

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

19

実行方法
•query.txt に実行したいSPARQLを書く•RDF.java をアクティブにして、実行• [Ctrl]+[F-11]もしくは、メニューの「Run」→「Run」•２回目以降は、ショートカットが早い• query.txt を編集して保存（[Ctrl]+[S]）• そのまま実行（[Ctrl]+[F-11]）•query.txt の書き方
• 試行錯誤し易いように、コメントアウト機能を独自実装• １文字目が # の行はコメントとして扱う• 行の途中にある # は、そのまま実行される

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

20

そろそろSPARQLの話が始まります•SPARQLを思いつくままに書いて実行• 自分のPC上で動くので、誰にも迷惑はかかりません•環境がうまく動かない場合は• そんな事もあろうかと、テスト用サイトを準備済み• http://cloud1.projectla.jp/handson/sparql1/

ハルミン
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

21

SPARQL-1•まずは最初の一歩
SELECT * WHERE {?s ?p ?o} LIMIT 100

三つ組みをそれぞれs,p,o という変数に割り当てる
変数名は何でもいい

とんでもない件数の場合もあるので、100件だけ取得•これと同じ意味
SELECT ?s ?p ?o WHERE {?s ?p ?o} LIMIT 100
表示する順

取得する順

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

22

SPARQL-２•特定のものだけを取得
SELECT * WHERE {<urn:uuid:aa21d835-f6bd-35e6-94f0-f4dbbb387323> ?p ?o}
LIMIT 100

SELECT * WHERE {?s <http://www.w3.org/2005/Atom#title> ?o} LIMIT 100
SELECT * WHERE {?s ?p "府県天気概況"} LIMIT 100•PREFIXを使って省略
PREFIX atom: <http://www.w3.org/2005/Atom#>
SELECT * WHERE {?s atom:title ?o} LIMIT 100•レスポンスの形式を変更
SELECT ?s ?p ("府県天気概況" AS ?o) WHERE {?s ?p "府県天気概況"}
LIMIT 100固定のレスポンスを変数oに割り当てる
カッコが無いとエラー
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

23

SPARQL-３•フィルタによる絞り込み
SELECT * WHERE {?s ?p ?o . FILTER(?p = <http://www.w3.org/2005/Atom#title>)} LIMIT 100

ピリオドで区切る

フィルタ条件を指定

SELECT * WHERE {?s ?p ?o .
FILTER(?p = <http://www.w3.org/2005/Atom#title> && ?o = "府県天気概況")}
LIMIT 100
SELECT * WHERE {?s ?p ?o . FILTER(?o < 100)} LIMIT 100
数値型であれば、大小比較もOK
SELECT * WHERE {?s ?p ?o . FILTER(REGEX(?o ,"天気概況"))} LIMIT 100
SELECT * WHERE {?s ?p ?o . FILTER(REGEX(?o ,"^[0-9]"))} LIMIT 100
正規表現も使用可能
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

24

SPARQL-４•件数を知りたい
SELECT (COUNT(*) AS ?count) WHERE {?s ?p ?o}countという変数に割り当てる
カッコが無いとエラー•条件に合うものの件数
SELECT (COUNT(*) AS ?count)
WHERE {?s <http://www.w3.org/2005/Atom#title> ?o}•要素で集計をする
SELECT ?p (COUNT(?o) AS ?count) WHERE {?s ?p ?o} GROUP BY ?p

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

25

SPARQL-５•RDBでおなじみの機能を使ってみる
SELECT DISTINCT ?p WHERE {?s ?p ?o} LIMIT 100

SELECT ?p (COUNT(?o) AS ?count) WHERE {?s ?p ?o}
GROUP BY ?p ORDER BY ?count
SELECT ?p (COUNT(?o) AS ?count) WHERE {?s ?p ?o}
GROUP BY ?p ORDER BY DESC(?count)

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

26

RDFの構造を活用－１•この構造を取り出す

PREFIX atom: <http://www.w3.org/2005/Atom#>
PREFIX j.0:
<http://cloud1.projectla.jp/sparql/link2/>

SELECT * WHERE {?s atom:author ?o . ?o j.0:name ?o2 } LIMIT 100

http://www.kanzaki.com/works/2005/rap/graph-check
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

27

RDFの構造を活用－２•もっと長い構造

PREFIX atom: <http://www.w3.org/2005/Atom#>
PREFIX j.0:
<http://cloud1.projectla.jp/sparql/link2/>

SELECT * WHERE {?s atom:author ?o . ?o j.0:location ?o2 . ?o2 ?p3 ?o3}
LIMIT 100

http://www.kanzaki.com/works/2005/rap/graph-check
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

28

RDFの構造を活用－３•「府県天気概況」を出している気象台

PREFIX atom: <http://www.w3.org/2005/Atom#>
PREFIX j.0:
<http://cloud1.projectla.jp/sparql/link2/>
SELECT * WHERE {?s atom:title "府県天気概況" . ?s atom:author ?o2 }LIMIT 100
http://www.kanzaki.com/works/2005/rap/graph-check
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

29

1ヶ月分のデータを使用•resources.properties を修正# data.path=./Dataset1
data.path=./DatasetOneMonth# data.path=./DatasetAll•ブラウザでやっている人• 別ブラウザで１ヶ月版を開く• http://cloud1.projectla.jp/handson/sparqlOneMonth/• 全件見たい場合は「LIMIT 100」を外す• サーバとネットワークとクライアントに負荷がかかります

ハルミン
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

30

１ヶ月分のデータ－１•entryデータが何件あるか？

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX atom: <http://www.w3.org/2005/Atom#>
SELECT (COUNT(*) AS ?count) WHERE {?s rdf:type atom:entry}

http://www.kanzaki.com/works/2005/rap/graph-check
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

31

１ヶ月分のデータ－２•どんなデータがあるか？

PREFIX atom: <http://www.w3.org/2005/Atom#>
SELECT DISTINCT ?o WHERE {?s atom:title ?o}http://www.kanzaki.com/works/2005/rap/graph-check
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

32

１ヶ月分のデータ－３•気になるtitleのcontent

PREFIX atom: <http://www.w3.org/2005/Atom#>
SELECT * WHERE{?s atom:title "異常天候早期警戒情報" . ?s atom:content ?o2} LIMIT 100

http://www.kanzaki.com/works/2005/rap/graph-check
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

33

１ヶ月分のデータ－４•全気象台を北から順にリスト

PREFIX atom: <http://www.w3.org/2005/Atom#>
PREFIX j.0:
<http://cloud1.projectla.jp/sparql/link2/>
SELECT ?s WHERE {?s j.0:location ?o . ?o j.0:lat ?o2}
ORDER BY DESC(?o2)
http://www.kanzaki.com/works/2005/rap/graph-check
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

34

トライ！
•様々なクエリを書いてみる• 各気象台の出したentry数を多い順にリスト• 各気象台の出したentryのcontentに「雪」が入っている数• 以下のエリア内の気象台から出された「気象警報・注意報」数• 45.41024, 138.28024 ～ 41.27589, 146.5495• その他、面白いクエリを考えてみてください• 参考資料：SPARQL1.1• http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/rdf-sparql-query.html• http://docs.oracle.com/cd/E49329_01/appdev.121/b72469/sdo_rdf_concepts.htm#C
IHEAECD•約１年分のデータに対しても、同じ事をやってみる• resources.properties を修正# data.path=./Dataset1# data.path=./DatasetOneMonthdata.path=./DatasetAll•後で、各自、今日イチのクエリを発表• Webサイト上で実行してログで確認•

http://cloud1.projectla.jp/handson/sparqlAll/

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

ハルミン
35