Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

1. SPARQL 概要

SPARQL (SPARQL Protocol and RDF Query Language) は RDF クエリ言語です。SPARQL の S が SPARQL を表しているのは、間違っているわけではなく、再帰的頭字語 (recursive acronym) であるためです。2005年8月30日現在、2005年7月21日に発表された Working Draft が最新の SPARQL の規格です。SPARQL について理解するために、簡単な例を示します。先に示したように、SPARQL は RDF クエリ言語であるため検索の対象となる RDF グラフが必要になります。RDF グラフは複数の RDF トリプルにより構成され、RDF トリプルは 主語 (Subject)・述語 (Predicate)・目的語 (Object) の3つ組で成り立っています。以下に1つの RDF トリプルで構成されている RDF グラフを示します。

<http://tech.4dd.co.jp/book/book1> <http://purl.org/dc/element/1.1/title> "SPARQL Tutorial" .

図1
図1

上記の RDF トリプルの記述には Turtle という構文を用いています。<http://tech.4dd.co.jp/book/book1> が主語、<http://purl.org/dc/element/1.1/title> が述語、"SPARQL Tutorial" が目的語となっています。<http://tech.4dd.co.jp/book/book1> という本のタイトルは "SPARQL Tutorial" であるという意味になります。この RDF グラフに対して、<http://tech.4dd.co.jp/book/book1> のタイトルを検索するクエリを以下に示します。

SELECT  ?title
WHERE   { <http://tech.4dd.co.jp/book/book1> <http://purl.org/dc/element/1.1/title> ?title }

図2
図2

クエリは SELECT 句と WHERE 句から成っています。SELECT 句では検索結果として返す変数を定めており、WHERE 句でマッチする3つ組のパターンを示しています。上記クエリの検索結果は以下の表のようになります。

title
"SPARQL Tutorial"

本文では検索結果を表形式で示しますが、検索結果をXMLとして返す構文 SPARQL Variable Binding Results XML Format が考案されており、2005年8月30日現在、最新の Working Draft は W3C により2005年8月1日に発表されています。

SPARQL の中の <> で囲まれている文字は国際化識別子 IRI を表しています。IRI は URI を一般化したもので、URI, URL に準拠しています。# を用いたフラグメント識別子を含むこともできます。SPARQL の中で "", '' といったクォーテーションマークで囲まれた文字は文字列を表しており、整数値の場合は直接数値を記述すれば xsd:integer 型であると理解されます。他にも、小数点が記述されていれば xsd:double 型であると理解され、直接 true, false が記述されていれば xsd:boolean 型であると理解されます。?, $ で始まっている文字は変数を表しています。?abc, $abc は同じ変数を表します。?, $ は先頭に記述する以外に変数名の一部として用いることはできません。WHERE 句の3つ組の主語にリテラルを用いることもできますが、リテラルは述語・目的語を持たないため RDF データとマッチすることはありません。

SPARQL は IRI を省略するためのメカニズムを与えています。BASE キーワードを用いれば相対アドレスを用いることができ、PREFIX キーワードを用いれば接頭辞を用いることができます。BASE キーワードや PREFIX キーワードを用いた以下の4つのクエリは、前述のクエリと同じクエリとなります。

PREFIX  dc: <http://purl.org/dc/element/1.1/>
SELECT  ?title
WHERE   { <http://tech.4dd.co.jp/book/book1> dc:title ?title }
PREFIX  dc: <http://purl.org/dc/element/1.1/>
PREFIX  : <http://tech.4dd.co.jp/book/>
SELECT  $title
WHERE   { :book1 dc:title $title }
BASE    <http://tech.4dd.co.jp/book/>
PREFIX  dc: <http://purl.org/dc/element/1.1/>
SELECT  ?title
WHERE   { <book1> dc:title ?title }
BASE    <http://tech.4dd.co.jp/book/>
PREFIX  dcore: <http://purl.org/dc/element/1.1/>
SELECT  ?title
WHERE   { <book1> dcore:title ?title }

次に、もう少し複雑なクエリを見ていきます。まず、以下に RDF グラフを示します。

@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:a foaf:name "四次元太郎" .
_:a foaf:mbox <mailto:yonta@4dd.co.jp> .

図3
図3

@prefix キーワードで接頭辞の宣言を行っています。_:a は blank node であることを表していますが、2行目と3行目の blank node に同じ _:a というラベルを使用することで同じリソースであることを表しています。この RDF グラフから "四次元太郎" さんのメールアドレスを検索するクエリを以下に示します。

PREFIX  foaf: <http://xmlns.com/foaf/0.1/>
SELECT  ?mbox
WHERE   
{
  ?x foaf:name "四次元太郎" .
  ?x foaf:mbox ?mbox
}

図4
図4

WHERE 句の2つの3つ組にマッチする部分グラフを RDF グラフから検索し、マッチする部分グラフが存在した場合に、変数 ?mbox に対応する値を返します。検索結果は以下の表のようになります。結果は表形式となります。

mbox
<mailto:yonta@4dd.co.jp>

続けて、検索結果が複数になる場合、検索結果に blank node が含まれる場合を見ていきます。まず、以下に RDF グラフを示します。

@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:a foaf:name "四次元太郎" .
_:a foaf:mbox <mailto:yonta@4dd.co.jp> .
_:b foaf:name "次郎" .
_:b foaf:mbox <mailto:jiro@4dd.co.jp> .

図5
図5

この RDF グラフに対し、次のクエリを用いて検索を行います。

PREFIX  foaf: <http://xmlns.com/foaf/0.1/>
SELECT  ?x ?name ?mbox
WHERE
{
  ?x foaf:name ?name .
  ?x foaf:mbox ?mbox
}

図6
図6

結果は以下のようになります。

x name mbox
_:r "四次元太郎" <mailto:yonta@4dd.co.jp>
_:s "次郎" <mailto:jiro@4dd.co.jp>

検索によって2つの部分グラフがマッチするため、2つの結果が返ることになります。さらに、結果に blank node が含まれる場合、今回の例のように、RDF グラフで用いられた _:a, _:b というラベルがそのまま用いられる保証はなく、_:r, _:s といった異なったラベルが用いられる可能性があります。これはラベルが RDF グラフでのみ有効、あるいは検索結果でのみ有効であるためです。

最後に、WHERE 句に用いることができる3つ組の構文に関して、いくつか省略記法を紹介します。

1. 主語が同じ場合、";" で区切ることで主語を省略することができます。例えば次の検索条件は

?x foaf:name ?name .
?x foaf:mbox ?mbox .

次のように記述することができます。

?x foaf:name ?name ;
   foaf:mbox ?mbox .

2. 主語・述語が同じ場合、"," で区切ることで主語・述語を省略することができます。例えば次の検索条件は

?x foaf:nick "yonta" .
?x foaf:nick "よん太" .

次のように記述することができます。

?x foaf:nick "yonta" , "よん太" .

3. blank node は "[]" を用いて記述することができます。例えば

_:a foaf:name ?name .
_:a foaf:mbox ?mbox .

は、次のように書き換えることができます。

[] foaf:name ?name ;
   foaf:mbox ?mbox .
[ foaf:name ?name ;
  foaf:mbox ?mbox ] .
[ foaf:name ?name] foaf:mbox ?mbox .

4. "a" と記述することで <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> を表します。例えば、接頭辞 rdf が <http://www.w3.org/1999/02/22-rdf-syntax-ns#> を表しているとすると、

?x rdf:type :Class1 .

は、

?x a :Class1 .

と記述することができます。



  TECHSCOREのTOPページへ  
techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa