• 利用案内
  • サービス概要
  • 東京本館
  • 関西館
  • 国際子ども図書館
  • アクセス
  • 複写サービス
  • 登録利用者制度
  • オンラインサービス
  • オンラインサービス一覧
  • 国会関連情報
  • 蔵書検索
  • 電子図書館
  • 調べ方案内
  • 電子展示会

コラム:書誌データ利活用(7)―Web NDL Authorities解読講座 その2―いろいろ探せるSPARQL(スパークル)

NDL書誌情報ニュースレター

NDL書誌情報ニュースレター2015年2号(通号33号)

【はじめに】

本誌2015年1号(通号32号)のコラムでは、「国立国会図書館典拠データ検索・提供サービス(Web NDL Authorities)」で用いられている、Linked Dataに必要な技術や要素についてご説明しました。今回は、Web NDL Authoritiesの典拠データを、コンピュータ言語SPARQLを使って検索する方法をご紹介します。SPARQLを利用すると、Linked Dataに対し、柔軟性の高い検索が実現できます。現在のWeb NDL Authoritiesの検索画面では、キーワードと分類記号からしか検索できませんが、SPARQLを利用すると、いろいろな検索条件を指定できます。また、典拠データの中で自分が必要とする項目だけを抽出したり、検索結果をさまざまな形式で取得したりすることができます。

【SPARQLとは】

SPARQLは、"SPARQL Protocol and RDF Query Language"の略で、「スパークル」と呼ばれています。RDF(Resource Description Framework)で記述されたデータの検索や操作を行うためのコンピュータ言語(RDFクエリ言語[1])の一種であり、ウェブの世界の標準です[2]

SPARQLでは、RDFグラフの中で検索したいパターンをクエリとして表し、データを取得することができます。これにより、さまざまな条件でデータを検索できます。

前回のおさらいになりますが、RDFは、リソースの関係を主語(Subject)、述語(Property)、目的語(Object)の三つの要素(トリプル)で表現します(図1)。

