• 検索結果がありません。

第 10 回 AI ツール入門講座 SPARQL による LOD (Linked Open Data) の活用 SPARQL の基礎 山本泰智ライフサイエンス統合データベースセンター 大阪

N/A
N/A
Protected

Academic year: 2021

シェア "第 10 回 AI ツール入門講座 SPARQL による LOD (Linked Open Data) の活用 SPARQL の基礎 山本泰智ライフサイエンス統合データベースセンター 大阪"

Copied!
80
0
0

読み込み中.... (全文を見る)

全文

(1)

SPARQLの基礎

山本 泰智

ライフサイエンス統合データベースセンター 2016.8.31 @ 大阪

第10回AIツール入門講座

(2)

RDFデータを検索する

問い合わせ言語

SPARQL?

(スパークル)

(3)

:大阪府

:人口

8,838,988

RDF表現

(4)

:大阪府

:人口

?

RDFへ質問

(5)

?

:人口

100万以上

RDFへ質問

人口が

100万人以上の都市は?

:都市

(6)

?

:人口

100万以上

RDFへ質問

人口が

100万人以上の都市はいくつある?

???

:都市

a

(7)

?

:人口

100万以上

RDFへ質問

人口が

100万人以上の都市がある国は?

?

:国

:都市

a

(8)

SPARQLでできるよ

(9)

SPARQL1.1

W3C

(10)

1. SPARQL 1.1 Overview

2. SPARQL 1.1 Query Language 3. SPARQL 1.1 Update

4. SPARQL 1.1 Service Description 5. SPARQL 1.1 Federated Query

6. SPARQL 1.1 Query Results JSON Format

7. SPARQL 1.1 Query Results CSV and TSV Formats

8. SPARQL Query Results XML Format (Second Edition) 9. SPARQL 1.1 Entailment Regimes

10.SPARQL 1.1 Protocol

11.SPARQL 1.1 Graph Store HTTP Protocol

(11)

クライアント RDFストア 問い合わせ言語仕様 (参照系、更新系) 結果の形式 (JSON, CSV, TSV, XML) とストアのメタデータ形式 HTTPを利用 した通信方法 複数のストアへの 問い合わせ方法 問い合わせ の解釈方法

(12)

問い合わせ言語

参照系(

RDFストアの内容を変えない)

更新系(

RDFストアの内容を更新する)

大文字小文字の違いを無視

(13)

参照系

SELECT

ASK

DESCRIBE

CONSTRUCT

1.0はこれのみ

(14)

SELECT

欲しいデータのパターンと、 取り出したいデータのパターン中での位置を与える 結果は変数に関連付けられる

SELECT ?o WHERE

{

:大阪府 :人口

?o .

}

?o: 変数, $oでも同じ

トリプルパターン

(15)

FILTER

SELECT ?c

WHERE {

?c :人口 ?o .

?c

a :都市 .

FILTER(?o >= 1000000)

}

aはrdf:typeの簡易表記

トリプルパターンと併せて より詳細なマッチ条件を記述できる

(16)

COUNT / AS

SELECT (

COUNT(?c) AS ?n)

WHERE {

?c :人口 ?o .

?c a :都市 .

FILTER(?o >= 1000000)

}

(17)

DISTINCT

SELECT

DISTINCT ?n

WHERE {

?c :人口 ?o .

?c a :都市 .

?c :国 ?n .

FILTER(?o >= 1000000)

}

(18)

省略標記

SELECT DISTINCT ?n

WHERE {

[] :人口 ?o ;

a :都市

;

:国

?n .

FILTER(?o >= 1000000)

}

(19)

OPTIONAL

SELECT DISTINCT ?n ?m

WHERE {

?c :人口 ?o ;

a :都市 ;

:国 ?n .

OPTIONAL {

?c :首長 ?m .

}

FILTER(?o >= 1000000)

}

(20)

UNION

SELECT ?c ?o

WHERE {

?c :人口 ?o .

{ ?c a :町 . }

UNION

{ ?c a :村 . }

FILTER(?o >= 1000)

}

(21)

GROUP BY

