im@sparqlを触ってみる その3 - クエリの内容を理解する

imihito.hatenablog.jp

の続き。

実際にちょこちょこ触って、クエリの雰囲気を掴めてきたので、自分なりの理解の仕方を書いておく(一部間違えているかも)。

用語

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#>

C#で言う名前空間エイリアス

主語・述語・目的語の一部は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:Sourceschema: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:typeimas:ScriptTextとなる要素?s
  • ?simas:Sourceを示す?source
  • ?sschema:textを示す?text
  • ?sourceschema: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 の値でソート

参考サイト

sparql.crssnky.xyz

im@sparql.doc

SPARQL 1.1クエリ言語