「このホームページ(http://www.ndl.go.jp/)の作成者は国立国会図書館である。」のRDFグラフ
図1 RDFグラフの例

トリプルはRDFを表現する基本的な単位となり、共通の主語や目的語を介してどんどんつながることができます。図2のように、あるトリプル(青枠)の主語に当たるリソースが、別のトリプル(赤枠)では目的語として関連付けられる場合もあります。RDFグラフは、このトリプルの一組以上の集合で構成されています。


図2 RDFグラフの例(トリプルの集合)

Web NDL AuthoritiesもRDFモデルを採用しているため、典拠データがRDFグラフで表現されています。そこで、SPARQLにより取得したいグラフのパターンを指定することで、当てはまるパターンのグラフを取り出すことができます。言いかえると、検索条件にマッチするRDFトリプルがあるかどうかをデータベースに問い合わせ、マッチするRDFトリプルを返してもらう仕組みです(図3)。

コンピュータや人間等の利用者が、RDFトリプルによるSPARQLクエリを投げると、RDFトリプルを格納しているデータベースが検索結果をRDFトリプルで返してくれるイメージ図
図3 SPARQLクエリのイメージ

【基本的なSPARQLのクエリ】

SPARQL1.0[3]には、データを取得するためのクエリ形式が4種類あります(表1)。

表1 基本的なクエリ
SELECTは、グラフパターンにマッチする値の組合せを取得する。ASKは、グラフパターンにマッチするものがあるかどうかを調べる。DESCRIBEは、リソースに関する説明(グラフ)を取得する。CONSTRUCTは、新しいグラフを作成して取得する。

このうち、Web NDL Authoritiesの典拠データを検索する際によく使う「SELECT」についてご説明します。

【クエリの基本構造】

まず、SELECTで取得したい変数を指定する。変数はクエスチョンで始まる文字列である。アスタリスク記号を指定すると、すべての変数が対象になる。つぎに、検索条件を指定するため、WHEREに続けて取得したいグラフパターンを半角並括弧で囲む。ピリオドは、トリプルの終わりを示す。
図4 クエリの基本構造

SPARQLによるクエリは、未知の部分を変数としたRDFグラフを記述し、変数にあてはまるURIや文字列を取得する形式になります[4]。つまり、RDFトリプルの主語、述語、目的語に当たる変数「?s」「?p」「?o」に、それぞれ語彙や値を入力することで、検索・取得したいグラフパターンを指定できます。ピリオドは、トリプルの終わりを示すため、重要です。複数の条件を指定したい場合は、取得したい複数のグラフパターンを半角並括弧{}で囲みます。

図4のクエリは、主語「?s」、述語「?p」、目的語「?o」がすべて変数で、いずれの値も指定されていないため、あらゆるグラフパターンが該当します。したがって、図5のように対象となるデータベース内のすべてのデータ(RDFグラフの中のすべてのトリプル)を検索・取得することができます(赤枠)。そして、検索条件に特定の語彙や値を指定すれば、図6のように、そのパターンに該当するトリプル(赤枠)を取得できます。


図5 検索条件の主語、述語、目的語に変数を指定すると、すべてのグラフパターンを取得できる


図6 特定のグラフパターンを指定すると、マッチしたグラフパターンのみ取得できる

すべてのデータを取得するクエリは、初めて使うデータセットやサービスに対し、どのようなデータなのか、どのような語彙を使っているのか等を調べるために使うことができます。ただし、問い合わせ先のシステムの負荷を防ぐために、「LIMIT」を使って取得件数の上限を設定するのが一般的です。たとえば、「LIMIT」の値を100に設定した場合、検索結果が101件以上あったとしても、一度に取得できる結果は最大100件です。101件目以降の結果を取得したい場合は、「OFFSET」を合わせて使います。「OFFSET」を使うと、検索結果の先頭から指定した値までをスキップし、その次からデータを取得することができます。そこで、図7のように「OFFSET」の値を100に設定することで、101件目以降の結果から最大100件を取得できます[5]

検索条件をすべて変数にしたクエリに、LIMIT 100、OFFSET 100を追記すると、それぞれ検索結果の上限件数100件、先頭からスキップする件数100件が指定できる。
図7 101件目以降の結果100件を取得するクエリ例

【Web NDL Authoritiesで試してみる】

SPARQLエンドポイント

RDFトリプルが格納されたデータベース(図3参照)へのSPARQLクエリを受け付ける場所(URI[6])を「SPARQLエンドポイント」と呼びます。Web NDL AuthoritiesのSPARQLエンドポイントは、http://id.ndl.go.jp/auth/ndlaです。このURIにパラメータを付与(条件を設定)して利用することができます。

Web NDL Authoritiesで対応するパラメータは表2の二つです。XML形式の検索結果を取得したい場合、次のような形になります。
http://id.ndl.go.jp/auth/ndla?query={URLエンコードしたクエリ}&output=xml

表2 Web NDL Authoritiesで対応するパラメータ
queryで、URLエンコードしたSPARQLクエリを指定できる。Outputで、結果フォーマットを指定できる。フォーマットは6種類、xml、json、turtle、htmltab、plain、php_serから選択できる。ただし、turtleは一部のクエリでのみ指定できる。

たとえば、標目が「図書館」である典拠データのURIを調べたい場合は、下記のURIを指定すると検索結果(http://id.ndl.go.jp/auth/ndlsh/00573385)がXML形式で返ってきます[7]
http://id.ndl.go.jp/auth/ndla/?query=PREFIX+rdfs%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3ESELECT+%3Fs+WHERE+{%3Fs+rdfs%3Alabel+%27%E5%9B%B3%E6%9B%B8%E9%A4%A8%27.}%0D%0A&output=xml

詳細は、「Web NDL Authorities SPARQL API仕様書(第1.0版)」をご覧ください[8]

「え、こんな複雑なクエリ、自分で作れない…」という方に朗報です:便利なフォーム

上記のように、自分でパラメータの設定やURLエンコーディングができなくても、ご安心ください。Web NDL Authoritiesでは、もう少し簡単にSPARQLを使って検索できるように、便利なフォームが用意されています(図8)。このフォームにSPARQLクエリを入力し、検索結果の出力形式を選択すれば、SPARQLによる検索を試すことができます。

まず、フォームの入力欄にクエリを入力する。つぎに、プルダウンメニューから検索結果の出力形式を選択し、検索ボタンを押す。
図8 Web NDL AuthoritiesでSPARQLによる検索を試せるフォーム

とはいえ、最低限のクエリの作り方は知っておく必要はありますので、これから三つのクエリ例をご説明します。

例1)標目が「図書館」である典拠データのURIを調べたい

まずは「〇〇(主語)の△△(述語)は××(目的語)である。」というトリプルの基本的な表現に当てはめてみます。「図書館のURIは××である。」と表したいところですが、前回のコラムでご説明したとおり、主語「〇〇」は、文字列「図書館」ではなくURIで記述する必要があります。Web NDL Authoritiesの場合、主語「〇〇」が、典拠データのURIで表され、トリプルは「〇〇(典拠データのURI)の標目(rdfs:label)は、『図書館』である。」と表現されます。主語「〇〇」に当たる典拠データのURIが、取得したい結果になります。典拠データのURIを変数「?s」とすると、この変数を含むRDFグラフは図9のように表せます[9]

主語が変数?s、述語がrdfs:label、目的語が図書館のグラフ
図9 標目(rdfs:label)が「図書館」である典拠データのRDFグラフ

このRDFグラフをクエリにすると、図10のようになります。

クエリの冒頭で、PREFIXを使い、述語のURIの接頭辞を定義する。つぎにSELECTを使い、取得したい主語の変数?sを指定する。そしてWHEREに続けて、検索条件として、主語が変数?s、述語がrdfs:label、目的語が文字列図書館のグラフを指定し、半角並括弧で囲む。文字列は引用符、URIは山括弧でそれぞれ囲む。述語のrdfs:labelは、冒頭のPREFIXで定義した接頭辞rdfs:を使って省略表記されている。
図10 例1のクエリ(解説付き)

クエリの中で、述語のURIを省略して表記するためには、先頭行で「PREFIX」を使います。図10では、「http://www.w3.org/2000/01/rdf-schema#」の代わりに「rdfs:」という接頭辞を使うことを定めています(赤枠)。つぎに「SELECT」に続けて検索結果として取得したい変数「?s」(典拠データのURI)を指定し(青枠)、最後に「WHERE」に続けて取得(検索)条件となるグラフパターン全体を半角並括弧{}で囲みます(緑枠)。

このクエリをWeb NDL Authoritiesのフォームに実際に入力し、データの形式を選択して「検索」ボタンを押すと、前述のクエリと同じ結果(http://id.ndl.go.jp/auth/ndlsh/00573385)が返ってきます(HTML Table(表形式)XMLJSONPlainSerialized PHPTurtleの各形式で取得できます[10])。

例2)「図書館」を含む標目とその典拠データのURIを調べたい

例1の応用編です。同様に、「〇〇の標目(rdfs:label)は、××である。」の形で表現でき、主語「〇〇」に当たる典拠データのURIが取得したい結果になります。目的語「××」の条件に該当する標目は、「国立国会図書館」「図書館法」「日本図書館協会」等さまざまなものが考えられます。そのため、例1のように目的語の値を一つに指定できません。

そこで、主語の「?s」だけでなく目的語にも変数「?o」を用い、「〇〇の標目(rdfs:label)は、××である。」に該当するトリプル(図11)を取得し、さらに条件(××に「図書館」を含む=文字列の部分一致)を設定して絞り込むクエリを記述します(図12)。

主語が変数?s、述語がrdfs:label、目的語が変数?oのグラフ
図11 標目(rdfs:label)が変数「?o」である典拠データのRDFグラフ

例1と同様に、クエリの冒頭で、PREFIXを使い、述語のURIの接頭辞を定義する。つぎにSELECTを使い、取得したい主語の変数?sと目的語の変数?oを指定する。そしてWHEREに続けて、検索条件として、主語が変数?s、述語がrdfs:label、目的語が変数?oのグラフを指定する。さらに、条件を絞り込むため、FILTER regexを使い、検索対象の目的語の変数?o,文字列図書館を半角括弧で囲む。これにより、変数?oに図書館という文字列を含むグラフだけが取得できる。これらを半角並括弧で囲む。
図12 例2のクエリ(解説付き)

基本的なクエリ構造は、例1と同様です。取得するトリプルの条件を絞り込むためには、「FILTER」と「regex」を使います。「regex」は正規表現[11]による検索ができ、「FILTER」と組み合わせて利用します。絞り込みの条件を変えたり、複数の条件を設定することで、さまざまな検索ができます。なお、例2のように、部分一致検索等により検索結果の件数の規模が予測できない場合は、問い合わせ先のシステムの負荷を考慮し、前述の「LIMIT」を使って最大取得件数をあらかじめ設定しておくのが一般的です。

このクエリの結果は、Web NDL Authoritiesのフォームで実際に試してみてください。

例3)没後100年の著者名とその典拠データのURIを調べたい

たとえば、現在が2015年であれば、没年が1915年の著者を検索するためのクエリを考える必要があります。前回のコラムでご説明しましたが、個人名典拠には、典拠データを維持管理するための情報(典拠情報)と、その典拠の記述対象となる実在の人物や場所等(名称実体)の2種類のURIがあります。そのため、件名典拠よりもグラフの構成が複雑です。そこで、先にRDFグラフをご紹介します[12]

主語が典拠情報、述語がoaf:primaryTopic、目的語が名称実体のグラフと、主語を名称実体とする二つのグラフが連結している。主語が名称実体の二つのグラフは、それぞれ述語がfoaf:name、目的語が名称のグラフと、述語がrda:dateOfDeath、目的語が没年のグラフである。
図13 名称と没年を表現するRDFグラフ例

図13では、「名称実体」を介してトリプルが連結しています。赤い点枠線で囲まれたトリプルは、「〇〇(典拠情報)のおもなトピック(foaf:primaryTopic)は、××(名称実体)である。」と表現できます。「foaf:primaryTopic」は、「典拠情報」と「名称実体」を結びつけるための語彙(述語)です。つまり、この典拠データが誰(実体)に関するものなのかを表しています。ここでは、「名称実体」は目的語に当たります。

一方、青い点枠線で囲まれた二つのトリプルでは、「名称実体」は主語にあたり、それぞれ「〇〇(名称実体)の名称(foaf:name)は、××である。」「〇〇(名称実体)の没年(rda:dateOfDeath)は、××年である。」と表現できます。