SELECT (COUNT(?n) AS ?nc) ?n

WHERE {

?c :標高 ?h ;

a :山 ;

:国

?n .

FILTER(?h > 2000)

}

GROUP BY (?n)

(22)

HAVING

SELECT (COUNT(?n) AS ?nc) ?n

WHERE {

?c :標高 ?h ;

a :山 ;

:国

?n .

FILTER(?h > 2000)

} GROUP BY ?n

HAVING (?nc > 1)

(23)

ORDER BY

SELECT (COUNT(?n) AS ?nc) ?n

WHERE {

?c :標高 ?h ;

a :山 ;

:国

?n .

FILTER(?h > 2000)

} GROUP BY ?n

HAVING (?nc > 1)

ORDER BY DESC(?nc)

DESC: 降順 ASC: 昇順 省略時はASC

(24)

LIMIT / OFFSET

SELECT (COUNT(?n) AS ?nc) ?n

WHERE {

?c :標高 ?h ;

a :山 ;

:国

?n .

FILTER(?h > 2000)

} GROUP BY (?n)

ORDER BY DESC(?nc)

LIMIT 10 OFFSET 0

(25)

GROUP BYなど解修飾子の順序

GROUP BY / HAVING / ORDER BY / LIMIT, OFFSET これらはすべて省略可能だが、順序はこの通

りでなくてはならない

(26)

SERVICE

SELECT ?h ?lat ?long

WHERE {

?c :標高 ?h ;

a :山 .

SERVICE <location> {

?c :緯度 ?lat ;

:経度 ?long .

}

FILTER(?h > 2000)

}

(27)

BIND / VALUES

SELECT (COUNT(?n) AS ?nc) ?n

WHERE {

?c :標高 ?h ;

a :山 ;

:国

?n .

FILTER(?h > 2000)

BIND(?n AS "日本"@ja)

}

(28)

VALUES

SELECT (COUNT(?n) AS ?nc) ?n

WHERE {

?c :標高 ?h ;

a :山 ;

:国

?n .

FILTER(?h > 2000)

VALUES ?n

{ "日本"@ja "ブラジル"@ja }

}

(29)

VALUES

SELECT (COUNT(?n) AS ?nc) ?n

WHERE {

?c :標高 ?h ;

a ?t ;

:国

?n .

FILTER(?h > 2000)

VALUES (?t ?n)

{ (:山 "日本"@ja)

(:都市 "ネパール"@ja) }

}

(30)

MINUS

SELECT (COUNT(?n) AS ?nc) ?n

WHERE {

?c :標高 ?h ;

a :山 ;

:国

?n .

FILTER(?h > 2000)

MINUS {

?c :国 "日本"@ja .

} }

MINUSの中のパターン に外のパターンと共通 する変数が一つは必要

(31)

MINUSとNOT EXISTS

SELECT (COUNT(?n) AS ?nc) ?n

WHERE {

?c :標高 ?h ;

a :山 ;

:国

?n .

FILTER(?h > 2000)

FILTER NOT EXISTS {

?c :国 "日本"@ja .

} }

内外で共通する変数があ る限りMINUSと同じ作用

(32)

サブセレクト

SELECTは入れ子にできる

SELECT ?n ?c WHERE {

?c a :山 ; :標高 ?mh ; :国 ?n .

{

SELECT ?n (MAX(?h) AS ?mh)

WHERE {

[] :標高 ?h ;

a

:山 ;

:国

?n . }

GROUP BY ?n } }

(33)

プロパティパス

SELECT ?who

WHERE {

{:私 :友 ?who .}

UNION

{:私 :友

/ :友 ?who .}

}

SELECT ?who

WHERE {

:私 :友

+ ?who .

}

? + * / ! ^ | ()を利用して構築

(34)

リテラルの型と言語タグ

SELECT ?c

WHERE {

?c :標高

"1234"^^xsd:integer ;

a :山 ;

:国

"日本"@ja . }

"1234"^^xsd:integer は 1234 と同値 "123.4"^^xsd:decimal は 123.4 と同値 "日本"@ja のjaは言語タグ

