2016年度 春学期
Webインテリジェンス論
講義概要
▪ SPARQLとは?
▪ RDFストア
▪ GraphDBによるSPARQL検索方法
▪ Turtle
▪ 基本的なクエリ
– FILTER, OPTIONAL, DISTINCT, UNION, LIMIT,
ORDER BY, GROUP BY, MAX, AVG, SUM, COUNT,
リモートの
SPARQLエンドポイントへのクエリ
▪ DBpedia
▪ 演習問題1
▪ 演習問題2
SPARQLとは?
▪ RDFデータを検索するためのクエリ言語(RDBMS
における
SQLに相当)
– ver. 1.0(2008年1月にW3C勧告)
•
http://www.w3.org/TR/rdf-sparql-query/
•
http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/rdf-sparql-query.html
(日本語訳)
– ver. 1.1(2013年3月にW3C勧告)
•
http://www.w3.org/TR/sparql11-overview
•
http://www.asahi-net.or.jp/~ax2s-
kmtn/internet/rdf/REC-sparql11-query-20130321.html
(日本語訳)
RDFデータストア
▪ RDFデータを格納し,SPARQLによるクエリなどを可能にす
るアプリケーション
▪ SPARQLエンドポイントを提供
– queryパラメータ値にURLエンコードしたSPARQLクエリを与えること
で,結果を得ることができる
Web API
▪ 本講義ではGraphDBを利用
–
http://ontotext.com/products/graphdb/
▪ 以下のURLから本日の講義で説明するSPARQLクエリを実
行可能
– http://zest.comp.ae.keio.ac.jp/ – ID: wi2016 – パスワード: 講義中に提示しますTurtle
▪ RDFフォーマットの一種
▪ RDF/XML構文よりも簡潔にRDF文書を表現
可能
–
http://www.w3.org/TR/turtle/
▪ 本日の講義のサンプルRDF文書はTurtleで
記述
▪ SPARQLの構文はTurtleに類似
Turtle
<http://example.org/夏目漱石> <http:/example.org/代表作> <http://example.org/こころ> .
<主語URI> <述語URI> <目的語URI> .
@prefix ex: <http://example.org/> .
ex:夏目漱石 ex:代表作 ex:こころ .
例
1
例
2
Turtle
@prefix ex: <http://example.org/> .
ex:夏目漱石 ex:代表作 ex:こころ .
ex:夏目漱石
ex:誕生日 “1867年2月9日” .
例
3
;
(セミコロン)により,主語を省略可能
@prefix ex: <http://example.org/> .
ex:夏目漱石 ex:代表作 ex:こころ
;
Turtle
@prefix ex: <http://example.org/> .
ex:夏目漱石 ex:代表作 ex:こころ .
ex:夏目漱石 ex:代表作
ex:坊っちゃん .
例
4
,
(カンマ)により,主語と述語を省略可能
(目的語を複数列挙可能)
@prefix ex: <http://example.org/> .
Turtle
@prefix ex: <http://example.org/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
ex:夏目漱石
rdf:type
ex:小説家 .
例
5
rdf:typeは「
a
」で表現可能
@prefix ex: <http://example.org/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
ex:夏目漱石
a
ex:小説家 .
RDF文書: ex002.ttl
# filename: ex002.ttl
@prefix ab: <http://learningsparql.com/ns/addressbook#> .
ab:richard ab:homeTel "(229) 276-5135" .
ab:richard ab:email "[email protected]" .
ab:cindy ab:homeTel "(245) 646-5488" .
ab:cindy ab:email "[email protected]" .
ab:craig ab:homeTel "(194) 966-1505" .
ab:craig ab:email "[email protected]" .
SPARQLクエリ: ex003.rq
# filename: ex003.rq
PREFIX ab: <http://learningsparql.com/ns/addressbook#>
SELECT
?craigEmail
WHERE
{
Graph<http://zest.comp.ae.keio.ac.jp/ex002> {
ab:craig ab:email
?craigEmail
.
}
}
RDF文書: ex002.ttl
# filename: ex002.ttl
@prefix ab: <http://learningsparql.com/ns/addressbook#> .
ab:richard ab:homeTel "(229) 276-5135" .
ab:richard ab:email "[email protected]" .
ab:cindy ab:homeTel "(245) 646-5488" .
ab:cindy ab:email "[email protected]" .
ab:craig ab:homeTel "(194) 966-1505" .
ab:craig ab:email
"[email protected]"
.
SPARQLクエリ: ex008.rq
# filename: ex008.rq
PREFIX ab: <http://learningsparql.com/ns/addressbook#>
SELECT
?person
WHERE {
Graph<http://zest.comp.ae.keio.ac.jp/ex002> {
?person
ab:homeTel "(229) 276-5135" .
}
}
RDF文書: ex002.ttl
# filename: ex002.ttl
@prefix ab: <http://learningsparql.com/ns/addressbook#> .
ab:richard
ab:homeTel "(229) 276-5135" .
ab:richard ab:email "[email protected]" .
ab:cindy ab:homeTel "(245) 646-5488" .
ab:cindy ab:email "[email protected]" .
ab:craig ab:homeTel "(194) 966-1505" .
ab:craig ab:email "[email protected]" .
SPARQLクエリ: ex010.rq
# filename: ex010.rq
PREFIX ab: <http://learningsparql.com/ns/addressbook#>
SELECT
?propertyName ?propertyValue
WHERE {
Graph<http://zest.comp.ae.keio.ac.jp/ex002> {
ab:cindy
?propertyName ?propertyValue
.
}
}
RDF文書: ex002.ttl
# filename: ex002.ttl
@prefix ab: <http://learningsparql.com/ns/addressbook#> .
ab:richard ab:homeTel "(229) 276-5135" .
ab:richard ab:email "[email protected]" .
ab:cindy
ab:homeTel "(245) 646-5488"
.
ab:cindy
ab:email "[email protected]
" .
ab:craig ab:homeTel "(194) 966-1505" .
ab:craig ab:email "[email protected]" .
RDF文書: ex012.ttl
# filename: ex012.ttl @prefix ab: <http://learningsparql.com/ns/addressbook#> . @prefix d: <http://learningsparql.com/ns/data#> . d:i0432 ab:firstName "Richard" . d:i0432 ab:lastName "Mutt" . d:i0432 ab:homeTel "(229) 276-5135" . d:i0432 ab:email "[email protected]" . d:i9771 ab:firstName "Cindy" . d:i9771 ab:lastName "Marshall" . d:i9771 ab:homeTel "(245) 646-5488" . d:i9771 ab:email "[email protected]" . d:i8301 ab:firstName "Craig" . d:i8301 ab:lastName "Ellis" . d:i8301 ab:email "[email protected]" . d:i8301 ab:email "[email protected]" .SPARQLクエリ: ex013.rq
# filename: ex013.rq
PREFIX ab: <http://learningsparql.com/ns/addressbook#>
SELECT
?craigEmail
WHERE {
Graph<http://zest.comp.ae.keio.ac.jp/ex012> {
?person
ab:firstName"Craig" .
?person
ab:email
?craigEmail
.
}
RDF文書: ex012.ttl
# filename: ex012.ttl @prefix ab: <http://learningsparql.com/ns/addressbook#> . @prefix d: <http://learningsparql.com/ns/data#> . d:i0432 ab:firstName "Richard" . d:i0432 ab:lastName "Mutt" . d:i0432 ab:homeTel "(229) 276-5135" . d:i0432 ab:email "[email protected]" . d:i9771 ab:firstName "Cindy" . d:i9771 ab:lastName "Marshall" . d:i9771 ab:homeTel "(245) 646-5488" . d:i9771 ab:email "[email protected]" . d:i8301 ab:firstName "Craig" . d:i8301 ab:lastName "Ellis" . d:i8301 ab:email "[email protected]" . d:i8301 ab:email "[email protected]" .SPARQLクエリ: ex021.rq
# filename: ex021.rq
PREFIX ab: <http://learningsparql.com/ns/addressbook#>
SELECT
*
WHERE {
Graph<http://zest.comp.ae.keio.ac.jp/ex012> {
?s ?p ?o .
FILTER (regex(?o, "yahoo","i"))
}
}
iオプションをつけると 大文字・小文字を 区別しなくなるRDF文書: ex012.ttl
# filename: ex012.ttl @prefix ab: <http://learningsparql.com/ns/addressbook#> . @prefix d: <http://learningsparql.com/ns/data#> . d:i0432 ab:firstName "Richard" . d:i0432 ab:lastName "Mutt" . d:i0432 ab:homeTel "(229) 276-5135" . d:i0432 ab:email "[email protected]" . d:i9771 ab:firstName "Cindy" . d:i9771 ab:lastName "Marshall" . d:i9771 ab:homeTel "(245) 646-5488" . d:i9771 ab:email "[email protected]" . d:i8301 ab:firstName "Craig" . d:i8301 ab:lastName "Ellis" . d:i8301 ab:email "[email protected]" . d:i8301 ab:email "[email protected]" .SPARQL 演習問題1
1. ex012.ttl文書において,登録されている人物の名
前
(firstName)と苗字(lastName)を表示する
SPARQLクエリを作成せよ
2. ex012.ttl文書において,自宅の電話番号が
「
(245) 646-5488」である人物の名前と苗字を表
示する
SPARQLクエリを作成せよ
3. ex012.ttl文書において,「hotmail」を含むメール
アドレスを持つ人物の名前と苗字を表示する
SPARQLクエリを作成せよ
上記
1〜3で作成したクエリをSPARQLエンドポイント
(
http://zest.comp.ae.keio.ac.jp/sparql)上で実
行し,結果を確認せよ
RDF文書: ex054.ttl
# filename: ex054.ttl @prefix ab: <http://learningsparql.com/ns/addressbook#> . @prefix d: <http://learningsparql.com/ns/data#> . d:i0432 ab:firstName "Richard" . d:i0432 ab:lastName "Mutt" . d:i0432 ab:homeTel "(229) 276-5135" . d:i0432 ab:nick "Dick" . d:i0432 ab:email "[email protected]" . d:i9771 ab:firstName "Cindy" . d:i9771 ab:lastName "Marshall" . d:i9771 ab:homeTel "(245) 646-5488" . d:i9771 ab:email "[email protected]" . d:i8301 ab:firstName "Craig" . d:i8301 ab:lastName "Ellis" . d:i8301 ab:workTel "(245) 315-5486" . d:i8301 ab:email "[email protected]" . d:i8301 ab:email "[email protected]" .SPARQLクエリ: ex057.rq
# filename: ex057.rq PREFIX ab: <http://learningsparql.com/ns/addressbook#> SELECT ?first ?last ?workTel WHERE { ?s ab:firstName ?first ; ab:lastName ?last . OPTIONAL { ?s ab:workTel ?workTel . } }Graph IRI: http://zest.comp.ae.keio.ac.jp/ex054
?s ab:firstName ?first ; ab:lastName ?last ; ab:workTel ?workTel .RDF文書: ex054.ttl
# filename: ex054.ttl @prefix ab: <http://learningsparql.com/ns/addressbook#> . @prefix d: <http://learningsparql.com/ns/data#> . d:i0432 ab:firstName "Richard" . d:i0432 ab:lastName "Mutt" . d:i0432 ab:homeTel "(229) 276-5135" . d:i0432 ab:nick "Dick" . d:i0432 ab:email "[email protected]" . d:i9771 ab:firstName "Cindy" . d:i9771 ab:lastName "Marshall" . d:i9771 ab:homeTel "(245) 646-5488" . d:i9771 ab:email "[email protected]" . d:i8301 ab:firstName "Craig" . d:i8301 ab:lastName "Ellis" . d:i8301 ab:workTel "(245) 315-5486" . d:i8301 ab:email "[email protected]" . d:i8301 ab:email "[email protected]" .SPARQLクエリ: ex061.rq
# filename: ex061.rq PREFIX ab: <http://learningsparql.com/ns/addressbook#> SELECT ?first ?last ?workTel ?nick WHERE { ?s ab:firstName ?first ; ab:lastName ?last . OPTIONAL { ?s ab:workTel ?workTel . } OPTIONAL { ?s ab:nick ?nick . } }Graph IRI: http://zest.comp.ae.keio.ac.jp/ex054
OPTIONAL { ?s ab:workTel ?workTel; ab:nick ?nick . }RDF文書: ex054.ttl
# filename: ex054.ttl @prefix ab: <http://learningsparql.com/ns/addressbook#> . @prefix d: <http://learningsparql.com/ns/data#> . d:i0432 ab:firstName "Richard" . d:i0432 ab:lastName "Mutt" . d:i0432 ab:homeTel "(229) 276-5135" . d:i0432 ab:nick "Dick" . d:i0432 ab:email "[email protected]" . d:i9771 ab:firstName "Cindy" . d:i9771 ab:lastName "Marshall" . d:i9771 ab:homeTel "(245) 646-5488" . d:i9771 ab:email "[email protected]" . d:i8301 ab:firstName "Craig" . d:i8301 ab:lastName "Ellis" . d:i8301 ab:workTel "(245) 315-5486" . d:i8301 ab:email "[email protected]" . d:i8301 ab:email "[email protected]" .SPARQLクエリ: ex067.rq
# filename: ex067.rq PREFIX ab: <http://learningsparql.com/ns/addressbook#> SELECT ?first ?last WHERE { ?s ab:firstName ?first ; ab:lastName ?last . FILTER NOT EXISTS { ?s ab:workTel ?workNum } }Graph IRI: http://zest.comp.ae.keio.ac.jp/ex054
RDF文書: ex054.ttl
# filename: ex054.ttl @prefix ab: <http://learningsparql.com/ns/addressbook#> . @prefix d: <http://learningsparql.com/ns/data#> . d:i0432 ab:firstName "Richard" . d:i0432 ab:lastName "Mutt" . d:i0432 ab:homeTel "(229) 276-5135" . d:i0432 ab:nick "Dick" . d:i0432 ab:email "[email protected]" . d:i9771 ab:firstName "Cindy" . d:i9771 ab:lastName "Marshall" . d:i9771 ab:homeTel "(245) 646-5488" . d:i9771 ab:email "[email protected]" . d:i8301 ab:firstName "Craig" . d:i8301 ab:lastName "Ellis" . d:i8301 ab:workTel "(245) 315-5486" . d:i8301 ab:email "[email protected]" . d:i8301 ab:email "[email protected]" .RDF文書: ex069.ttl
# filename: ex069.ttl @prefix ab: <http://learningsparql.com/ns/addressbook#> . @prefix d: <http://learningsparql.com/ns/data#> . # People d:i0432 ab:firstName "Richard" ; ab:lastName "Mutt" ; ab:email "[email protected]" . d:i9771 ab:firstName "Cindy" ; ab:lastName "Marshall" ; ab:email "[email protected]" . d:i8301 ab:firstName "Craig" ; ab:lastName "Ellis" ; ab:email "[email protected]" . # Coursesd:course34 ab:courseTitle "Modeling Data with OWL" .
d:course71 ab:courseTitle "Enhancing Websites with RDFa" . d:course59 ab:courseTitle "Using SPARQL with non-RDF Data" .
d:course85 ab:courseTitle "Updating Data with SPARQL" . # Who's taking which courses d:i8301 ab:takingCourse d:course59 . d:i9771 ab:takingCourse d:course34 . d:i0432 ab:takingCourse d:course85 . d:i0432 ab:takingCourse d:course59 . d:i9771 ab:takingCourse d:course59 .
SPARQLクエリ: ex070.rq
# filename: ex070.rq PREFIX ab: <http://learningsparql.com/ns/addressbook#> SELECT ?last ?first ?courseName WHERE { ?s ab:firstName ?first ; ab:lastName ?last ; ab:takingCourse ?course . ?course ab:courseTitle?courseName . }Graph IRI: http://zest.comp.ae.keio.ac.jp/ex069
SPARQLクエリ: ex094.rq
# filename: ex094.rq
PREFIX ab: <http://learningsparql.com/ns/addressbook#> SELECT DISTINCT?first ?last
WHERE { ?s ab:takingCourse ?class ; ab:firstName ?first ; ab:lastName ?last . }
Graph IRI: http://zest.comp.ae.keio.ac.jp/ex069
SELECT ?first ?lastRDF文書: ex100.ttl
# filename: ex100.ttl
@prefix ab: <http://learningsparql.com/ns/addressbook#> .
@prefix d: <http://learningsparql.com/ns/data#> .
d:i0432 ab:firstName "Richard" ;
ab:lastName "Mutt" ;
ab:instrument"sax" ;
ab:instrument"clarinet" .
d:i9771 ab:firstName "Cindy" ;
ab:lastName "Marshall" ;
ab:instrument"drums" .
d:i8301 ab:firstName "Craig" ;
ab:lastName "Ellis" ;
ab:instrument"trumpet" .
SPARQLクエリ: ex103.rq
# filename: ex103.rq PREFIX ab: <http://learningsparql.com/ns/addressbook#> SELECT ?first ?last ?instrument WHERE { ?person ab:firstName?first ; ab:lastName?last ; ab:instrument?instrument . { ?person ab:instrument "sax" . } UNION { ?person ab:instrument "trumpet" . } }Graph IRI: http://zest.comp.ae.keio.ac.jp/ex100
RDF文書: ex104.ttl
# filename: ex104.ttl
@prefix dm: <http://learningsparql.com/ns/demo#> .
@prefix d: <http://learningsparql.com/ns/data#> .
d:item432 dm:cost 8 ;
dm:location <http://dbpedia.org/resource/Boston> .
d:item857 dm:cost 12 ;
dm:location <http://dbpedia.org/resource/Montreal> .
d:item693 dm:cost 10 ;
dm:location "Heidelberg" .
d:item126 dm:cost 5 ;
dm:location <http://dbpedia.org/resource/Lisbon> .
SPARQLクエリ: ex105.rq
# filename: ex105.rq
PREFIX dm: <http://learningsparql.com/ns/demo#>
SELECT ?s ?cost
WHERE
{
?s dm:cost?cost .
FILTER (?cost < 10)
}
Graph IRI: http://zest.comp.ae.keio.ac.jp/ex104
RDF文書: ex104.ttl
# filename: ex104.ttl
@prefix dm: <http://learningsparql.com/ns/demo#> .
@prefix d: <http://learningsparql.com/ns/data#> .
d:item432 dm:cost 8
;
dm:location <http://dbpedia.org/resource/Boston> .
d:item857 dm:cost 12 ;
dm:location <http://dbpedia.org/resource/Montreal> .
d:item693 dm:cost 10 ;
dm:location "Heidelberg" .
d:item126 dm:cost 5
;
dm:location <http://dbpedia.org/resource/Lisbon> .
SPARQLクエリ: ex109.rq
# filename: ex109.rq PREFIX dm: <http://learningsparql.com/ns/demo#> PREFIX db: <http://dbpedia.org/resource/> SELECT ?s ?cost ?location WHERE { ?s dm:location ?location ; dm:cost ?cost . FILTER (?location IN (db:Montreal, db:Lisbon)) . }Graph IRI: http://zest.comp.ae.keio.ac.jp/ex104
RDF文書: ex104.ttl
# filename: ex104.ttl
@prefix dm: <http://learningsparql.com/ns/demo#> .
@prefix d: <http://learningsparql.com/ns/data#> .
d:item432 dm:cost 8 ;
dm:location <http://dbpedia.org/resource/Boston> .
d:item857 dm:cost 12 ;
dm:location <http://dbpedia.org/resource/Montreal> .
d:item693 dm:cost 10 ;
dm:location "Heidelberg" .
d:item126 dm:cost 5 ;
dm:location <http://dbpedia.org/resource/Lisbon> .
SPARQLクエリ: ex112.rq
# filename: ex112.rq PREFIX dm: <http://learningsparql.com/ns/demo#> PREFIX db: <http://dbpedia.org/resource/> SELECT ?s ?cost ?location WHERE { ?s dm:location ?location ; dm:cost ?cost .FILTER (?location NOT IN (db:Montreal, db:Lisbon)) . }