この〇〇や××をそれぞれ変数に置き換えたグラフが図14です。

主語の典拠情報を変数?uri1、述語がfoaf:primaryTopic、目的語の名称実体を変数?uri2とするグラフと、名称実体の変数?uri2を主語とする二つのグラフが連結している。変数?uri2を主語とする二つのグラフは、それぞれ述語がfoaf:name、目的語がの名称が変数?nameのグラフと、述語がrda:dateOfDeath、目的語が文字列1915のグラフである。
図14 変数に置き換えたRDFグラフ例

図13と同様に、図14のトリプルはそれぞれ下記のように表現できます。
「?uri1のおもなトピック(foaf:primaryTopic)は、?uri2である。」
「?uri2の名称(foaf:name)は、?nameである。」
「?uri2の没年(rda:dateOfDeath)は、1915年である。」

知りたいのは、著者名(名称)を示す変数「?name」の値と、典拠データ(典拠情報)のURIを示す変数「?uri1」です。そのため、上記の3パターンのトリプルが含まれるRDFグラフを検索するクエリが必要です(図15)。


図15 例3のクエリ(解説付き)

この結果、たとえば、1915年に亡くなった著者として、初代外務大臣の井上馨(名称)がいることがわかり、合わせてその典拠データのURI(http://id.ndl.go.jp/auth/ndlna/00423610)も取得できます。このクエリでは、没年の数字を変えたり、述語の没年(rda:dateOfDeath)を職業(rda:biographicalInformation)や専攻(rda:fieldOfActivityOfThePerson)に代えることで、さまざまな検索ができます。

ご紹介したクエリ例は、いずれもシンプルなものです。ほかにも、「生年順」「典拠データの作成日順」等検索結果の並び順を指定したり(「ORDER BY」)、検索結果の件数をカウントする(「COUNT」)ことができます。さらに、検索結果をグループごとに集計する(「GROUP BY」と「COUNT」)等、複数の条件をかけあわせることもできます。たとえば、「『インターネット』」の関連語にどのようなものがあるか調べたい。」「『を見よ参照』をもつ典拠データの件数が知りたい。」「2000年以降に生まれた人物の典拠データが年ごとに何件あるか、生年が新しい順に結果を取得したい。」といった、検索画面ではできないさまざまな条件を自由に設定できます[13]。ぜひ、試してみてください。なお、Web NDL Authoritiesの「SPARQLについて」でも、いろいろなクエリ例をご紹介しています。合わせてご覧ください。

【おわりに】

Web NDL Authoritiesの検索画面の利用者は、おもに人間を想定しています。ですが、SPARQLによる検索の場合、人間だけでなく、コンピュータ等でも利用できるため、典拠データを活用したさまざまなウェブサービスやアプリケーションが新たに生まれる可能性があります。国立国会図書館では、典拠データの利活用を促進するために、SPARQLによる検索のようなウェブ環境で使いやすい手段をご提供するとともに、本誌今号でもご紹介しているとおり、典拠データの拡充も行っています。これからも典拠データそのものの充実と、使いやすいサービスの提供の二本柱で取り組んでいきます。

最後にひとつお願いです。「Web NDL AuthoritiesのSPARQLを使ってこんなアプリやサービスを作ってみた」という方は、ニュースレター担当(bib-news@ndl.go.jp)までぜひお知らせください。

柴田 洋子
(しばた ようこ 収集・書誌調整課)

[1] クエリとは、コンピュータ(データベース)に対するデータの検索や更新等の処理を要求することです。「クエリ言語」は、「問い合わせ言語」と呼ぶこともあります。

[2] 2008年1月にSPARQL1.0が、そして2013年3月にSPARQL1.1がそれぞれW3C勧告となりました。各文書の日本語訳は、以下のW3Cのページで公開されており、検索することができます。
W3C Translations
http://www.w3.org/Consortium/Translation/, (参照 2015-05-01).

[3] Web NDL AuthoritiesはSPARQL1.0に対応しているため、本稿では、おもにWeb NDL Authoritiesで利用できるクエリをご紹介しています。
Web NDL AuthoritiesのSPARQLの詳細は下記の仕様書をご覧ください。
Web NDL Authorities SPARQL API仕様書(第1.0版)(PDF: 469KB)
http://iss.ndl.go.jp/ndla/wp-content/uploads/2014/03/api-spec.pdf, (参照 2015-05-01).
下記のページでも概要とクエリ例を紹介しています。
SPARQLについて
http://iss.ndl.go.jp/ndla/sparql/, (参照 2015-05-01).
検索画面での検索方法については、ヘルプをご覧ください。
ヘルプ
http://iss.ndl.go.jp/ndla/help/, (参照 2015-05-01).

[4] 本稿のクエリは、説明の便宜上複数の改行を設けていますが、改行の位置による処理結果に違いはありません。

[5] Web NDL Authoritiesでは、仕様上、一度に取得できる結果の上限があらかじめ100件に設定されています。詳細は、[3]のAPI仕様書をご覧ください。

[6] URLは、URIの一種のため、本稿ではURLとURIをほぼ同義で使っています。

[7] Web NDL Authoritiesの詳細表示画面)では、「標目」を表す語彙が別に表示されています(後出[8]参照)。そのため、正確に説明すると、「ラベルが『図書館』である典拠データ」となりますが、本稿では、説明をわかりやすくするために「ラベル」も「標目」と表現しています。後出の例1、例2の表現も同様です。

