Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

15,776 views

Published on

第4回 Linked Open Data ハッカソン関西 with LODC2014 × UDC2014
2014.12.7

Published in: Technology
  • Be the first to comment

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

  1. 1. SPARQLでマッシュアップ -LOD活用のための技術紹介- 上田洋 LODチャレンジJapan実行委員会 特定非営利活動法人リンクト・オープン・データ・イニシアティブ 第4回Linked Open Data ハッカソン関西with LODC2014 ×UDC2014 2014.12.7
  2. 2. LOD・オープンデータとの関わり •特定非営利活動法人リンクト・オープン・データ・ イニシアティブ •2014年より理事 •関西支部支部長補佐 •Linked Open Data チャレンジJapan •2014年度より実行委員 •オープンデータを利用するWebアプリを公開中 •http://uedayou.net/で公開中
  3. 3. SPARQL(SPARQL Protocol and RDF Query Language)
  4. 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. 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. 6. LODチャレンジもSPARQLで 検索できるデータベースを公開中! http://lodc.jp
  7. 7. http://lodc.jp/#dataset 過去3年分+αのオープンライセンス のデータセットが検索可能
  8. 8. SPARQLエンドポイント提供サービス “SparqlEPCU” http://lodcu.cs.chubu.ac.jp/SparqlEPCU/
  9. 9. SparqlEPCU •中部大学年岡研究室が開発・運営するWebサービス •自分のデータで簡単にSPARQLエンドポイント(SPARQLで検索 可能なWeb API)が設置可能 •Linked Open DataチャレンジJapan 2012 アプリケーション部門 最優秀賞受賞作品 http://lod.sfc.keio.ac.jp/blog/?p=1071
  10. 10. Twitter/Facebook でログイン Projectページで 「プロジェクトの作成」 ボタンをクリック プロジェクトID (半角英数) タイトルを 入力して 「作成」 「データ登録」タブ からファイルを アップロード (ttl,rdf/xml, nt対応) して「登録」 完成! ProjectAPIURLから SPARQLが使えます! 1 2 3 4
  11. 11. 詳しくはこちらの資料を http://www.slideshare.net/siramatu/sparqlmashup2
  12. 12. LOD推奨形式RDFとは (Resource Description Framework) •「主語」「述語」「目的語」を1つのセット(トリプル、 三つ組み)として記述 主語 (Subject) 目的語 (Object) 述語 (Predicate) 東京都 神奈川県 隣の県 例えば…
  13. 13. トリプルデータを表形式に変換 主語 述語 目的語 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なら簡単にできます!
  14. 14. 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エンドポイントによって異なる場合があります
  15. 15. 今日一日でできる SPARQLアプリ
  16. 16. SPARQLでマッシュアップ •SPARQLクエリを書くだけでプログラミングなしに いろんなアプリが作れます •全てWebブラウザがあれば動作します •Webサーバは必要ありません!
  17. 17. SPARQLでマッシュアップ •地図アプリ •leaflet-simple-sparql •クイズアプリ •SlickQuiz-SPARQL •カレンダーアプリ •fullcalendar-sparql-js •地図とタイムラインビジュアライズアプリ •SPARQL Timeliner •地図で空白地域ビジュアライズアプリ •○○危険地帯 •書籍検索アプリ •booksearch-sparql-js •データビジュアライズツール •sgvizler
  18. 18. 地図アプリ •leaflet-simple-sparql •https://github.com/uedayou/leaflet-simple-sparql
  19. 19. 使い方: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];
  20. 20. クイズアプリ •SlickQuiz-SPARQL •https://github.com/uedayou/SlickQuiz-SPARQL
  21. 21. 使い方: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];
  22. 22. SlickQuiz-SPARQL用の データの作り方 •データは簡単に作成できます。 •LinkData.org の「横浜検定問題・解答集」と同じよう にデータを作るだけ •http://linkdata.org/work/rdf1s560i データを作って「ご当地検定アプリ」作りませんか?
  23. 23. カレンダーアプリ •fullcalendar-sparql-js •https://github.com/uedayou/fullcalendar-sparql-js
  24. 24. 使い方: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];
  25. 25. 地図とタイムラインの ビジュアライズアプリ •SPARQL Timeliner •http://uedayou.net/SPARQLTimeliner/
  26. 26. 使い方:SPARQL Timeliner エンドポイントのURLを入力 クエリを入力 •http://uedayou.net/SPARQLTimeliner を開いてエンドポイントURLとクエリを入力して 「Load>>」ボタンをクリック
  27. 27. 使い方:SPARQL Timeliner •以下のルールに従ってクエリを作成してください •詳しい使い方は以下の資料にまとめています •http://www.slideshare.net/uedayou/sparql-timeliner- 28905905
  28. 28. トイレ危険地帯 •Linked Open Data チャレンジ2013 受賞作品 •鯖江市が公開するオープンデータのうち、公衆トイ レの位置を利用してトイレのない地域をWebアプリ でビジュアライズ http://y4ashida.github.io/toilet/
  29. 29. ○○危険地帯 •トイレ危険地帯のソースコードを修正して、SPARQL でさまざまなデータで空白地域をビジュアライズで きるようにしました •https://github.com/uedayou/dangerzone-sparql
  30. 30. 大阪市版トイレ危険地帯 http://uedayou.github.io/dangerzone-sparql/
  31. 31. ○○危険地帯の使い方 1.「Download ZIP」ボタンを押してソースコード をダウンロード 2.ZIPファイルを解凍 3.config.js の書き換える 4. Index.html をブラウザで開く SPARQLを書きます
  32. 32. 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 エンドポイント
  33. 33. 大阪市のいろんな危険地帯を作っ てみよう! // 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 …
  34. 34. 書籍検索アプリ •booksearch-sparql-js •https://github.com/uedayou/booksearch-sparql-js
  35. 35. 使い方: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];
  36. 36. 使い方: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":"著者", …
  37. 37. データビジュアライズツール •sgvizler •http://dev.data2000.no/sgvizler/ •※今回はバージョン0.5を使います
  38. 38. 使い方: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
  39. 39. 使い方: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を指定
  40. 40. 例で利用するデータ •京都が出てくる本のデータ •京都岡崎にある図書館で働く司書の方々が中心のグ ループ「ししょまろはん」が作成・公開する京都が舞台の 小説やマンガ・ライトノベル等のデータ •作品の舞台となった京都府内の位置データや司書さん のおすすめ度もデータ化される •LODチャレンジJapan2014データセット部門応募作品 •LODチャレンジ2011-2013応募作品メタデータ どちらも LODチャレンジ応募作品のSPARQLエンドポイント(試行版) で検索できます
  41. 41. 京都が出てくる本のデータ: 出版年ランキング http://uedayou.net/sparql-mashup/sgvizler/kyoto-issued-ranking.html
  42. 42. 京都が出てくる本のデータ: 著者トップ10 http://uedayou.net/sparql-mashup/sgvizler/kyoto-author-top10.html
  43. 43. 京都が出てくる本のデータ: おすすめ度ランキング http://uedayou.net/sparql-mashup/sgvizler/kyoto-recommend-ranking.html
  44. 44. 京都が出てくる本のデータ: 出版社別ランキング http://uedayou.net/sparql-mashup/sgvizler/kyoto-publisher-ranking.html
  45. 45. 京都が出てくる本のデータ: カテゴリ別ランキング http://uedayou.net/sparql-mashup/sgvizler/kyoto-category-ranking.html
  46. 46. クエリの書き方 (棒グラフ、円グラフの場合) •「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)
  47. 47. クエリの書き方 (棒グラフ、円グラフの場合) •実際のデータは…
  48. 48. LODチャレンジ応募作品の 関連グラフ http://uedayou.net/sparql-mashup/sgvizler/lodc-network.html
  49. 49. クエリの書き方 (無指向グラフの場合) 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で二つのラベルが入るようにクエリを記述
  50. 50. クエリの書き方 (無指向グラフの場合) •実際のデータは…
  51. 51. ハンズオン SPARQLの書き方 事前にブラウザに http://uedayou.net/sparql-mashup/ を開いておいてください
  52. 52. URI(IRI)とリテラル •URI(IRI) : <http://ja.dbpedia.org/resource/東京都> •「<」「>」で挟まれた文字列 •人・もの・出来事などを指し示すID •指定したURIを同じURIを含むデータが検索される •リテラル: “東京” , “100” , “2014-12-07” … •「”」で挟まれた文字列 •データそのもの(string, integer, float他) •指定した文字列と同じ文字列を含むデータが検索され る •目的語以外は指定できない
  53. 53. 主語 述語 目的語 <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のデータベース
  54. 54. 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> “神奈川県”
  55. 55. (1) シンプルなSPARQLクエリ •全てのトリプルデータを検索 SELECT ?s ?p ?o WHERE { ?s ?p ?o. }
  56. 56. SELECT •SELECT の後ろに続く変数(?で始まる文字列)に格納さ れたデータを表形式で取得 •変数名は必ずWHERE文の中で指定したものを記述す ること •例では?s、?p、?o SELECT ?s ?p ?o WHERE { ?s ?p ?o. }
  57. 57. SELECT •アスタリスク「*」を指定すると、WHERE文の中の 全ての変数を指定したことと同じになる •?s、?p、?o が抽出される SELECT * WHERE { ?s ?p ?o . } SELECT ?s ?p ?o WHERE { ?s ?p ?o. } =
  58. 58. WHERE •WHERE { } 内に検索したいトリプルパターンを書く SELECT ?s ?p ?o WHERE { ?s ?p ?o . }
  59. 59. 基本構造 •トリプルパターンを指定するために、3つの変数または URI、リテラル(目的語のみ)を1セットで書く •変数:?で始まる文字列、任意のURIまたはリテラルが入る •1セットの終わりには必ずピリオド「.」をつける SELECT ?s ?p ?o WHERE { ?s ?p ?o. } 主語の 指定 述語の 指定 目的語 の指定 必ずピリオド で終わる
  60. 60. 変数とトリプルパターン •変数:?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で目的語がラベルであることを意味する
  61. 61. ?id rdfs:comment?comment. トリプルパターン rdfs:commentは<http://www.w3.org/2000/01/ rdf-schema#comment> というURIで目的語がコメントであることを意味する
  62. 62. ?id rdfs:label?label. ?id rdfs:comment?comment. トリプルパターン 同じ名前の変数(?id)は AND検索を意味します URIが同一のデータは同じ行に まとまって出力されます
  63. 63. (1) シンプルなSPARQLクエリ •全てのトリプルデータを検索 SELECT ?s ?p ?o WHERE { ?s ?p ?o. }
  64. 64. ?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> “神奈川県” 検索対象
  65. 65. http://uedayou.net/sparql-mashup/test-endpoint/
  66. 66. (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 . } 主語の 指定 述語の 指定 目的語 の指定
  67. 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. 68. http://uedayou.net/sparql-mashup/test-endpoint/
  69. 69. select distinct * where { <http://ja.dbpedia.org/resource/東京都> ?p ?o . } (3)主語に<http://ja.dbpedia.org/resource/東京都> が指定されているトリプルを取得 •<http://ja.dbpedia.org/resource/東京都>に関する データ(述語と目的語)全て検索 主語の 指定 述語の 指定 目的語 の指定
  70. 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. 71. http://uedayou.net/sparql-mashup/test-endpoint/
  72. 72. (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. }
  73. 73. 主語 述語 目的語 <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を 主語に持つトリプル を選択
  74. 74. http://uedayou.net/sparql-mashup/test-endpoint/
  75. 75. 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
  76. 76. 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 “神奈川県”
  77. 77. (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 . }
  78. 78. http://uedayou.net/sparql-mashup/test-endpoint/
  79. 79. (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 . } 省略を終了するトリプルパターン の最後は必ずピリオドにすること 主語を 省略 できる
  80. 80. http://uedayou.net/sparql-mashup/test-endpoint/
  81. 81. SPARQLの便利な検索機能 検索句 機能 DISTINCT 重複する検索結果を除外 LIMIT 検索結果の上限を設定 OFFSET 検索結果の取得位置を指定 ORDER BY 検索結果の並び順を指定 OPTIONAL OPTIONAL内は任意検索 FILTER 検索結果のフィルタリングが可能 REGEX 正規表現による検索が可能 BIND 新たな変数への割り当てが可能 CONCAT 文字列の結合が可能 REPLACE 文字列の置き換えが可能(正規表現使用可) SUBSTR 文字列の切り出しが可能 COUNT 検索件数を表示 GROUP BY 変数のグループ化が可能 HAVING グループ化した変数の絞込みが可能 各機能の詳しいの説明はSlideShareの資料を参照してください
  82. 82. SPARQLの 便利な検索機能
  83. 83. DISTINCT •「SELECT」と変数の間に「DISTINCT」を入れると指定 した全ての変数で重複したパターンがあった場合、 検索結果から除外される SELECT DISTINCT ?s ?p ?o WHERE { ?s ?p ?o. }
  84. 84. 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
  85. 85. 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
  86. 86. 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
  87. 87. 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. } }
  88. 88. 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) }
  89. 89. 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を「東京」で前方一致検索
  90. 90. 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>」になる
  91. 91. 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 ) }
  92. 92. 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 ) }
  93. 93. COUNT •変数のデータ総数を計算 SELECT COUNT(*)WHERE { ?s ?p ?o . } 全トリプル数を計算
  94. 94. 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つ以上 ある作者のみ対象
  95. 95. 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 . }
  96. 96. 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が グラフ名になっています
  97. 97. データ型のキャスト •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#> があることが前提
  98. 98. エンドポイントの結果(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

×