SPARQLでマッシュアップ -LOD活用のための技術紹介- 
上田洋 
LODチャレンジJapan実行委員会 
特定非営利活動法人リンクト・オープン・データ・イニシアティブ 
第4回Linked Open Data ハッカソン関西with LODC2014 ×UDC2014 
2014.12.7
LOD・オープンデータとの関わり 
•特定非営利活動法人リンクト・オープン・データ・ イニシアティブ 
•2014年より理事 
•関西支部支部長補佐 
•Linked Open Data チャレンジJapan 
•2014年度より実行委員 
•オープンデータを利用するWebアプリを公開中 
•http://uedayou.net/で公開中
SPARQL(SPARQL Protocol and RDF Query Language)
SPARQL 
•RDF(LOD)用の汎用クエリ言語 
•RDF(LOD)用のデータベースからトリプル(3つ組) データを検索して、表形式でデータが取得できます 
いろんなデータベース で使えます 
扱いやすい! 
PREFIX rdfs: 
<http://www.w3.org/2000/01/rdf-schema#> 
SELECT * WHERE { 
?urirdfs:label?label . 
} 
LIMIT 10 
?uri 
?label 
http://ja.dbpedia.org/resource/岩手県 
"岩手県" 
http://ja.dbpedia.org/resource/石川県 
"石川県" 
http://ja.dbpedia.org/resource/愛媛県 
"愛媛県" 
http://ja.dbpedia.org/resource/岡山県 
"岡山県"
SPARQLで検索できるデータが増えています 
データ種別 
WebAPI 
Wikipedia 
DBPedia 
Wikipediaオントロジー 
行政データ 
データシティ鯖江 
都道府県・市区町村コード情報 
Open Data METI 
イベントデータ 
ヨコハマ・アート・LOD 
博物館データ 
Europeana 
LODAC Museum 
The British Museum 
図書館データ 
The British National Bibliography 
Web NDL Authorities 
地理データ 
Linked Geo Data 
LODACLocation 
気象データ 
気象庁XML用API 
生物種データ 
LODACSpecies 
この他にも多くのオープンデータがSPARQLで検索できます
LODチャレンジもSPARQLで 検索できるデータベースを公開中! 
http://lodc.jp
http://lodc.jp/#dataset 
過去3年分+αのオープンライセンス のデータセットが検索可能
SPARQLエンドポイント提供サービス “SparqlEPCU” 
http://lodcu.cs.chubu.ac.jp/SparqlEPCU/
SparqlEPCU 
•中部大学年岡研究室が開発・運営するWebサービス 
•自分のデータで簡単にSPARQLエンドポイント(SPARQLで検索 可能なWeb API)が設置可能 
•Linked Open DataチャレンジJapan 2012 アプリケーション部門 最優秀賞受賞作品 
http://lod.sfc.keio.ac.jp/blog/?p=1071
Twitter/Facebook でログイン 
Projectページで 
「プロジェクトの作成」 ボタンをクリック 
プロジェクトID 
(半角英数) 
タイトルを 
入力して 
「作成」 
「データ登録」タブ 
からファイルを 
アップロード 
(ttl,rdf/xml, nt対応) 
して「登録」 
完成! 
ProjectAPIURLから SPARQLが使えます! 
1 
2 
3 
4
詳しくはこちらの資料を 
http://www.slideshare.net/siramatu/sparqlmashup2
LOD推奨形式RDFとは (Resource Description Framework) 
•「主語」「述語」「目的語」を1つのセット(トリプル、 三つ組み)として記述 
主語 
(Subject) 
目的語 
(Object) 
述語 
(Predicate) 
東京都 
神奈川県 
隣の県 
例えば…
トリプルデータを表形式に変換 
主語 
述語 
目的語 
dbpedia: 東京都 
rdfs:label 
"東京都" 
dbpedia: 東京都 
rdfs:comment 
“東京都(とうきょうと)は、日本 の都道府県の一つである。" 
dbpedia: 大阪府 
rdfs:label 
“大阪府” 
dbpedia: 大阪府 
rdfs:comment 
"大阪府(おおさかふ)は、近畿 地方(関西地方)に属する日本 の都道府県の一つ。" 
dbpedia: 京都府 
rdfs:label 
“京都府” 
dbpedia: 京都府 
rdfs:comment 
"京都府(きょうとふ)は、日本 国・近畿地方の都道府県。" 
id 
label 
comment 
dbpedia: 東京都 
"東京都" 
“東京都(とうきょうと)は、日本 の都道府県の一つである。" 
dbpedia: 大阪府 
“大阪府” 
"大阪府(おおさかふ)は、近畿 地方(関西地方)に属する日本 の都道府県の一つ。" 
dbpedia: 京都府 
“京都府” 
"京都府(きょうとふ)は、日本 国・近畿地方の都道府県。" 
変換! 
SPARQLなら簡単にできます!
HTML・CSV・XML・JSONなど さまざまな形式で出力可能! 
•formatパラメータを変更するだけ 
JSON 
http://db.lodc.jp/sparql?query=...&format=json 
XML 
http://db.lodc.jp/sparql?query=...&format=xml 
CSV 
http://db.lodc.jp/sparql?query=...&format=csv 
“format”はSPARQLエンドポイントによって異なる場合があります
今日一日でできる SPARQLアプリ
SPARQLでマッシュアップ 
•SPARQLクエリを書くだけでプログラミングなしに いろんなアプリが作れます 
•全てWebブラウザがあれば動作します 
•Webサーバは必要ありません!
SPARQLでマッシュアップ 
•地図アプリ 
•leaflet-simple-sparql 
•クイズアプリ 
•SlickQuiz-SPARQL 
•カレンダーアプリ 
•fullcalendar-sparql-js 
•地図とタイムラインビジュアライズアプリ 
•SPARQL Timeliner 
•地図で空白地域ビジュアライズアプリ 
•○○危険地帯 
•書籍検索アプリ 
•booksearch-sparql-js 
•データビジュアライズツール 
•sgvizler
地図アプリ 
•leaflet-simple-sparql 
•https://github.com/uedayou/leaflet-simple-sparql
使い方:leaflet-simple-sparql 
•githubのページから「Download ZIP」ボタンを押して、 ソースコード一式をダウンロード 
•解凍して「config.js」にエンドポイントとクエリを記述する 
•index.htmlをブラウザで開く 
var endpoint = "http://ja.dbpedia.org/sparql"; 
var query = (function () {/* 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
select * where { 
?link rdfs:label ?title; 
geo:lat ?lat; 
geo:long ?long. 
} 
limit 1000 
*/}).toString().match(/¥n([¥s¥S]*)¥n/)[1];
クイズアプリ 
•SlickQuiz-SPARQL 
•https://github.com/uedayou/SlickQuiz-SPARQL
使い方:SlickQuiz-SPARQL 
•githubのページから「Download ZIP」ボタンを押して、 ソースコード一式をダウンロード 
•解凍して「config.js」にエンドポイントとクエリを記述する 
•index.htmlをブラウザで開く 
varendpoint = "http://lodcu.cs.chubu.ac.jp/SparqlEPCU/api/yokohama_quiz"; 
varquery = (function () {/* 
select distinct * where { ?uri<http://linkdata.org/property/rdf1s560i#question> ?question; 
<http://linkdata.org/property/rdf1s560i#choice1> ?choise1; 
<http://linkdata.org/property/rdf1s560i#choice2> ?choise2; 
<http://linkdata.org/property/rdf1s560i#choice3> ?choise3; 
<http://linkdata.org/property/rdf1s560i#choice4> ?choise4; 
<http://linkdata.org/property/rdf1s560i#answer> ?answer_no; 
<http://linkdata.org/property/rdf1s560i#kaisetsu> ?kaisetsu. 
bind(concat('</p>解説:',str(?kaisetsu),'</p>') as ?correct) 
bind(concat('</p>解説:',str(?kaisetsu),'</p>') as ?incorrect) } ORDER BY RAND() LIMIT 10 
*/}).toString().match(/¥n([¥s¥S]*)¥n/)[1];
SlickQuiz-SPARQL用の データの作り方 
•データは簡単に作成できます。 
•LinkData.org の「横浜検定問題・解答集」と同じよう にデータを作るだけ 
•http://linkdata.org/work/rdf1s560i 
データを作って「ご当地検定アプリ」作りませんか?
カレンダーアプリ 
•fullcalendar-sparql-js 
•https://github.com/uedayou/fullcalendar-sparql-js
使い方:fullcalendar-sparql-js 
•githubのページから「Download ZIP」ボタンを押して、 ソースコード一式をダウンロード 
•解凍して「config.js」にエンドポイントとクエリを記述する 
•index.htmlをブラウザで開く 
varendpoint = "http://archive.yafjp.org/test/inspection.php"; 
varquery = (function () {/* 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX schema: <http://schema.org/> 
PREFIX event: <http://fp.yafjp.org/terms/event#> 
SELECT * WHERE{ 
?uria event:Event; 
schema:name?title; 
schema:startDate?start; 
schema:endDate?end; 
dc:description?description. 
} 
*/}).toString().match(/¥n([¥s¥S]*)¥n/)[1];
地図とタイムラインの ビジュアライズアプリ 
•SPARQL Timeliner 
•http://uedayou.net/SPARQLTimeliner/
使い方:SPARQL Timeliner 
エンドポイントのURLを入力 
クエリを入力 
•http://uedayou.net/SPARQLTimeliner を開いてエンドポイントURLとクエリを入力して 「Load>>」ボタンをクリック
使い方:SPARQL Timeliner 
•以下のルールに従ってクエリを作成してください 
•詳しい使い方は以下の資料にまとめています 
•http://www.slideshare.net/uedayou/sparql-timeliner- 28905905
トイレ危険地帯 
•Linked Open Data チャレンジ2013 受賞作品 
•鯖江市が公開するオープンデータのうち、公衆トイ レの位置を利用してトイレのない地域をWebアプリ でビジュアライズ 
http://y4ashida.github.io/toilet/
○○危険地帯 
•トイレ危険地帯のソースコードを修正して、SPARQL でさまざまなデータで空白地域をビジュアライズで きるようにしました 
•https://github.com/uedayou/dangerzone-sparql
大阪市版トイレ危険地帯 
http://uedayou.github.io/dangerzone-sparql/
○○危険地帯の使い方 
1.「Download ZIP」ボタンを押してソースコード をダウンロード 
2.ZIPファイルを解凍 
3.config.js の書き換える 
4. Index.html をブラウザで開く 
SPARQLを書きます
config.js の書き方 
// SPARQLエンドポイントを指定 
varendpoint = "http://db.lodc.jp/sparql"; 
// SPARQLクエリを指定 
varquery = (function () {/* 
SELECT DISTINCT * 
FROM <http://lod.sfc.keio.ac.jp/challenge2013/show_status.php?id=d030> 
WHERE{ 
?uri<http://lodosaka.hozo.jp/category_1> "公衆トイレ"@ja ; 
<http://www.w3.org/2003/01/geo/wgs84_pos#lat> ?latitude ; 
<http://www.w3.org/2003/01/geo/wgs84_pos#long> ?longitude . 
} 
*/}).toString().match(/¥n([¥s¥S]*)¥n/)[1]; 
// 中心位置を指定 
varinitial_latitude=34.68206400648744; 
varinitial_longitude=135.49816131591797; 
// ズーム率を指定 
varinitial_zoom= 11; 
SPARQL 
クエリ 
SPARQL 
エンドポイント
大阪市のいろんな危険地帯を作っ てみよう! 
// SPARQLエンドポイントを指定 
varendpoint = "http://db.lodc.jp/sparql"; 
// SPARQLクエリを指定 
varquery = (function () {/* 
SELECT DISTINCT * 
FROM <http://lod.sfc.keio.ac.jp/challenge2013/show_status.php?id=d030> 
WHERE{ 
?uri<http://lodosaka.hozo.jp/category_1> "公衆トイレ"@ja ; 
<http://www.w3.org/2003/01/geo/wgs84_pos#lat> ?latitude ; 
<http://www.w3.org/2003/01/geo/wgs84_pos#long> ?longitude . 
} 
LIMIT 1000 
*/}).toString().match(/¥n([¥s¥S]*)¥n/)[1]; 
// 中心位置を指定 
varinitial_latitude=34.68206400648744; 
varinitial_longitude=135.49816131591797; 
// ズーム率を指定 
varinitial_zoom= 11; 
ここのカテゴリを変えると 
いろんな危険地帯が 
作れます 
例: 
“学校・保育所”@ja 
“名所・旧跡”@ja 
“警察・消防”@ja 
“医療・福祉”@ja 
“公園・スポーツ”@ja 
“駅・バス停”@ja 
…
書籍検索アプリ 
•booksearch-sparql-js 
•https://github.com/uedayou/booksearch-sparql-js
使い方:booksearch-sparql-js 
•githubのページから「Download ZIP」ボタンを押して、 ソースコード一式をダウンロード 
•解凍して「config.js」にエンドポイントとクエリを記述する 
•?uriに書籍URI、?title に書籍タイトル、?description に詳細情 報が入るようにクエリを記述してください。 
•{% QUERY %} が検索文字列に置き換えられます。 
•index.htmlをブラウザで開く 
// SPARQLエンドポイントURL 
varendpoint = "http://lodcu.cs.chubu.ac.jp/SparqlEPCU/api/kyotobook_list"; 
// SPARQLクエリ(検索用) 
varlist_query= (function () {/* 
select distinct ?uri?title ?description where 
{ 
?uri<http://linkdata.org/property/rdf1s1294i#title> ?title; 
<http://linkdata.org/property/rdf1s1294i#Summary> ?description. 
filter(regex(str(?title), '.*?{% QUERY %}.*?')) 
} 
*/}).toString().match(/¥n([¥s¥S]*)¥n/)[1];
使い方:booksearch-sparql-js 
•config.js のprop_labelsにURIとそのラベルを設定 しておくと、詳細表示の際にURIをラベルに置き換 わります。 
varprop_labels= { 
"http://purl.org/dc/terms/title":"タイトル", 
"http://purl.org/dc/elements/1.1/creator":"著者", 
…
データビジュアライズツール 
•sgvizler 
•http://dev.data2000.no/sgvizler/ 
•※今回はバージョン0.5を使います
使い方:sgvizler 
•以下のコードをHTMLファイルに貼り付けて保存してブラウザで開くだけ 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
<script type="text/javascript" src="https://www.google.com/jsapi"></script> 
<script type="text/javascript" id="sgvzlr_script" src="http://sgvizler.googlecode.com/svn/release/0.5/sgvizler.js"></script> 
<script type="text/javascript"> 
<!--$(document).ready(sgvizler.go()); --> 
</script> 
<div 
id=“sgvizler-sample” 
data-sgvizler-endpoint 
="http://lodcu.cs.chubu.ac.jp/SparqlEPCU/api/kyotobook_list" 
data-sgvizler-query=“ 
SELECT ?year (count(?uri) AS ?noOfUri) 
WHERE { 
?uri<http://linkdata.org/property/rdf1s1294i#Year> ?year. 
}GROUP BY ?year 
ORDER BY DESC(?noOfUri) 
“ 
data-sgvizler-chart="gBarChart" 
data-sgvizler-loglevel="2" 
data-sgvizler-chart-options="title=Number of instances" 
style="width:2000px; height:2500px;"></div> 
•以下で雛形コードをダウンロードできます 
•http://uedayou.net/sparql-mashup/sgvizler-sample.html
使い方:sgvizler 
<div 
id=“sgvizler-sample” 
data-sgvizler-endpoint 
="http://lodcu.cs.chubu.ac.jp/SparqlEPCU/api/kyotobook_list" 
data-sgvizler-query=“ 
SELECT ?year (count(?uri) AS ?noOfUri) 
WHERE { 
?uri<http://linkdata.org/property/rdf1s1294i#Year> ?year. 
}GROUP BY ?year 
ORDER BY DESC(?noOfUri) 
“ 
data-sgvizler-chart="gBarChart" 
data-sgvizler-loglevel="2" 
data-sgvizler-chart-options=“title=出版年別ランキング" 
style="width:800px; height:500px;"></div> 
クエリを記述 
グラフの 
種類を指定 
エンドポイントを指定 
グラフタイトル 
を記述 
Idを指定
例で利用するデータ 
•京都が出てくる本のデータ 
•京都岡崎にある図書館で働く司書の方々が中心のグ ループ「ししょまろはん」が作成・公開する京都が舞台の 小説やマンガ・ライトノベル等のデータ 
•作品の舞台となった京都府内の位置データや司書さん のおすすめ度もデータ化される 
•LODチャレンジJapan2014データセット部門応募作品 
•LODチャレンジ2011-2013応募作品メタデータ 
どちらも 
LODチャレンジ応募作品のSPARQLエンドポイント(試行版) 
で検索できます
京都が出てくる本のデータ: 出版年ランキング 
http://uedayou.net/sparql-mashup/sgvizler/kyoto-issued-ranking.html
京都が出てくる本のデータ: 著者トップ10 
http://uedayou.net/sparql-mashup/sgvizler/kyoto-author-top10.html
京都が出てくる本のデータ: おすすめ度ランキング 
http://uedayou.net/sparql-mashup/sgvizler/kyoto-recommend-ranking.html
京都が出てくる本のデータ: 出版社別ランキング 
http://uedayou.net/sparql-mashup/sgvizler/kyoto-publisher-ranking.html
京都が出てくる本のデータ: カテゴリ別ランキング 
http://uedayou.net/sparql-mashup/sgvizler/kyoto-category-ranking.html
クエリの書き方 (棒グラフ、円グラフの場合) 
•「data-sgvizler-chart」には以下を指定 
•円グラフ:「gPieChart」 
•縦棒グラフ:「gColumnChart」 
•横棒グラフ:「gBarChart」 
•GROUP BY を使ってデータをグループ化する 
•COUNTで出現回数を計算 
PREFIX dcterms: <http://purl.org/dc/terms/> 
SELECT ?year (COUNT(?uri) AS ?noOfUri) 
WHERE { 
?uridcterms:issued?year. 
} 
GROUP BY ?year 
ORDER BY DESC(?noOfUri)
クエリの書き方 (棒グラフ、円グラフの場合) 
•実際のデータは…
LODチャレンジ応募作品の 関連グラフ 
http://uedayou.net/sparql-mashup/sgvizler/lodc-network.html
クエリの書き方 (無指向グラフの場合) 
select distinct ?title1 ?title2 
from <http://lod.sfc.keio.ac.jp/challenge/entries> 
where { 
?s <http://purl.org/dc/terms/relation> ?o. 
?s <http://purl.org/dc/terms/title> ?title1. 
?o <http://purl.org/dc/terms/title> ?title2. 
} 
•無指向グラフの場合 
•「data-sgvizler-chart」には「gForceGraph」を指定 
•SELECTで二つのラベルが入るようにクエリを記述
クエリの書き方 (無指向グラフの場合) 
•実際のデータは…
ハンズオン SPARQLの書き方 
事前にブラウザに http://uedayou.net/sparql-mashup/ 
を開いておいてください
URI(IRI)とリテラル 
•URI(IRI) : <http://ja.dbpedia.org/resource/東京都> 
•「<」「>」で挟まれた文字列 
•人・もの・出来事などを指し示すID 
•指定したURIを同じURIを含むデータが検索される 
•リテラル: “東京” , “100” , “2014-12-07” … 
•「”」で挟まれた文字列 
•データそのもの(string, integer, float他) 
•指定した文字列と同じ文字列を含むデータが検索され る 
•目的語以外は指定できない
主語 
述語 
目的語 
<http://ja.dbpedia.org/resource /東京都> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
"東京都" 
<http://ja.dbpedia.org/resource/東京都> 
<http://www.w3.org/2000/01/ rdf-schema#comment> 
“東京都(とうきょうと)は、日本 の都道府県の一つである。" 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/千葉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“山梨県” 
<http://ja.dbpedia.org/resource/千葉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“千葉県” 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“埼玉県” 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“神奈川県” 
RDFのデータベース
URIとリテラル 
主語 
述語 
目的語 
<http://ja.dbpedia.org/resource /東京都> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
"東京都" 
<http://ja.dbpedia.org/resource/東京都> 
<http://www.w3.org/2000/01/ rdf-schema#comment> 
“東京都(とうきょうと)は、日本 の都道府県の一つである。" 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/千葉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“山梨県” 
<http://ja.dbpedia.org/resource/千葉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“千葉県” 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“埼玉県” 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“神奈川県”
(1) シンプルなSPARQLクエリ 
•全てのトリプルデータを検索 
SELECT ?s ?p ?o WHERE 
{ 
?s ?p ?o. 
}
SELECT 
•SELECT の後ろに続く変数(?で始まる文字列)に格納さ れたデータを表形式で取得 
•変数名は必ずWHERE文の中で指定したものを記述す ること 
•例では?s、?p、?o 
SELECT ?s ?p ?o WHERE 
{ 
?s ?p ?o. 
}
SELECT 
•アスタリスク「*」を指定すると、WHERE文の中の 全ての変数を指定したことと同じになる 
•?s、?p、?o が抽出される 
SELECT * WHERE 
{ 
?s ?p ?o . 
} 
SELECT ?s ?p ?o WHERE 
{ 
?s ?p ?o. 
} 
=
WHERE 
•WHERE { } 内に検索したいトリプルパターンを書く 
SELECT ?s ?p ?o WHERE 
{ 
?s ?p ?o . 
}
基本構造 
•トリプルパターンを指定するために、3つの変数または URI、リテラル(目的語のみ)を1セットで書く 
•変数:?で始まる文字列、任意のURIまたはリテラルが入る 
•1セットの終わりには必ずピリオド「.」をつける 
SELECT ?s ?p ?o WHERE 
{ 
?s ?p ?o. 
} 
主語の 
指定 
述語の 
指定 
目的語 
の指定 
必ずピリオド で終わる
変数とトリプルパターン 
•変数:?s , ?p , ?o, ?label, ?comment … 
•「?」で始まる文字列 
•パターンに当てはまるデータ全てが格納される 
•検索式内の同一変数は同じデータが入るという意味に 
?id rdfs:label?label. 
トリプルパターン 
id 
label 
dbpedia: 東京都 
"東京都" 
dbpedia: 大阪府 
“大阪府” 
dbpedia: 京都府 
“京都府” 
rdfs:labelは<http://www.w3.org/2000/01/ rdf-schema#label> 
というURIで目的語がラベルであることを意味する
?id rdfs:comment?comment. 
トリプルパターン 
rdfs:commentは<http://www.w3.org/2000/01/ rdf-schema#comment> 
というURIで目的語がコメントであることを意味する
?id rdfs:label?label. 
?id rdfs:comment?comment. 
トリプルパターン 
同じ名前の変数(?id)は 
AND検索を意味します 
URIが同一のデータは同じ行に 
まとまって出力されます
(1) シンプルなSPARQLクエリ 
•全てのトリプルデータを検索 
SELECT ?s ?p ?o WHERE 
{ 
?s ?p ?o. 
}
?s 
?p 
?o 
<http://ja.dbpedia.org/resource /東京都> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
"東京都" 
<http://ja.dbpedia.org/resource/東京都> 
<http://www.w3.org/2000/01/ rdf-schema#comment> 
“東京都(とうきょうと)は、日本 の都道府県の一つである。" 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/千葉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“山梨県” 
<http://ja.dbpedia.org/resource/千葉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“千葉県” 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“埼玉県” 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“神奈川県” 
検索対象
http://uedayou.net/sparql-mashup/test-endpoint/
(2) 述語が <http://www.w3.org/2000/01/rdf-schema#label> であるトリプルを取得 
•<http://www.w3.org/2000/01/rdf-schema#label>はデータ のラベル(名前)を示す場合によく利用されています。 
•省略形は「rdfs:label」 
SELECT ?s ?o WHERE 
{ 
?s <http://www.w3.org/2000/01/rdf-schema#label> ?o . 
} 
主語の 
指定 
述語の 
指定 
目的語 
の指定
?s 
?p 
?o 
<http://ja.dbpedia.org/resource /東京都> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
"東京都" 
<http://ja.dbpedia.org/resource/東京都> 
<http://www.w3.org/2000/01/ rdf-schema#comment> 
“東京都(とうきょうと)は、日本 の都道府県の一つである。" 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/千葉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“山梨県” 
<http://ja.dbpedia.org/resource/千葉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“千葉県” 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“埼玉県” 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“神奈川県” 
検索対象
http://uedayou.net/sparql-mashup/test-endpoint/
select distinct * where 
{ 
<http://ja.dbpedia.org/resource/東京都> ?p ?o . 
} 
(3)主語に<http://ja.dbpedia.org/resource/東京都> が指定されているトリプルを取得 
•<http://ja.dbpedia.org/resource/東京都>に関する データ(述語と目的語)全て検索 
主語の 
指定 
述語の 
指定 
目的語 
の指定
?s 
?p 
?o 
<http://ja.dbpedia.org/resource /東京都> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
"東京都" 
<http://ja.dbpedia.org/resource/東京都> 
<http://www.w3.org/2000/01/ rdf-schema#comment> 
“東京都(とうきょうと)は、日本 の都道府県の一つである。" 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/千葉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“山梨県” 
<http://ja.dbpedia.org/resource/千葉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“千葉県” 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“埼玉県” 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“神奈川県” 
検索対象
http://uedayou.net/sparql-mashup/test-endpoint/
(4) 東京都に隣接する県の名前 
1.東京都のURIから隣接する都道府県を表す <http://ja.dbpedia.org/property/隣接都道府県> を述語として持つ目的語を検索する 
2.さらに、検索された目的語を主語に指定して、そ のrdfs:labelを検索する 
•同じ変数(例えば?pref)を異なるトリプルパターン で記述すると、同じURIを持つもののみ検索される (AND検索) 
SELECT DISTINCT ?pref?label WHERE 
{ 
<http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> ?pref. 
?pref<http://www.w3.org/2000/01/rdf-schema#label> ?label. 
}
主語 
述語 
目的語 
<http://ja.dbpedia.org/resource /東京都> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
"東京都" 
<http://ja.dbpedia.org/resource/東京都> 
<http://www.w3.org/2000/01/ rdf-schema#comment> 
“東京都(とうきょうと)は、日本 の都道府県の一つである。" 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/千葉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://ja.dbpedia.org/resource/東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://ja.dbpedia.org/resource/山梨県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“山梨県” 
<http://ja.dbpedia.org/resource/千葉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“千葉県” 
<http://ja.dbpedia.org/resource/埼玉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“埼玉県” 
<http://ja.dbpedia.org/resource/神奈川県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“神奈川県” 
検索対象 
?pref 
?label 
「?pref」と同じURIを 
主語に持つトリプル 
を選択
http://uedayou.net/sparql-mashup/test-endpoint/
PREFIXによるURIの省略表記 
•URI記述はPREFIXを利用することで省略表記が可能 
•クエリ先頭行に以下のような形式で追加 
•PREFIX BINDNAME: <URI> 
•例:PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
•PREFIX を指定するとURIを省略表記に 
•<http://www.w3.org/2000/01/rdf-schema#label> 
•PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
•rdfs:label
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dbpedia-ja: <http://ja.dbpedia.org/resource/> PREFIX prop-ja: <http://ja.dbpedia.org/property/> 
主語 
述語 
目的語 
<http://ja.dbpedia.org/resource/ 東京都> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
"東京都" 
<http://ja.dbpedia.org/resource/ 東京都> 
<http://www.w3.org/2000/01/ rdf-schema#comment> 
“東京都(とうきょうと)は、日本 の都道府県の一つである。" 
<http://ja.dbpedia.org/resource/ 東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/ 山梨県> 
<http://ja.dbpedia.org/resource/ 東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/ 千葉県> 
<http://ja.dbpedia.org/resource/ 東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/ 埼玉県> 
<http://ja.dbpedia.org/resource/ 東京都> 
<http://ja.dbpedia.org/property/隣接都道府県> 
<http://ja.dbpedia.org/resource/ 神奈川県> 
<http://ja.dbpedia.org/resource/ 山梨県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“山梨県” 
<http://ja.dbpedia.org/resource/ 千葉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
<http://ja.dbpedia.org/resource/ 埼玉県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“埼玉県” 
<http://ja.dbpedia.org/resource/ 神奈川県> 
<http://www.w3.org/2000/01/ rdf-schema#label> 
“神奈川県” 
dbpedia-jp:東京都 
rdfs:label 
dbpedia-jp:東京都 
rdfs:comment 
dbpedia-jp:東京都 
prop-ja:隣接都道府県 
dbpedia-jp:山梨県 
dbpedia-jp:東京都 
prop-ja:隣接都道府県 
dbpedia-jp:千葉県 
dbpedia-jp:東京都 
prop-ja:隣接都道府県 
dbpedia-jp:埼玉県 
dbpedia-jp:東京都 
prop-ja:隣接都道府県 
dbpedia-jp:神奈川県 
dbpedia-jp:山梨県 
rdfs:label 
dbpedia-jp:千葉県 
rdfs:label 
“千葉県” 
dbpedia-jp:埼玉県 
rdfs:label 
“埼玉県” 
dbpedia-jp:神奈川県 
rdfs:label 
“神奈川県”
(5) 「東京都に隣接する県の名前」 のクエリを省略して書くと… 
SELECT DISTINCT ?pref?label WHERE 
{ 
<http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> ?pref. 
?pref<http://www.w3.org/2000/01/rdf-schema#label> ?label. 
} 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dbpedia-ja: <http://ja.dbpedia.org/resource/> PREFIX prop-ja: <http://ja.dbpedia.org/property/> 
SELECT DISTINCT ?pref?label WHERE 
{ 
dbpedia-ja:東京都prop-ja:隣接都道府県?pref. 
?prefrdfs:label?label . 
}
http://uedayou.net/sparql-mashup/test-endpoint/
(6) 同一主語の省略 
•同じ主語から異なる複数の述語を指定する場合、 目的語のあとのピリオド「.」をセミコロン「;」にするこ とで次のトリプルパターンの主語を省略できます 
SELECT DISTINCT *WHERE { 
dbpedia-ja:東京都rdfs:label?label . 
dbpedia-ja:東京都rdfs:comment?comment . 
} 
SELECT DISTINCT *WHERE { 
dbpedia-ja:東京都rdfs:label?label ; 
rdfs:comment?comment . 
} 
省略を終了するトリプルパターン の最後は必ずピリオドにすること 
主語を 
省略 
できる
http://uedayou.net/sparql-mashup/test-endpoint/
SPARQLの便利な検索機能 
検索句 
機能 
DISTINCT 
重複する検索結果を除外 
LIMIT 
検索結果の上限を設定 
OFFSET 
検索結果の取得位置を指定 
ORDER BY 
検索結果の並び順を指定 
OPTIONAL 
OPTIONAL内は任意検索 
FILTER 
検索結果のフィルタリングが可能 
REGEX 
正規表現による検索が可能 
BIND 
新たな変数への割り当てが可能 
CONCAT 
文字列の結合が可能 
REPLACE 
文字列の置き換えが可能(正規表現使用可) 
SUBSTR 
文字列の切り出しが可能 
COUNT 
検索件数を表示 
GROUP BY 
変数のグループ化が可能 
HAVING 
グループ化した変数の絞込みが可能 
各機能の詳しいの説明はSlideShareの資料を参照してください
SPARQLの 便利な検索機能
DISTINCT 
•「SELECT」と変数の間に「DISTINCT」を入れると指定 した全ての変数で重複したパターンがあった場合、 検索結果から除外される 
SELECT DISTINCT ?s ?p ?o WHERE 
{ 
?s ?p ?o. 
}
LIMIT 
•検索結果の上限を設定 
•WHERE{}の後ろに記述 
•「LIMIT 10」で最大10件取得 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT DISTINCT ?uri?label WHERE 
{ 
?urirdfs:label?label . 
} 
LIMIT 10
OFFSET 
•検索結果の取得位置を指定 
•WHERE{}の後ろに記述 
•「OFFSET 100」は100番目から取得 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT DISTINCT ?uri?label WHERE 
{ 
?urirdfs:label?label . 
} 
LIMIT 10 
OFFSET 100
ORDER BY / ORDER BY DESC 
•検索結果の並び順を指定 
•WHERE{}の後ろに記述 
•「ORDER BY ?created」で作成日昇順にソート 
•「ORDER BY DESC(?created)」なら作成日降順 
•LIMIT、OFFSETがあれば、その前に挿入 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT DISTINCT ?uri?created WHERE 
{ 
?uridc:created?created. 
} 
ORDER BY ?created 
LIMIT 10 
OFFSET 100 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT DISTINCT ?uri?created WHERE 
{ 
?uridc:created?created. 
} 
ORDER BY DESC(?created) 
LIMIT 10 
OFFSET 100
OPTIONAL 
•OPTIONAL{ … } 内のグラフパターンはパターンに一 致しなくても、OPTIONAL外のパターンに一致すれ ば検索される 
•WHERE{ … } 内に記述 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT DISTINCT ?uri?label ?description WHERE 
{ 
?urirdfs:label?label . 
OPTIONAL { 
?uridc:description?description. 
} 
}
FILTER 
•検索結果のフィルタリングが可能 
•WHERE{ … } 内に記述 
•dcterms:issuedが2000(年)以上のものを検索 
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dcterms: <http://purl.org/dc/terms/> 
SELECT DISTINCT ?uri?label ?issued WHERE 
{ 
?urirdfs:label?label ; 
dcterms:issued?issued . 
FILTER ( ?issued >= 2000) 
}
REGEX 
•正規表現による検索が可能 
•FILTER と組み合わせて利用する 
•WHERE{ … } 内に記述 
•書き方 
•REGEX( 検索対象の変数, 正規表現) 
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> 
SELECT DISTINCT ?uri?label WHERE 
{ 
?urirdfs:label?label . 
FILTER ( REGEX ( ?label, “^東京.*$” ) ) 
} 
?labelを「東京」で前方一致検索
BIND / CONCAT 
•BIND:指定した変数・データを別の名前の変数に 割り当てが可能 
•BIND( [割り当てるデータ]AS [変数] ) 
•CONCAT:変数や文字列同士の結合が可能、値は リテラルに 
•CONCAT( [変数or文字列] , [変数or文字列] , … ) 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT DISTINCT ?uri?label ?description ?text WHERE 
{ 
?urirdfs:label?label ; 
dc:description?description . 
BIND( CONCAT( “<h1>” , ?label ,“</h1><p>” , ?description,“</p>” ) AS?text ) 
} 
?text は「<h1>[?labelのデータ]</h1><p>[?descriptionのデータ]</p>」になる
REPLACE 
•文字列の置き換えが可能 
•書き方 
REPLACE( 置換対象の変数, 置換対象の文字列, 置換後の文字列) 
•BIND を使うと、置き換わった文字列を変数に設定できる 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT DISTINCT ?uri?label ?description ?text WHERE 
{ 
?urirdfs:label?label ; 
dc:description?description . 
BIND( REPLACE( ?description , “京都”, “大阪” ) AS ?text ) 
}
SUBSTR 
•文字列の切り出しが可能 
•書き方 
SUBSTR( 切出対象の変数, 開始位置, 切り出し文字数) 
•BIND を使うと、置き換わった文字列を変数に設定 できる 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT DISTINCT ?uri?label ?description ?text WHERE 
{ 
?urirdfs:label?label ; 
dc:description?description . 
BIND( SUBSTR( ?description , 10, 5) AS ?text ) 
}
COUNT 
•変数のデータ総数を計算 
SELECT COUNT(*)WHERE 
{ 
?s ?p ?o . 
} 
全トリプル数を計算
GROUP BY / HAVING 
•GROUP BY:指定の変数でデータを集約(グループ 化)する 
•HAVING:グループ化されたデータの絞込み 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT ?creator ( COUNT( ?uri) AS ?count ) 
WHERE 
{ 
?uridc:creator?creator . 
} 
GROUP BY ?creator 
ORDER BY DESC(?count) 
HAVING( COUNT(?uri) >= 5 ) 
COUNT(?uri)の 
結果が?countに 
?creator(作者)で集約 
異なる主語が5つ以上 
ある作者のみ対象
FROM 
•トリプルデータには、その全体を現す名前(グラフ 名)が指定されています 
•FROMを使うとグラフ名ごとに検索が行えます 
<http://lod.sfc.keio.ac.jp/challenge2014/show_status.php?id=d001> 
というグラフ名がついているトリプルデータを対象とする 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT DISTINCT ?uri?label 
FROM <http://lod.sfc.keio.ac.jp/challenge2014/show_status.php?id=d001> 
WHERE 
{ 
?urirdfs:label?label . 
}
http://lod.sfc.keio.ac.jp/challenge2013 
/show_status.php?id=d030 
http://lod.sfc.keio.ac.jp/challenge2014 
/show_status.php?id=d001 
グラフ名ごと 
に検索が可能主語述語目的語 
dbpedia-ja:大阪府rdfs:label “大阪府" 
dbpedia-ja:大阪府prop-ja:隣接都道府県dbpedia-ja:兵庫県 
dbpedia-ja:大阪府prop-ja:隣接都道府県dbpedia-ja:和歌山県 
dbpedia-ja:大阪府prop-ja:隣接都道府県dbpedia-ja:京都府 
dbpedia-ja:大阪府prop-ja:隣接都道府県dbpedia-ja:奈良県 
dbpedia-ja:兵庫県rdfs:label “兵庫県” 
dbpedia-ja:和歌山県rdfs:label “和歌山県” 
dbpedia-ja:京都府rdfs:label “京都府” 
dbpedia-ja:奈良県rdfs:label “奈良県” 
FROM 
LODチャレンジエンドポイントでは、 
エントリーページのURLが 
グラフ名になっています
データ型のキャスト 
•STR(?data) 
•データを文字列に変換 
•URI(?data) 
•データをURIに変換 
•xsd:integer(?data) 
•データを整数値型に変換 
•xsd:float(?data) / xsd:double(?data) 
•データを浮動小数点型に変換 
•xsd:dateTime(?data) 
•データをdateTime型に変換 
※PREFIX xsd:<http://www.w3.org/2001/XMLSchema#> があることが前提
エンドポイントの結果(JSON)を プログラムで取得するには? 
{ "head": { "vars": ["link", "title", "lat", "long" ] }, 
"results": { 
"bindings": [ 
{ "link": { "type": "uri", 
"value": "http://linkdata.org/resource/rdf1s933i#8542" }, 
"title": { "type": "literal", "xml:lang": "ja", 
"value": "福島消防署上福島出張所"}, 
"lat": { "type": "typed-literal", 
"datatype": "http://www.w3.org/2001/XMLSchema#float", 
"value": "34.6936" }, 
"long": { "type": "typed-literal", 
"datatype": "http://www.w3.org/2001/XMLSchema#float", 
"value": "135.482" } 
varresults = json.results.bindings; 
for ( vari=0 ; i< results.length; i++ ) { 
varresult = results[i]; 
vartitle = result.title.value; 
} 
$results = $json[“results”][“bindings”]; 
foreach( $results as $result ) { 
$title = $result[“title”][“value”]; 
} 
Javascript 
PHP

SPARQLでマッシュアップ -LOD活用のための技術紹介-

  • 1.
    SPARQLでマッシュアップ -LOD活用のための技術紹介- 上田洋 LODチャレンジJapan実行委員会 特定非営利活動法人リンクト・オープン・データ・イニシアティブ 第4回Linked Open Data ハッカソン関西with LODC2014 ×UDC2014 2014.12.7
  • 2.
    LOD・オープンデータとの関わり •特定非営利活動法人リンクト・オープン・データ・ イニシアティブ •2014年より理事 •関西支部支部長補佐 •Linked Open Data チャレンジJapan •2014年度より実行委員 •オープンデータを利用するWebアプリを公開中 •http://uedayou.net/で公開中
  • 3.
    SPARQL(SPARQL Protocol andRDF Query Language)
  • 4.
    SPARQL •RDF(LOD)用の汎用クエリ言語 •RDF(LOD)用のデータベースからトリプル(3つ組)データを検索して、表形式でデータが取得できます いろんなデータベース で使えます 扱いやすい! PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT * WHERE { ?urirdfs:label?label . } LIMIT 10 ?uri ?label http://ja.dbpedia.org/resource/岩手県 "岩手県" http://ja.dbpedia.org/resource/石川県 "石川県" http://ja.dbpedia.org/resource/愛媛県 "愛媛県" http://ja.dbpedia.org/resource/岡山県 "岡山県"
  • 5.
    SPARQLで検索できるデータが増えています データ種別 WebAPI Wikipedia DBPedia Wikipediaオントロジー 行政データ データシティ鯖江 都道府県・市区町村コード情報 Open Data METI イベントデータ ヨコハマ・アート・LOD 博物館データ Europeana LODAC Museum The British Museum 図書館データ The British National Bibliography Web NDL Authorities 地理データ Linked Geo Data LODACLocation 気象データ 気象庁XML用API 生物種データ LODACSpecies この他にも多くのオープンデータがSPARQLで検索できます
  • 6.
  • 7.
  • 10.
  • 11.
    SparqlEPCU •中部大学年岡研究室が開発・運営するWebサービス •自分のデータで簡単にSPARQLエンドポイント(SPARQLで検索可能なWeb API)が設置可能 •Linked Open DataチャレンジJapan 2012 アプリケーション部門 最優秀賞受賞作品 http://lod.sfc.keio.ac.jp/blog/?p=1071
  • 12.
    Twitter/Facebook でログイン Projectページで 「プロジェクトの作成」 ボタンをクリック プロジェクトID (半角英数) タイトルを 入力して 「作成」 「データ登録」タブ からファイルを アップロード (ttl,rdf/xml, nt対応) して「登録」 完成! ProjectAPIURLから SPARQLが使えます! 1 2 3 4
  • 13.
  • 14.
    LOD推奨形式RDFとは (Resource DescriptionFramework) •「主語」「述語」「目的語」を1つのセット(トリプル、 三つ組み)として記述 主語 (Subject) 目的語 (Object) 述語 (Predicate) 東京都 神奈川県 隣の県 例えば…
  • 15.
    トリプルデータを表形式に変換 主語 述語 目的語 dbpedia: 東京都 rdfs:label "東京都" dbpedia: 東京都 rdfs:comment “東京都(とうきょうと)は、日本 の都道府県の一つである。" dbpedia: 大阪府 rdfs:label “大阪府” dbpedia: 大阪府 rdfs:comment "大阪府(おおさかふ)は、近畿 地方(関西地方)に属する日本 の都道府県の一つ。" dbpedia: 京都府 rdfs:label “京都府” dbpedia: 京都府 rdfs:comment "京都府(きょうとふ)は、日本 国・近畿地方の都道府県。" id label comment dbpedia: 東京都 "東京都" “東京都(とうきょうと)は、日本 の都道府県の一つである。" dbpedia: 大阪府 “大阪府” "大阪府(おおさかふ)は、近畿 地方(関西地方)に属する日本 の都道府県の一つ。" dbpedia: 京都府 “京都府” "京都府(きょうとふ)は、日本 国・近畿地方の都道府県。" 変換! SPARQLなら簡単にできます!
  • 16.
    HTML・CSV・XML・JSONなど さまざまな形式で出力可能! •formatパラメータを変更するだけ JSON http://db.lodc.jp/sparql?query=...&format=json XML http://db.lodc.jp/sparql?query=...&format=xml CSV http://db.lodc.jp/sparql?query=...&format=csv “format”はSPARQLエンドポイントによって異なる場合があります
  • 18.
  • 19.
    SPARQLでマッシュアップ •SPARQLクエリを書くだけでプログラミングなしに いろんなアプリが作れます •全てWebブラウザがあれば動作します •Webサーバは必要ありません!
  • 20.
    SPARQLでマッシュアップ •地図アプリ •leaflet-simple-sparql •クイズアプリ •SlickQuiz-SPARQL •カレンダーアプリ •fullcalendar-sparql-js •地図とタイムラインビジュアライズアプリ •SPARQL Timeliner •地図で空白地域ビジュアライズアプリ •○○危険地帯 •書籍検索アプリ •booksearch-sparql-js •データビジュアライズツール •sgvizler
  • 21.
  • 22.
    使い方:leaflet-simple-sparql •githubのページから「Download ZIP」ボタンを押して、ソースコード一式をダウンロード •解凍して「config.js」にエンドポイントとクエリを記述する •index.htmlをブラウザで開く var endpoint = "http://ja.dbpedia.org/sparql"; var query = (function () {/* PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> select * where { ?link rdfs:label ?title; geo:lat ?lat; geo:long ?long. } limit 1000 */}).toString().match(/¥n([¥s¥S]*)¥n/)[1];
  • 23.
  • 24.
    使い方:SlickQuiz-SPARQL •githubのページから「Download ZIP」ボタンを押して、ソースコード一式をダウンロード •解凍して「config.js」にエンドポイントとクエリを記述する •index.htmlをブラウザで開く varendpoint = "http://lodcu.cs.chubu.ac.jp/SparqlEPCU/api/yokohama_quiz"; varquery = (function () {/* select distinct * where { ?uri<http://linkdata.org/property/rdf1s560i#question> ?question; <http://linkdata.org/property/rdf1s560i#choice1> ?choise1; <http://linkdata.org/property/rdf1s560i#choice2> ?choise2; <http://linkdata.org/property/rdf1s560i#choice3> ?choise3; <http://linkdata.org/property/rdf1s560i#choice4> ?choise4; <http://linkdata.org/property/rdf1s560i#answer> ?answer_no; <http://linkdata.org/property/rdf1s560i#kaisetsu> ?kaisetsu. bind(concat('</p>解説:',str(?kaisetsu),'</p>') as ?correct) bind(concat('</p>解説:',str(?kaisetsu),'</p>') as ?incorrect) } ORDER BY RAND() LIMIT 10 */}).toString().match(/¥n([¥s¥S]*)¥n/)[1];
  • 25.
    SlickQuiz-SPARQL用の データの作り方 •データは簡単に作成できます。 •LinkData.org の「横浜検定問題・解答集」と同じよう にデータを作るだけ •http://linkdata.org/work/rdf1s560i データを作って「ご当地検定アプリ」作りませんか?
  • 26.
  • 27.
    使い方:fullcalendar-sparql-js •githubのページから「Download ZIP」ボタンを押して、ソースコード一式をダウンロード •解凍して「config.js」にエンドポイントとクエリを記述する •index.htmlをブラウザで開く varendpoint = "http://archive.yafjp.org/test/inspection.php"; varquery = (function () {/* PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX schema: <http://schema.org/> PREFIX event: <http://fp.yafjp.org/terms/event#> SELECT * WHERE{ ?uria event:Event; schema:name?title; schema:startDate?start; schema:endDate?end; dc:description?description. } */}).toString().match(/¥n([¥s¥S]*)¥n/)[1];
  • 28.
    地図とタイムラインの ビジュアライズアプリ •SPARQLTimeliner •http://uedayou.net/SPARQLTimeliner/
  • 29.
    使い方:SPARQL Timeliner エンドポイントのURLを入力 クエリを入力 •http://uedayou.net/SPARQLTimeliner を開いてエンドポイントURLとクエリを入力して 「Load>>」ボタンをクリック
  • 30.
    使い方:SPARQL Timeliner •以下のルールに従ってクエリを作成してください •詳しい使い方は以下の資料にまとめています •http://www.slideshare.net/uedayou/sparql-timeliner- 28905905
  • 31.
    トイレ危険地帯 •Linked OpenData チャレンジ2013 受賞作品 •鯖江市が公開するオープンデータのうち、公衆トイ レの位置を利用してトイレのない地域をWebアプリ でビジュアライズ http://y4ashida.github.io/toilet/
  • 32.
  • 33.
  • 34.
    ○○危険地帯の使い方 1.「Download ZIP」ボタンを押してソースコードをダウンロード 2.ZIPファイルを解凍 3.config.js の書き換える 4. Index.html をブラウザで開く SPARQLを書きます
  • 35.
    config.js の書き方 //SPARQLエンドポイントを指定 varendpoint = "http://db.lodc.jp/sparql"; // SPARQLクエリを指定 varquery = (function () {/* SELECT DISTINCT * FROM <http://lod.sfc.keio.ac.jp/challenge2013/show_status.php?id=d030> WHERE{ ?uri<http://lodosaka.hozo.jp/category_1> "公衆トイレ"@ja ; <http://www.w3.org/2003/01/geo/wgs84_pos#lat> ?latitude ; <http://www.w3.org/2003/01/geo/wgs84_pos#long> ?longitude . } */}).toString().match(/¥n([¥s¥S]*)¥n/)[1]; // 中心位置を指定 varinitial_latitude=34.68206400648744; varinitial_longitude=135.49816131591797; // ズーム率を指定 varinitial_zoom= 11; SPARQL クエリ SPARQL エンドポイント
  • 36.
    大阪市のいろんな危険地帯を作っ てみよう! //SPARQLエンドポイントを指定 varendpoint = "http://db.lodc.jp/sparql"; // SPARQLクエリを指定 varquery = (function () {/* SELECT DISTINCT * FROM <http://lod.sfc.keio.ac.jp/challenge2013/show_status.php?id=d030> WHERE{ ?uri<http://lodosaka.hozo.jp/category_1> "公衆トイレ"@ja ; <http://www.w3.org/2003/01/geo/wgs84_pos#lat> ?latitude ; <http://www.w3.org/2003/01/geo/wgs84_pos#long> ?longitude . } LIMIT 1000 */}).toString().match(/¥n([¥s¥S]*)¥n/)[1]; // 中心位置を指定 varinitial_latitude=34.68206400648744; varinitial_longitude=135.49816131591797; // ズーム率を指定 varinitial_zoom= 11; ここのカテゴリを変えると いろんな危険地帯が 作れます 例: “学校・保育所”@ja “名所・旧跡”@ja “警察・消防”@ja “医療・福祉”@ja “公園・スポーツ”@ja “駅・バス停”@ja …
  • 37.
  • 38.
    使い方:booksearch-sparql-js •githubのページから「Download ZIP」ボタンを押して、ソースコード一式をダウンロード •解凍して「config.js」にエンドポイントとクエリを記述する •?uriに書籍URI、?title に書籍タイトル、?description に詳細情 報が入るようにクエリを記述してください。 •{% QUERY %} が検索文字列に置き換えられます。 •index.htmlをブラウザで開く // SPARQLエンドポイントURL varendpoint = "http://lodcu.cs.chubu.ac.jp/SparqlEPCU/api/kyotobook_list"; // SPARQLクエリ(検索用) varlist_query= (function () {/* select distinct ?uri?title ?description where { ?uri<http://linkdata.org/property/rdf1s1294i#title> ?title; <http://linkdata.org/property/rdf1s1294i#Summary> ?description. filter(regex(str(?title), '.*?{% QUERY %}.*?')) } */}).toString().match(/¥n([¥s¥S]*)¥n/)[1];
  • 39.
    使い方:booksearch-sparql-js •config.js のprop_labelsにURIとそのラベルを設定しておくと、詳細表示の際にURIをラベルに置き換 わります。 varprop_labels= { "http://purl.org/dc/terms/title":"タイトル", "http://purl.org/dc/elements/1.1/creator":"著者", …
  • 40.
  • 41.
    使い方:sgvizler •以下のコードをHTMLファイルに貼り付けて保存してブラウザで開くだけ <scripttype="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript" id="sgvzlr_script" src="http://sgvizler.googlecode.com/svn/release/0.5/sgvizler.js"></script> <script type="text/javascript"> <!--$(document).ready(sgvizler.go()); --> </script> <div id=“sgvizler-sample” data-sgvizler-endpoint ="http://lodcu.cs.chubu.ac.jp/SparqlEPCU/api/kyotobook_list" data-sgvizler-query=“ SELECT ?year (count(?uri) AS ?noOfUri) WHERE { ?uri<http://linkdata.org/property/rdf1s1294i#Year> ?year. }GROUP BY ?year ORDER BY DESC(?noOfUri) “ data-sgvizler-chart="gBarChart" data-sgvizler-loglevel="2" data-sgvizler-chart-options="title=Number of instances" style="width:2000px; height:2500px;"></div> •以下で雛形コードをダウンロードできます •http://uedayou.net/sparql-mashup/sgvizler-sample.html
  • 42.
    使い方:sgvizler <div id=“sgvizler-sample” data-sgvizler-endpoint ="http://lodcu.cs.chubu.ac.jp/SparqlEPCU/api/kyotobook_list" data-sgvizler-query=“ SELECT ?year (count(?uri) AS ?noOfUri) WHERE { ?uri<http://linkdata.org/property/rdf1s1294i#Year> ?year. }GROUP BY ?year ORDER BY DESC(?noOfUri) “ data-sgvizler-chart="gBarChart" data-sgvizler-loglevel="2" data-sgvizler-chart-options=“title=出版年別ランキング" style="width:800px; height:500px;"></div> クエリを記述 グラフの 種類を指定 エンドポイントを指定 グラフタイトル を記述 Idを指定
  • 43.
    例で利用するデータ •京都が出てくる本のデータ •京都岡崎にある図書館で働く司書の方々が中心のグループ「ししょまろはん」が作成・公開する京都が舞台の 小説やマンガ・ライトノベル等のデータ •作品の舞台となった京都府内の位置データや司書さん のおすすめ度もデータ化される •LODチャレンジJapan2014データセット部門応募作品 •LODチャレンジ2011-2013応募作品メタデータ どちらも LODチャレンジ応募作品のSPARQLエンドポイント(試行版) で検索できます
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
    クエリの書き方 (棒グラフ、円グラフの場合) •「data-sgvizler-chart」には以下を指定 •円グラフ:「gPieChart」 •縦棒グラフ:「gColumnChart」 •横棒グラフ:「gBarChart」 •GROUP BY を使ってデータをグループ化する •COUNTで出現回数を計算 PREFIX dcterms: <http://purl.org/dc/terms/> SELECT ?year (COUNT(?uri) AS ?noOfUri) WHERE { ?uridcterms:issued?year. } GROUP BY ?year ORDER BY DESC(?noOfUri)
  • 50.
  • 51.
  • 52.
    クエリの書き方 (無指向グラフの場合) selectdistinct ?title1 ?title2 from <http://lod.sfc.keio.ac.jp/challenge/entries> where { ?s <http://purl.org/dc/terms/relation> ?o. ?s <http://purl.org/dc/terms/title> ?title1. ?o <http://purl.org/dc/terms/title> ?title2. } •無指向グラフの場合 •「data-sgvizler-chart」には「gForceGraph」を指定 •SELECTで二つのラベルが入るようにクエリを記述
  • 53.
  • 54.
    ハンズオン SPARQLの書き方 事前にブラウザにhttp://uedayou.net/sparql-mashup/ を開いておいてください
  • 55.
    URI(IRI)とリテラル •URI(IRI) :<http://ja.dbpedia.org/resource/東京都> •「<」「>」で挟まれた文字列 •人・もの・出来事などを指し示すID •指定したURIを同じURIを含むデータが検索される •リテラル: “東京” , “100” , “2014-12-07” … •「”」で挟まれた文字列 •データそのもの(string, integer, float他) •指定した文字列と同じ文字列を含むデータが検索され る •目的語以外は指定できない
  • 56.
    主語 述語 目的語 <http://ja.dbpedia.org/resource /東京都> <http://www.w3.org/2000/01/ rdf-schema#label> "東京都" <http://ja.dbpedia.org/resource/東京都> <http://www.w3.org/2000/01/ rdf-schema#comment> “東京都(とうきょうと)は、日本 の都道府県の一つである。" <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/山梨県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/千葉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/埼玉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/神奈川県> <http://ja.dbpedia.org/resource/山梨県> <http://www.w3.org/2000/01/ rdf-schema#label> “山梨県” <http://ja.dbpedia.org/resource/千葉県> <http://www.w3.org/2000/01/ rdf-schema#label> “千葉県” <http://ja.dbpedia.org/resource/埼玉県> <http://www.w3.org/2000/01/ rdf-schema#label> “埼玉県” <http://ja.dbpedia.org/resource/神奈川県> <http://www.w3.org/2000/01/ rdf-schema#label> “神奈川県” RDFのデータベース
  • 57.
    URIとリテラル 主語 述語 目的語 <http://ja.dbpedia.org/resource /東京都> <http://www.w3.org/2000/01/ rdf-schema#label> "東京都" <http://ja.dbpedia.org/resource/東京都> <http://www.w3.org/2000/01/ rdf-schema#comment> “東京都(とうきょうと)は、日本 の都道府県の一つである。" <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/山梨県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/千葉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/埼玉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/神奈川県> <http://ja.dbpedia.org/resource/山梨県> <http://www.w3.org/2000/01/ rdf-schema#label> “山梨県” <http://ja.dbpedia.org/resource/千葉県> <http://www.w3.org/2000/01/ rdf-schema#label> “千葉県” <http://ja.dbpedia.org/resource/埼玉県> <http://www.w3.org/2000/01/ rdf-schema#label> “埼玉県” <http://ja.dbpedia.org/resource/神奈川県> <http://www.w3.org/2000/01/ rdf-schema#label> “神奈川県”
  • 58.
  • 59.
    SELECT •SELECT の後ろに続く変数(?で始まる文字列)に格納されたデータを表形式で取得 •変数名は必ずWHERE文の中で指定したものを記述す ること •例では?s、?p、?o SELECT ?s ?p ?o WHERE { ?s ?p ?o. }
  • 60.
    SELECT •アスタリスク「*」を指定すると、WHERE文の中の 全ての変数を指定したことと同じになる •?s、?p、?o が抽出される SELECT * WHERE { ?s ?p ?o . } SELECT ?s ?p ?o WHERE { ?s ?p ?o. } =
  • 61.
    WHERE •WHERE {} 内に検索したいトリプルパターンを書く SELECT ?s ?p ?o WHERE { ?s ?p ?o . }
  • 62.
    基本構造 •トリプルパターンを指定するために、3つの変数または URI、リテラル(目的語のみ)を1セットで書く •変数:?で始まる文字列、任意のURIまたはリテラルが入る •1セットの終わりには必ずピリオド「.」をつける SELECT ?s ?p ?o WHERE { ?s ?p ?o. } 主語の 指定 述語の 指定 目的語 の指定 必ずピリオド で終わる
  • 63.
    変数とトリプルパターン •変数:?s ,?p , ?o, ?label, ?comment … •「?」で始まる文字列 •パターンに当てはまるデータ全てが格納される •検索式内の同一変数は同じデータが入るという意味に ?id rdfs:label?label. トリプルパターン id label dbpedia: 東京都 "東京都" dbpedia: 大阪府 “大阪府” dbpedia: 京都府 “京都府” rdfs:labelは<http://www.w3.org/2000/01/ rdf-schema#label> というURIで目的語がラベルであることを意味する
  • 64.
    ?id rdfs:comment?comment. トリプルパターン rdfs:commentは<http://www.w3.org/2000/01/ rdf-schema#comment> というURIで目的語がコメントであることを意味する
  • 65.
    ?id rdfs:label?label. ?idrdfs:comment?comment. トリプルパターン 同じ名前の変数(?id)は AND検索を意味します URIが同一のデータは同じ行に まとまって出力されます
  • 66.
  • 67.
    ?s ?p ?o <http://ja.dbpedia.org/resource /東京都> <http://www.w3.org/2000/01/ rdf-schema#label> "東京都" <http://ja.dbpedia.org/resource/東京都> <http://www.w3.org/2000/01/ rdf-schema#comment> “東京都(とうきょうと)は、日本 の都道府県の一つである。" <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/山梨県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/千葉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/埼玉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/神奈川県> <http://ja.dbpedia.org/resource/山梨県> <http://www.w3.org/2000/01/ rdf-schema#label> “山梨県” <http://ja.dbpedia.org/resource/千葉県> <http://www.w3.org/2000/01/ rdf-schema#label> “千葉県” <http://ja.dbpedia.org/resource/埼玉県> <http://www.w3.org/2000/01/ rdf-schema#label> “埼玉県” <http://ja.dbpedia.org/resource/神奈川県> <http://www.w3.org/2000/01/ rdf-schema#label> “神奈川県” 検索対象
  • 68.
  • 69.
    (2) 述語が <http://www.w3.org/2000/01/rdf-schema#label>であるトリプルを取得 •<http://www.w3.org/2000/01/rdf-schema#label>はデータ のラベル(名前)を示す場合によく利用されています。 •省略形は「rdfs:label」 SELECT ?s ?o WHERE { ?s <http://www.w3.org/2000/01/rdf-schema#label> ?o . } 主語の 指定 述語の 指定 目的語 の指定
  • 70.
    ?s ?p ?o <http://ja.dbpedia.org/resource /東京都> <http://www.w3.org/2000/01/ rdf-schema#label> "東京都" <http://ja.dbpedia.org/resource/東京都> <http://www.w3.org/2000/01/ rdf-schema#comment> “東京都(とうきょうと)は、日本 の都道府県の一つである。" <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/山梨県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/千葉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/埼玉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/神奈川県> <http://ja.dbpedia.org/resource/山梨県> <http://www.w3.org/2000/01/ rdf-schema#label> “山梨県” <http://ja.dbpedia.org/resource/千葉県> <http://www.w3.org/2000/01/ rdf-schema#label> “千葉県” <http://ja.dbpedia.org/resource/埼玉県> <http://www.w3.org/2000/01/ rdf-schema#label> “埼玉県” <http://ja.dbpedia.org/resource/神奈川県> <http://www.w3.org/2000/01/ rdf-schema#label> “神奈川県” 検索対象
  • 71.
  • 72.
    select distinct *where { <http://ja.dbpedia.org/resource/東京都> ?p ?o . } (3)主語に<http://ja.dbpedia.org/resource/東京都> が指定されているトリプルを取得 •<http://ja.dbpedia.org/resource/東京都>に関する データ(述語と目的語)全て検索 主語の 指定 述語の 指定 目的語 の指定
  • 73.
    ?s ?p ?o <http://ja.dbpedia.org/resource /東京都> <http://www.w3.org/2000/01/ rdf-schema#label> "東京都" <http://ja.dbpedia.org/resource/東京都> <http://www.w3.org/2000/01/ rdf-schema#comment> “東京都(とうきょうと)は、日本 の都道府県の一つである。" <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/山梨県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/千葉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/埼玉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/神奈川県> <http://ja.dbpedia.org/resource/山梨県> <http://www.w3.org/2000/01/ rdf-schema#label> “山梨県” <http://ja.dbpedia.org/resource/千葉県> <http://www.w3.org/2000/01/ rdf-schema#label> “千葉県” <http://ja.dbpedia.org/resource/埼玉県> <http://www.w3.org/2000/01/ rdf-schema#label> “埼玉県” <http://ja.dbpedia.org/resource/神奈川県> <http://www.w3.org/2000/01/ rdf-schema#label> “神奈川県” 検索対象
  • 74.
  • 75.
    (4) 東京都に隣接する県の名前 1.東京都のURIから隣接する都道府県を表す<http://ja.dbpedia.org/property/隣接都道府県> を述語として持つ目的語を検索する 2.さらに、検索された目的語を主語に指定して、そ のrdfs:labelを検索する •同じ変数(例えば?pref)を異なるトリプルパターン で記述すると、同じURIを持つもののみ検索される (AND検索) SELECT DISTINCT ?pref?label WHERE { <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> ?pref. ?pref<http://www.w3.org/2000/01/rdf-schema#label> ?label. }
  • 76.
    主語 述語 目的語 <http://ja.dbpedia.org/resource /東京都> <http://www.w3.org/2000/01/ rdf-schema#label> "東京都" <http://ja.dbpedia.org/resource/東京都> <http://www.w3.org/2000/01/ rdf-schema#comment> “東京都(とうきょうと)は、日本 の都道府県の一つである。" <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/山梨県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/千葉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/埼玉県> <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/神奈川県> <http://ja.dbpedia.org/resource/山梨県> <http://www.w3.org/2000/01/ rdf-schema#label> “山梨県” <http://ja.dbpedia.org/resource/千葉県> <http://www.w3.org/2000/01/ rdf-schema#label> “千葉県” <http://ja.dbpedia.org/resource/埼玉県> <http://www.w3.org/2000/01/ rdf-schema#label> “埼玉県” <http://ja.dbpedia.org/resource/神奈川県> <http://www.w3.org/2000/01/ rdf-schema#label> “神奈川県” 検索対象 ?pref ?label 「?pref」と同じURIを 主語に持つトリプル を選択
  • 77.
  • 78.
    PREFIXによるURIの省略表記 •URI記述はPREFIXを利用することで省略表記が可能 •クエリ先頭行に以下のような形式で追加 •PREFIX BINDNAME: <URI> •例:PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> •PREFIX を指定するとURIを省略表記に •<http://www.w3.org/2000/01/rdf-schema#label> •PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> •rdfs:label
  • 79.
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>PREFIX dbpedia-ja: <http://ja.dbpedia.org/resource/> PREFIX prop-ja: <http://ja.dbpedia.org/property/> 主語 述語 目的語 <http://ja.dbpedia.org/resource/ 東京都> <http://www.w3.org/2000/01/ rdf-schema#label> "東京都" <http://ja.dbpedia.org/resource/ 東京都> <http://www.w3.org/2000/01/ rdf-schema#comment> “東京都(とうきょうと)は、日本 の都道府県の一つである。" <http://ja.dbpedia.org/resource/ 東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/ 山梨県> <http://ja.dbpedia.org/resource/ 東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/ 千葉県> <http://ja.dbpedia.org/resource/ 東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/ 埼玉県> <http://ja.dbpedia.org/resource/ 東京都> <http://ja.dbpedia.org/property/隣接都道府県> <http://ja.dbpedia.org/resource/ 神奈川県> <http://ja.dbpedia.org/resource/ 山梨県> <http://www.w3.org/2000/01/ rdf-schema#label> “山梨県” <http://ja.dbpedia.org/resource/ 千葉県> <http://www.w3.org/2000/01/ rdf-schema#label> <http://ja.dbpedia.org/resource/ 埼玉県> <http://www.w3.org/2000/01/ rdf-schema#label> “埼玉県” <http://ja.dbpedia.org/resource/ 神奈川県> <http://www.w3.org/2000/01/ rdf-schema#label> “神奈川県” dbpedia-jp:東京都 rdfs:label dbpedia-jp:東京都 rdfs:comment dbpedia-jp:東京都 prop-ja:隣接都道府県 dbpedia-jp:山梨県 dbpedia-jp:東京都 prop-ja:隣接都道府県 dbpedia-jp:千葉県 dbpedia-jp:東京都 prop-ja:隣接都道府県 dbpedia-jp:埼玉県 dbpedia-jp:東京都 prop-ja:隣接都道府県 dbpedia-jp:神奈川県 dbpedia-jp:山梨県 rdfs:label dbpedia-jp:千葉県 rdfs:label “千葉県” dbpedia-jp:埼玉県 rdfs:label “埼玉県” dbpedia-jp:神奈川県 rdfs:label “神奈川県”
  • 80.
    (5) 「東京都に隣接する県の名前」 のクエリを省略して書くと… SELECT DISTINCT ?pref?label WHERE { <http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県> ?pref. ?pref<http://www.w3.org/2000/01/rdf-schema#label> ?label. } PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dbpedia-ja: <http://ja.dbpedia.org/resource/> PREFIX prop-ja: <http://ja.dbpedia.org/property/> SELECT DISTINCT ?pref?label WHERE { dbpedia-ja:東京都prop-ja:隣接都道府県?pref. ?prefrdfs:label?label . }
  • 81.
  • 82.
    (6) 同一主語の省略 •同じ主語から異なる複数の述語を指定する場合、目的語のあとのピリオド「.」をセミコロン「;」にするこ とで次のトリプルパターンの主語を省略できます SELECT DISTINCT *WHERE { dbpedia-ja:東京都rdfs:label?label . dbpedia-ja:東京都rdfs:comment?comment . } SELECT DISTINCT *WHERE { dbpedia-ja:東京都rdfs:label?label ; rdfs:comment?comment . } 省略を終了するトリプルパターン の最後は必ずピリオドにすること 主語を 省略 できる
  • 83.
  • 84.
    SPARQLの便利な検索機能 検索句 機能 DISTINCT 重複する検索結果を除外 LIMIT 検索結果の上限を設定 OFFSET 検索結果の取得位置を指定 ORDER BY 検索結果の並び順を指定 OPTIONAL OPTIONAL内は任意検索 FILTER 検索結果のフィルタリングが可能 REGEX 正規表現による検索が可能 BIND 新たな変数への割り当てが可能 CONCAT 文字列の結合が可能 REPLACE 文字列の置き換えが可能(正規表現使用可) SUBSTR 文字列の切り出しが可能 COUNT 検索件数を表示 GROUP BY 変数のグループ化が可能 HAVING グループ化した変数の絞込みが可能 各機能の詳しいの説明はSlideShareの資料を参照してください
  • 85.
  • 86.
  • 87.
    LIMIT •検索結果の上限を設定 •WHERE{}の後ろに記述 •「LIMIT 10」で最大10件取得 PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT DISTINCT ?uri?label WHERE { ?urirdfs:label?label . } LIMIT 10
  • 88.
    OFFSET •検索結果の取得位置を指定 •WHERE{}の後ろに記述 •「OFFSET 100」は100番目から取得 PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT DISTINCT ?uri?label WHERE { ?urirdfs:label?label . } LIMIT 10 OFFSET 100
  • 89.
    ORDER BY /ORDER BY DESC •検索結果の並び順を指定 •WHERE{}の後ろに記述 •「ORDER BY ?created」で作成日昇順にソート •「ORDER BY DESC(?created)」なら作成日降順 •LIMIT、OFFSETがあれば、その前に挿入 PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT DISTINCT ?uri?created WHERE { ?uridc:created?created. } ORDER BY ?created LIMIT 10 OFFSET 100 PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT DISTINCT ?uri?created WHERE { ?uridc:created?created. } ORDER BY DESC(?created) LIMIT 10 OFFSET 100
  • 90.
    OPTIONAL •OPTIONAL{ …} 内のグラフパターンはパターンに一 致しなくても、OPTIONAL外のパターンに一致すれ ば検索される •WHERE{ … } 内に記述 PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT DISTINCT ?uri?label ?description WHERE { ?urirdfs:label?label . OPTIONAL { ?uridc:description?description. } }
  • 91.
    FILTER •検索結果のフィルタリングが可能 •WHERE{… } 内に記述 •dcterms:issuedが2000(年)以上のものを検索 PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT DISTINCT ?uri?label ?issued WHERE { ?urirdfs:label?label ; dcterms:issued?issued . FILTER ( ?issued >= 2000) }
  • 92.
    REGEX •正規表現による検索が可能 •FILTERと組み合わせて利用する •WHERE{ … } 内に記述 •書き方 •REGEX( 検索対象の変数, 正規表現) PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> SELECT DISTINCT ?uri?label WHERE { ?urirdfs:label?label . FILTER ( REGEX ( ?label, “^東京.*$” ) ) } ?labelを「東京」で前方一致検索
  • 93.
    BIND / CONCAT •BIND:指定した変数・データを別の名前の変数に 割り当てが可能 •BIND( [割り当てるデータ]AS [変数] ) •CONCAT:変数や文字列同士の結合が可能、値は リテラルに •CONCAT( [変数or文字列] , [変数or文字列] , … ) PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT DISTINCT ?uri?label ?description ?text WHERE { ?urirdfs:label?label ; dc:description?description . BIND( CONCAT( “<h1>” , ?label ,“</h1><p>” , ?description,“</p>” ) AS?text ) } ?text は「<h1>[?labelのデータ]</h1><p>[?descriptionのデータ]</p>」になる
  • 94.
    REPLACE •文字列の置き換えが可能 •書き方 REPLACE( 置換対象の変数, 置換対象の文字列, 置換後の文字列) •BIND を使うと、置き換わった文字列を変数に設定できる PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT DISTINCT ?uri?label ?description ?text WHERE { ?urirdfs:label?label ; dc:description?description . BIND( REPLACE( ?description , “京都”, “大阪” ) AS ?text ) }
  • 95.
    SUBSTR •文字列の切り出しが可能 •書き方 SUBSTR( 切出対象の変数, 開始位置, 切り出し文字数) •BIND を使うと、置き換わった文字列を変数に設定 できる PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT DISTINCT ?uri?label ?description ?text WHERE { ?urirdfs:label?label ; dc:description?description . BIND( SUBSTR( ?description , 10, 5) AS ?text ) }
  • 96.
    COUNT •変数のデータ総数を計算 SELECTCOUNT(*)WHERE { ?s ?p ?o . } 全トリプル数を計算
  • 97.
    GROUP BY /HAVING •GROUP BY:指定の変数でデータを集約(グループ 化)する •HAVING:グループ化されたデータの絞込み PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?creator ( COUNT( ?uri) AS ?count ) WHERE { ?uridc:creator?creator . } GROUP BY ?creator ORDER BY DESC(?count) HAVING( COUNT(?uri) >= 5 ) COUNT(?uri)の 結果が?countに ?creator(作者)で集約 異なる主語が5つ以上 ある作者のみ対象
  • 98.
    FROM •トリプルデータには、その全体を現す名前(グラフ 名)が指定されています •FROMを使うとグラフ名ごとに検索が行えます <http://lod.sfc.keio.ac.jp/challenge2014/show_status.php?id=d001> というグラフ名がついているトリプルデータを対象とする PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT DISTINCT ?uri?label FROM <http://lod.sfc.keio.ac.jp/challenge2014/show_status.php?id=d001> WHERE { ?urirdfs:label?label . }
  • 99.
    http://lod.sfc.keio.ac.jp/challenge2013 /show_status.php?id=d030 http://lod.sfc.keio.ac.jp/challenge2014 /show_status.php?id=d001 グラフ名ごと に検索が可能主語述語目的語 dbpedia-ja:大阪府rdfs:label “大阪府" dbpedia-ja:大阪府prop-ja:隣接都道府県dbpedia-ja:兵庫県 dbpedia-ja:大阪府prop-ja:隣接都道府県dbpedia-ja:和歌山県 dbpedia-ja:大阪府prop-ja:隣接都道府県dbpedia-ja:京都府 dbpedia-ja:大阪府prop-ja:隣接都道府県dbpedia-ja:奈良県 dbpedia-ja:兵庫県rdfs:label “兵庫県” dbpedia-ja:和歌山県rdfs:label “和歌山県” dbpedia-ja:京都府rdfs:label “京都府” dbpedia-ja:奈良県rdfs:label “奈良県” FROM LODチャレンジエンドポイントでは、 エントリーページのURLが グラフ名になっています
  • 100.
    データ型のキャスト •STR(?data) •データを文字列に変換 •URI(?data) •データをURIに変換 •xsd:integer(?data) •データを整数値型に変換 •xsd:float(?data) / xsd:double(?data) •データを浮動小数点型に変換 •xsd:dateTime(?data) •データをdateTime型に変換 ※PREFIX xsd:<http://www.w3.org/2001/XMLSchema#> があることが前提
  • 101.
    エンドポイントの結果(JSON)を プログラムで取得するには? {"head": { "vars": ["link", "title", "lat", "long" ] }, "results": { "bindings": [ { "link": { "type": "uri", "value": "http://linkdata.org/resource/rdf1s933i#8542" }, "title": { "type": "literal", "xml:lang": "ja", "value": "福島消防署上福島出張所"}, "lat": { "type": "typed-literal", "datatype": "http://www.w3.org/2001/XMLSchema#float", "value": "34.6936" }, "long": { "type": "typed-literal", "datatype": "http://www.w3.org/2001/XMLSchema#float", "value": "135.482" } varresults = json.results.bindings; for ( vari=0 ; i< results.length; i++ ) { varresult = results[i]; vartitle = result.title.value; } $results = $json[“results”][“bindings”]; foreach( $results as $result ) { $title = $result[“title”][“value”]; } Javascript PHP