[8] Web NDL Authoritiesの典拠データで使用している各述語(rdfs:label等)については、詳細表示画面の項目名または以下をご覧ください。
・RDFモデルについて > 4.RDF/XML形式によるフォーマット仕様
http://iss.ndl.go.jp/ndla/model/#4,(参照 2015-05-01).

[9] 変数の?に続く文字列は任意であり、「?uri」のように設定することもできます。ただし、Web NDL Authoritiesで使用できる文字は、英数字です。仮名漢字は用いることができません。詳細は、[3]のAPI仕様書をご覧ください。

[10] Turtleは、プルダウンに含まれていないためフォームでは選択できませんが、表2のとおり、outputパラメータの値として指定することができます。

[11] 正規表現とは、文字列の集合を一つの形式で表現する方法です。例は部分一致検索ですが、前方一致、後方一致、英字の大文字小文字を区別しない検索等もできます。Web NDL Authoritiesで使える正規表現の詳細は、[3]のAPI仕様書をご覧ください。

[12] Web NDL Authoritiesの典拠データが具体的にどのようなRDFグラフになっているか知りたい場合は、実際に典拠データを何件か検索し、任意の表示形式で確認してみたり、ウェブ上で公開されているRDFグラフの視覚化ツール等を試してみたりしてください。

[13] 前述のとおり、Web NDL AuthoritiesではSPARQL1.0に対応していますが、一部のSPARQL1.1で導入された機能も利用できます。また、リンクしているクエリの表記は一例です。詳細は、[3]のAPI仕様書をご覧ください。


このページの先頭へ

NDL書誌情報ニュースレター(年4回刊)

ISSN 1882-0468/ISSN-L 1882-0468
2015年2号(通号33号) 2015年6月26日発行

編集・発行 国立国会図書館収集書誌部

〒100-8924 東京都千代田区永田町1-10-1

メールアドレス:bib-news@ndl.go.jp(ニュースレター編集担当)