(35)

文字列の扱い

単純リテラル

"日本"

プレインリテラル

"日本"@ja

単純リテラルはxsd:string型リテラルの簡易表現 "日本" と "日本"^^xsd:string は同値 単純リテラルとプレインリテラルは互いに異なる データとして扱われることに注意

(36)

よく使われる文字列関連関数

CONTAINSSTRSTARTSSTRENDSREGEX

SELECT DISTINCT ?c ?n

WHERE {

?c :人口 ?o ;

:国 ?n .

FILTER(

STRSTARTS(?n, "ab"))

}

(37)

REGEX

Perlの記法を踏襲 FILTERと共に利用して文字列マッチ

SELECT ?c

WHERE {

?c :標高

"1234"^^xsd:integer ;

a :山 ;

:国

"日本"@ja .

FILTER REGEX(str(?c), "岳$", "s")

}

ここでは不必要だが、REGEX の記法を紹介するため

(38)

REGEX REPLACE

REPLACEと共に利用して文字列置換

SELECT ?c ?label

WHERE {

?c :標高

"1234"^^xsd:integer ;

a :山 ;

:国

"日本"@ja .

BIND(

REPLACE(str(?c), "岳$", "嶽$")

AS ?label)

}

(39)

ASK

欲しいデータのパターンを与える 結果はパターンにマッチするデータがあるか否か TRUE / FALSE

ASK WHERE

{

:大阪府 :人口 ?o .

}

(40)

CONSTRUCT

CONSTRUCT {

?c a :高山 ;

:標高 ?h .

} WHERE {

?c :標高 ?h ;

a :山 .

FILTER(?h > 2000)

}

欲しいデータと生成されるデータのパターンを与える 結果は生成パターンに基づく新たなRDFデータ

(41)

DESCRIBE

DESCRIBE :大阪市

欲しいデータのURIを与える

結果は当該URIに関する有益なRDFデータ

(42)

PREFIX

RDFはURIもしくはリテラルで表記される。 URIは長くなり易く人可読性が悪くなりがち。 特定のIDを示す部分を除く共通部分をくくりだ して予めPREFIXとして宣言。 パターンを表記する際の可読性を上げる。 PREFIX : <http://example.com/> :大阪市 は <http://example.com/大阪市> を示す

(43)

よく使われる

PREFIXと語彙

rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>rdf:typerdfs: <http://www.w3.org/2000/01/rdf-schema#>rdfs:labelrdfs:seeAlsoowl: <http://www.w3.org/2002/07/owl#>owl:sameAsfoaf: <http://xmlns.com/foaf/0.1/>foaf:namefoaf:homepagegeo: <http://www.w3.org/2003/01/geo/wgs84_pos#>geo:latgeo:long

(44)

省略可能な部分

* CONSTRUCTの一形態を除く WHEREは省略OK* 最後のトリプルのパターンのピリオドは省略OK

SELECT ?c {

?c :人口 ?o .

?c a :都市 .

}

SELECT ?c {

?c :人口 ?o .

?c a :都市

}

(45)

評価順序

SPARQLクエリは論理式。 複数のトリプルのパターンの列挙はそれらのパ ターンの論理積を意味する。 したがって順序は問わない。

{

?c :人口 ?o .

?c a :都市 .

?c :国 ?n .

}

{

?c a :都市 .

?c :国 ?n .

?c :人口 ?o .

}

(46)

トリプルからクワッドへ

一連のRDFトリプルの集合を一つのグラフとし て扱い、名前を付けられる グラフ名もURIなので、主語、述語、目的語、 グラフ名の四つ組すなわちクワッドをデータの 最小単位とする SPARQL1.1からグラフの概念が導入された シリアライズ方式としてN-quadがある (.nq 形式のファイル)

(47)

GRAPH / FROM

SELECT ?o WHERE {

GRAPH <graph> {

:大阪府 :人口 ?o .

}}

SELECT ?o

FROM <graph>

WHERE {

:大阪府 :人口 ?o .

}

(48)

GRAPHの扱いについて注意

