ジャパンサーチで検索・SPARQL

Image from Gyazo

SPARQLとは

SPARQLは, W3C によって標準化されている問い合わせ言語です. RDF と呼ばれる枠組みで記述された オンラインのデータベース(Linked Open Dataなど)にアクセスすることができます. 関係データベースの問い合わせ言語であるSQLによく似た文法で記述します.

ウェブページの作成

SPARQLの検索結果を表示するページを作成しましょう. 最初に index.html にリンクを追加します. 検索結果を表示するページは,js-sparql.py というファイル名のCGIプログラムで作成します.

<ul>
	<li><a href="cgi-bin/js-api.py">ジャパンサーチ 簡易Web API</a></li>
	<li><a href="cgi-bin/js-sparql.py">ジャパンサーチ SPARQL</a></li>
</ul>

Image from Gyazo

新規に js-sparql.py を作成し,cgi-binフォルダに配置します(実行権限の付与が必要). js-sparql.py には下記のコードを記述します.

#!/usr/bin/env python

print ("Content-type:text/html\n\n")

print("<!DOCTYPE html>")
print("<html>")

print("<head>")
print("<meta charset='utf-8'>")
print("<title>ジャパンサーチ SPARQL</title>")
print("</head>")

print("<body>")
print("<h1>ジャパンサーチ SPARQL</h1>");

print("</body>")

print("</html>")

Image from Gyazo

SPARQLで検索

ジャパンサーチのSPARQLは, エンドポイントと呼ばれるURLにアクセスすることでコンテンツのデータを取得できます.

https://jpsearch.go.jp/rdf/sparql

まずは,エンドポイントにアクセスために,SPARQLWrapper ライブラリをインストールします.

% pip install sparqlwrapper

インストールしたら,js-sparql.pySPARQLWrapper ライブラリをインポートします.

from SPARQLWrapper import SPARQLWrapper, JSON

それでは,SPARQLにアクセスしてみましょう. SPARQLの検索条件は主語,述語,目的語の組み合わせで構成されるRDFトリプル で表現します. 例えば,下記の条件は,主語が?url,述語がrdf:type,目的語がtype:絵画に対応します. これは,「基本区分(rdf:type)が絵画(type:絵画)であるコンテンツのURL(?url)」を検索することを意味しています. また,LIMITは検索結果の制限数であり,ここでは5に設定しています.

SELECT ?url WHERE{
  ?url rdf:type type:絵画.
}
LIMIT 5
url = "https://jpsearch.go.jp/rdf/sparql"
sparql = SPARQLWrapper(url)
sparql.setReturnFormat(JSON)

prefix = """
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX place: <https://jpsearch.go.jp/entity/place/>
PREFIX type: <https://jpsearch.go.jp/term/type/>
"""

query = """
SELECT ?url WHERE{
  ?url rdf:type type:絵画.
}
LIMIT 5
"""

sparql.setQuery(prefix + query)
results = sparql.query().convert()

for result in results["results"]["bindings"]:
    print(f"<p>{result['url']['value']}</p>")

取得したデータは JSON形式 となっています. ここでは,取得したURLの値を表示しています.

Image from Gyazo

次に,URLに加えて,ラベル(rdfs:label)とサムネイル(schema:image)を取得してみましょう. SPARQLの検索条件は下記のように記述します.

SELECT ?url ?label ?thumbnail WHERE{
  ?url rdf:type type:絵画;
       rdfs:label ?label;
       schema:image ?thumbnail.
}
LIMIT 5
for result in results["results"]["bindings"]:
    print(f"<p>{result['url']['value']}</p>")
    print(f"<p>{result['label']['value']}</p>")
    print(f"<p>{result['thumbnail']['value']}</p>")

Image from Gyazo

最後にtableタグで見た目を整形しましょう. ラベルにaタグでリンクを設定し,imgタグでサムネイル画像を表示します. ここで表示されている画像は,九州国立博物館東京国立博物館が所蔵しているコンテンツです.

table = "<table border=`1``>"
table += "<tr>"
table += "<th>label</th>"
table += "<th>thumbnail</th>"
table += "</tr>"

for result in results["results"]["bindings"]:

    url = result['url']['value']
    label = result['label']['value']
    thumbnail = result['thumbnail']['value']

    table += "<tr>"
    table += f"<td><a href='{url}'>{label}</a></td>"
    table += f"<td><img src='{thumbnail}'></td>"
    table += "</tr>"

print(table)

Image from Gyazo

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.