1
2

More than 5 years have passed since last update.

NDL Authorities APIをPythonで呼び出す。

Last updated at Posted at 2018-01-13

はじめに

NDL Authoritiesとは

国立国会図書館(NDL)の運営する典拠データの検索サイトです。
https://id.ndl.go.jp/auth/ndla

典拠データ

典拠データとは以下の通りです。

国立国会図書館では、利用者が求める資料を探し出せるように、タイトル、著者等を記録した書誌データを作成しています。書誌データには、著者名や件名として記録する人物、団体、テーマ等に複数の表記方法や同義語がある場合は一つにまとめ、同じ名称で異なるものを指す場合はそれぞれ区別して検索ができるように、「標目」を付与します。
これらの「標目」を統制するために、標目の別表記や同義語、標目として選んだ根拠を示す資料等の情報をまとめて記録したのが「典拠データ」です。
https://id.ndl.go.jp/information/about/

典拠データの利便性の例

*人名で検索した場合、時代によって呼び名が異なったり、言語によって綴りが違う場合も、同一のものとして扱うことができます
*特定のキーワードに対する上位語、下位語、同義語、関連語と、図書館の分類(NDC)を調べることができます。
 これによって、そのキーワードに関係する語句を効率よく拾い出すことができ、NDCからその分類の本をまとめて検索することができます。

WebAPI

国会図書館はNDL Authoritiesの検索WEB APIの仕様を公開しています。
http://id.ndl.go.jp/information/sparql/
これを元に、Python でAPIを呼び出すサンプルプログラムを作成しました。

SPARQLについて

WEBAPI呼び出し後のデータベースへの実質的なアクセスは、SPARQLのクエリが行っています。
その仕様についてはこちらを確認して下さい。
http://id.ndl.go.jp/information/sparql/
PythonはあくまでAPIの呼び出しまでを行うということです。

プログラム

Git Hub

アップロードしてあります。
https://github.com/AvocadoWasabi/Call-NDLAuthorities-API

要点

SPARQLクエリをパラメータとしてURLエンコードしたものを、
エンドポイントのURLと結合させ、GETします。
今回はJSONで結果を取得しています。
(searchメソッドで一連のメソッドを呼び出しています)

コード

以下はクラス化したコードの一部です。

sample
import requests
import json
import urllib.parse

def main():
    end_point = 'http://id.ndl.go.jp/auth/ndla'
    keyword = 'インターネット' #means Internet in Japanese.

    #make query
    #Make SPARQL Query, which searches authority data of the keyword
    query = ('PREFIX xl: <http://www.w3.org/2008/05/skos-xl#>'
            'PREFIX skos: <http://www.w3.org/2004/02/skos/core#>'
            'PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>'
            'PREFIX rda: <http://RDVocab.info/ElementsGr2/>'
            'PREFIX ndl: <http://ndl.go.jp/dcndl/terms/>'
            'PREFIX foaf: <http://xmlns.com/foaf/0.1/>'
            'SELECT ?uri1 WHERE{'
            '   ?uri1 rdfs:label "' + keyword + '"'
            '}')

    #URL encode
    parameter = urllib.parse.urlencode({'query' : query, 'output' : 'json'})
    #make whole URL
    url = end_point + '?' + parameter

    result = requests.get(url)
    try:
        data = json.loads(result.text)
    except json.decoder.JSONDecodeError:
        #JSONDecodeError happens if query is incorrect
        #print API's Error message
        print(result.text)

    #print result
    print(data)

if __name__ == '__main__':
    main()

結果

検索した「インターネット」の典拠データについて、
普通件名のアドレスhttp://id.ndl.go.jp/auth/ndlsh/00841024と、
団体名インターネット株式会社http://id.ndl.go.jp/auth/ndlna/001144835
の結果が得られました。

{'head': {'vars': ['uri1']}, 'results': {'bindings': [{'uri1': {'type': 'uri', 'value': 'http://id.ndl.go.jp/auth/ndlsh/00841024'}}, {'uri1': {'type': 'uri', 'value': 'http://id.ndl.go.jp/auth/ndlna/001144835'}}]}}
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2