ジャパンサーチで検索・SPARQL
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>
新規に 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>")
SPARQLで検索
ジャパンサーチのSPARQLは, エンドポイントと呼ばれるURLにアクセスすることでコンテンツのデータを取得できます.
https://jpsearch.go.jp/rdf/sparql
まずは,エンドポイントにアクセスために,SPARQLWrapper ライブラリをインストールします.
% pip install sparqlwrapper
インストールしたら,js-sparql.py で SPARQLWrapper ライブラリをインポートします.
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の値を表示しています.
次に,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>")
最後に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)