グラフ名を陽に指定しないで検索した場合には 1. 全てのグラフを検索対象にする 2. DEFAULT GRAPHだけを検索対象にする のいずれかで実装により異なる グラフ名を指定しない場合のトリプルは DEFAULT GRAPHに含まれる

(49)

DBpedia Japaneseで試す

http://ja.dbpedia.org/sparql

上記ページにあるサンプルを試す。 その後、適宜書き換えて試す。

(50)

Linked Dataとの関係

http://ja.dbpedia.org/resource/大阪府 へのアクセスと

DESCRIBE <http://ja.dbpedia.org/resource/大阪府>

(51)

SPARQLの利用

山本 泰智

ライフサイエンス統合データベースセンター 2016.8.31 @ 大阪

第10回AIツール入門講座

(52)

FUSEKI

Apacheプロジェクトにより開発されている実装 Apache Jenaを用いたRDFストア

&SPARQLエンドポイント実装

http://jena.apache.org/

SPARQL1.1 Query / Update / Graph Store protocolに準拠

(53)

インストールと立ち上げ

• Qiitaのサイトを参考にしてインストール • Windows編 http://tinyurl.com/fuseki-win10 • Mac OS編 http://tinyurl.com/fuseki-MacOSX • Qiitaのサイトを参考にしてデータのロード • http://tinyurl.com/fuseki-intro

(54)

更新系

• 参照系とは異なりGRAPHの概念が反映される • Fusekiに様々なデータを異なるグラフにロード • 参照系のGRAPHの扱いを確認

(55)

CREATE / LOAD

グラフの生成とデータのロード

CREATE GRAPH :myGraph

LOAD dbpedia-ja:富士山 INTO

GRAPH :myGraph

残念ながらdbpedia側サーバーの文字コード処理に起因 する問題により、現状上記のクエリをfusekiで実行する とエラーになる。例えば、dbpedia-ja:駒ヶ岳 などは ok。 取得対象データがLinked Dataの原則3を満たしている場 合は当該URIを指定することで適当なデータを取得できる

(56)

CLEAR / DROP

CLEAR GRAPH :myGraph

グラフやグラフ内のデータを削除

DROP GRAPH :myGraph

トリプルのないグラフは自動的に消され る実装もあり、その場合、両者は同じ

(57)

INSERT DATA /

DELETE DATA

グラフ内のデータをトリプル単位で挿入や削除 更新対象は具体的なトリプルで指定

INSERT DATA

{

GRAPH :myGraph2

{ :sample foaf:homepage :index.html .} }

DELETE DATA

