im@sparqlを触ってみる その3 - クエリの内容を理解する
の続き。
実際にちょこちょこ触って、クエリの雰囲気を掴めてきたので、自分なりの理解の仕方を書いておく(一部間違えているかも)。
用語
Resource Description Framework - Wikipedia
略称RDF。 データベース(im@sparql)内のデータの構成を示すもの。
主語(subject)・述語(predicate)・目的語(object)の3要素(トリプル)で関係情報を示す。 (リレーショナルデータベースでは無い=NoSQLと考えて良いのだろうか?)
無理矢理オブジェクトに当てはめると、「主語」はオブジェクト本体、「述語」はプロパティ名及び型、「目的語」はプロパティの値、のようなものと解釈した。
主語・述語にはURI、目的語には値やURIなどが指定される(目的語がURIの場合はオブジェクト型のプロパティのような形で階層構造になる)。
SPARQL - Wikipedia
RDFに対するクエリ言語。 SQL風の文法らしい(私自身はSQLを碌に触ったことないので不明)。
今回の記事で扱うクエリはこの言語で書かれたものになる。
どことなくXPathに近い雰囲気も感じる。
クエリ
今回は以下のクエリの内容を理解する。
PREFIX
PREFIX schema: <http://schema.org/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX imas: <https://sparql.crssnky.xyz/imasrdf/URIs/imas-schema.ttl#>
主語・述語・目的語の一部はURIで示されるが、いちいち書くのは大変なのでエイリアスを設定するのが一般的。
例えば
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
はhttp://www.w3.org/1999/02/22-rdf-syntax-ns#
をrdf:
で省略できるようになり、
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
をrdf:type
と書けるようになる。
SELECT
SELECT *
SELECT ?変数名
とすることで、結果として出力する値(変数)を指定できる。
今回は*
が指定されているため、次のWHERE
内で使用された変数全てが結果として出力される。
WHERE-1
WHERE内は文が多いので、前後に分けて考えてみる。
WHERE { ?s rdf:type imas:ScriptText; imas:Source ?source; schema:text ?text.
WHERE内には主語 述語 目的語
と書き、書かれた条件に当てはまるものが探索される。
まず?s rdf:type imas:ScriptText
となっているため、主語(?s)は任意で、述語がrdf:type
、目的語がimas:ScriptText
となるものが探索され、結果が?s
変数に入る。
3行目には2個しか要素が書かれていないが、前の行が;
で終わっているため、主語は前の行と同じもの指定する、となる(4行目も同じ)。
3行目、4行目では2行目で見つかった主語(?s)についてimas:Source
、schema:text
の情報を?source
変数、?text
変数に格納している。
WHERE-2
?source schema:name ?name; filter(regex(str(?name),"千早")) }
1行目は先ほどと同じで、?source
についてschema:name
の情報を?name
変数に格納している。
2行目ではフィルター、特定の要素のみの抽出が行われている。
filter
はかっこ内の評価結果がTrueとなるものだけを結果として出力する。
中の式は、?name
変数をstr()
関数で文字列化し、regex
(正規表現マッチ)で"千早"
と一致するものだけがTrueとなる。
WHEREまとめ
出力される変数(結果)
rdf:type
がimas:ScriptText
となる要素?s
?s
のimas:Source
を示す?source
?s
のschema:text
を示す?text
?source
のschema:name
を示す?name
ただし、?name
が"千早"
に一致するもののみ。
Order By
order by ?text
?text
変数の値でソート。
自分なりの解釈まとめ
はてなブログだとシンタックスハイライトが効かないので読みにくいけれど……。
# 使用する名前空間の宣言 PREFIX schema: <http://schema.org/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX imas: <https://sparql.crssnky.xyz/imasrdf/URIs/imas-schema.ttl#> # WHERE内の全変数出力 SELECT * WHERE { # rdf:type が imas:ScriptText のものを ?s に入れて ?s rdf:type imas:ScriptText; # $s の imas:Source を ?source に imas:Source ?source; # $s の schema:text を ?text に入れる schema:text ?text. # ?source の schema:name を ?name に入れて ?source schema:name ?name; # ?name が "千早" と一致するものだけを抽出 filter(regex(str(?name),"千早")) }order by ?text # ?text の値でソート