{

GRAPH :myGraph2

(58)

INSERT / DELETE

グラフ内のデータをトリプル単位で挿入や削除 更新対象はパターンで指定 INSERT { GRAPH :myGraph2 { ?s ?p ?o .} } WHERE { GRAPH :myGraph1 { ?s ?p ?o . MINUS { ?s owl:sameAs | <http://dbpedia.org/ontology/wikiPageWikiLink> ?o } } }

(59)

INSERT DELETE

グラフ内のデータをトリプル単位で一度に削除と挿入 更新対象トリプルはパターンで指定

WITH :myGraph1

DELETE { ?s owl:sameAs ?o }

INSERT { ?s rdfs:seeAlso ?o }

WHERE

{ ?s owl:sameAs ?o .

FILTER( ! strstarts(str(?o),

"http://www.wikidata.org/"))

}

(60)

ADD / COPY / MOVE

グラフ内のデータをグラフ単位でコピーもしくは移動

ADD GRAPH :myGraph1 TO :myGraph2

COPY GRAPH :myGraph1 TO :myGraph2

MOVE GRAPH :myGraph1 TO :myGraph2

それぞれの違いは、データの追加元と先のグ ラフに、処理実行前に存在したデータの扱い 追加元 追加先 ADD 変化なし 変化なし COPY 変化なし 削除 MOVE 削除 削除

(61)

プロパティパス詳細

評価順序 1. IRIあるいはプレフィックス表現 2. 否定表現(!)が付いている述語表現群 3. 述語表現群 4. 繰り返し表現(*、?、および+) 5. 逆表現(^) 6. 述語の連続表現(/) 7. 述語の併記表現(|) 演算子 ?: 0または1回 +: 1回以上 *: 0回以上 /: プロパティの連続 !: 否定 ^: 主語と目的語の位置転換 |: または (): 優先順位変更 トリプルのパターンの述語部分は様々な表現が可能* *演算子と変数の同時使用は不可

(62)

組み込み関数

: 論理系

• bound • if

• coalesce

• exists / not exists • || / && / = • sameTerm • in / not in coalesce 複数の式を引数に取り、左から 順に評価し、最初にエラーでは ないものを返す。 例えば、?x=2で?yが非束縛の とき以下の通りになる。 coalesce(?x, 1/0) 2 coalesce(1/0, ?x) 2 coalesce(5, ?x) 5 coalesce(?y, 3) 3

(63)

IFの使用例

SELECT ?ans

WHERE {

BIND (

(

if(2 > 3, "2が大きい",

"3が大きい")) AS ?ans)

}

(64)

組み込み関数

: RDFターム*系

• isIRI • isBlank • isLiteral • isNumeric • str • datatype • lang • IRI • bnode • strdt • strlang • uuid • struuid 判定 変換 生成 *RDFタームとは、全てのURI、リテラル、ブ ランクノードを含む集合

(65)

strdt と strlang

strdtは型付きリテラルを生成

strlangは言語タグ付きプレインリテラルを生成

SELECT ?lit1 ?lit2

WHERE {

BIND (

strdt("831", xsd:integer) AS ?lit1)

BIND (

strlang("大阪", "ja") AS ?lit2)

(66)

組み込み関数

: 文字列系

• strlen • substr • ucase • lcase • strstarts • strends • contains • strbefore • strafter • encode_for_URI • concat • langmatches • regex • replace

(67)

組み込み関数

: 集約系

• COUNT • SUM • MIN • MAX • AVG • SAMPLE • GROUP_CONCAT GROUP_CONCAT 変数に複数の値が関連付けら れているとき、それらを指定 のデリミタ(省略時には空 白)を用いて列挙した文字列 を返す。 例えば、?xに1,5,3,9が関連付 けられているときは、 GROUP_CONCAT(?x)で、 "1 5 3 9"が得られる。

(68)

組み込み関数

: 数値演算/日付系

数値演算

• abs • round • ceil • floor • rand

日付

• now • year • month • day • hours • minutes • seconds • timezone / tz

(69)

組み込み関数

: ハッシュ/キャスト系

ハッシュ

• md5 • sha1 • sha256 • sha384 • sha512

キャスト

• xsd:boolean • xsd:double • xsd:float • xsd:decimal • xsd:integer • xsd:datetime • xsd:string

(70)

文字列型の互換性

下記の文字列関連関数は2引数が必要で、それらの型は 互換でなくてはならない

STRSTARTS, STRENDS, CONTAINS, STRBEFORE, STRAFTER

互換とは?

1. 両者ともに単純リテラルかxsd:string型

2. 両者ともにプレインリテラルで同じ言語タグ

3. 第一引数が言語タグ付きのプレインリテラルで第二 引数が単純リテラルもしくはxsd:string型

(71)

キャスト可能な型について

From To str flt dbl dec int dT bool str Y M M M M M M flt Y Y Y M M N Y dbl Y Y Y M M N Y dec Y Y Y Y Y N Y int Y Y Y Y Y N Y dT Y N N N N Y N bool Y Y Y Y Y N Y IRI Y N N N N N N ltrl Y M M M M M M bool = xsd:boolean dbl = xsd:double flt = xsd:float str = xsd:string IRI = IRI ltrl = simple literal dec = xsd:decimal int = xsd:integer dT = xsd:dateTime

(72)

演算子の適用対象の型

=, !=, <, >, <=, >=

数値、単純リテラル、xsd:string、 xsd:boolean、xsd:dateTime 上記の2項演算子については下記の型へ適用できる さらに、=と!=についてはRDFターム全般に適用できる xsd:booleanの大小については True > False と定められている

(73)

関連ツール

YASGUI クエリ構築を支援 http://legacy.yasgui.org/ • Sparklis クエリを明示的に書かずにデータを閲覧 http://www.irisa.fr/LIS/ferre/sparklis/osparklis.html • Fuseki すでに紹介済みですが、手元からSERVICEを用いて好きなエンド ポイントにクエリを発行できる • SPARQLES 様々なエンドポイントを複数の見地から定期的に調査 http://sparqles.ai.wu.ac.at/

(74)

プログラムからアクセス

Python: SPARQLWrapper

https://rdflib.github.io/sparqlwrapper/

R: SPARQL Package

https://cran.r-project.org/web/packages/SPARQL/index.html

Ruby: SPARQL Client for RDF.rb

https://github.com/ruby-rdf/sparql-client

Java: Apache Jena

http://jena.apache.org/

Java: Eclipse RDF4J

http://rdf4j.org/

JavaScript: SPARQL.js etc.

(75)

curlでアクセス

$ curl -gLH 'Accept: text/tab-separated-values' 'http://ja.dbpedia.org/sparql? query=select+distinct+*+where+{+%3Chttp%3A%2F%2Fja.dbpedia.org% 2Fresource%2F%E6%9D%B1%E4%BA%AC%E9%83%BD%3E+%3Fp+%3Fo+.++}+LIMI T+100' SPARQLの仕様はHTTPを用いたAPIも含む HTTP GETでのアクセス例 仕様ではクエリ無しでHTTP GETするとエンドポイ ントのメタデータが得られることになっているが

(76)

curlでアクセス

$ echo ¥

'select distinct * where { <http://ja.dbpedia.org/resource/東 京都> ?p ?o . } LIMIT 100' ¥

| curl -gLH 'Accept: text/tab-separated-values' ¥

--data-urlencode query@- 'http://ja.dbpedia.org/sparql'

(77)

課題

• 人口の多い順に列挙 • 各国の首相を列挙 • 国ごとの最高峰とその高さや場所を列挙 • DBpedia Japaneseの山に関する情報でWikidata にも情報があるものを列挙する • さらにWikidataからの情報も収集する エンドポイントは http://query.wikidata.org/sparql

(78)

国内のエンドポイントを探す

• http://wp.lodosaka.jp/tool/searchdata/ • http://succi.jp/blog/?p=1437 • https://data.city.osaka.lg.jp/api/ • http://data.allie.dbcls.jp/ • http://lsd.dbcls.jp/ • http://integbio.jp/rdf/

(79)

生命科学分野の話題

• 比較的早いうちからRDF化が行われている • 参考: http://id.nii.ac.jp/1001/00163747/ (情報処理学会員以外は2018年6月まで有料) • 例のLODクラウドでもそれなりのボリューム • 国内でも最近活発に研究・開発 • 筆者所属のDBCLSはハッカソンを定期的に開催 • 参加自由ですので、ぜひ! • http://wiki.lifesciencedb.jp/mw/SPARQLthon

(80)

参照

関連したドキュメント

12―1 法第 12 条において準用する定率法第 20 条の 3 及び令第 37 条において 準用する定率法施行令第 61 条の 2 の規定の適用については、定率法基本通達 20 の 3―1、20 の 3―2

評価点 1 0.8 0.5 0.2 0 ―.. 取組状況の程度の選択又は記入に係る判断基準 根拠 調書 その5、6、7 基本情報

( (再輸出貨物の用途外使用等の届出) )の規定による届出又は同令第 38 条( (再輸 出免税貨物の亡失又は滅却の場合の準用規定)

「AI 活用データサイエンス実践演習」 「AI

この標準設計基準に定めのない場合は,技術基準その他の関係法令等に

企業会計審議会による「固定資産の減損に係る会計基準」の対象となる。減損の兆 候が認められる場合は、

拠点校、連携校生徒のWWLCリーディングプロジェクト “AI活用 for SDGs” の拠 点校、連携校の高校生を中心に、“AI活用 for

この標準設計基準に定めのない場合は,技術基準その他の関係法令等に