Linked Open Data・DBPedia

Image from Gyazo

DBPediaとは

DBPediaWikipediaから情報を抽出し, Linked Open Data(LOD) として公開するプロジェクトのことです (LODはウェブでデータを公開・共有するための仕組みのこと). DBPediaでは,人物,地理,音楽アルバム,映画,ビデオ・ゲーム, 組織・団体,生物種,病気などのデータが多言語で管理されており, ジャパンサーチと同様にSPARQLのエンドポイントを介してデータの検索・取得が可能です. 今回はDBPediaから愛知県出身の日本のアーティストを検索してみましょう.

ウェブページの作成

SPARQLの検索結果を表示するページを作成しましょう. 最初に index.html にリンクを追加します. 検索結果を表示するページは,dbpedia.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>
	<li><a href="cgi-bin/dbpedia.py">DBPedia</a></li>      
</ul>

Image from Gyazo

SPARQLで検索

DBPediaのSPARQLのエンドポイントは下記のURLです.

http://ja.dbpedia.org/sparql

SPARQLの検索条件は下記のように記述します. 今回取得するのは,URL,名前(foaf:name), 概要(dbpedia-owl:abstract),出身地(prop-ja:origin)の4つのデータです. URLはジャンル(dbpedia-owl:genre) が J-POP(dbpedia-ja:J-POP) であることを条件としています. また,検索結果から出身地に 愛知県 の文字が含まれるコンテンツだけを抽出しています.

SELECT ?url ?name ?abstract ?origin WHERE{
  ?url dbpedia-owl:genre dbpedia-ja:J-POP;
       foaf:name ?name;
       dbpedia-owl:abstract ?abstract;
       prop-ja:origin ?origin.
       FILTER(CONTAINS(str(?origin), "愛知県"))
}

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

#!/usr/bin/env python

from SPARQLWrapper import SPARQLWrapper, JSON

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

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

print("<head>")
print("<meta charset='utf-8'>")
print("<title>DBPedia</title>")
print("</head>")

print("<body>")
print("<h1>DBPedia</h1>");

url = "http://ja.dbpedia.org/sparql"
sparql = SPARQLWrapper(url)
sparql.setReturnFormat(JSON)

prefix = """
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia-owl:  <http://dbpedia.org/ontology/>
PREFIX dbpedia-ja: <http://ja.dbpedia.org/resource/>
PREFIX category-ja: <http://ja.dbpedia.org/resource/Category:>
"""

query = """
SELECT ?url ?name ?abstract ?origin WHERE{
  ?url dbpedia-owl:genre dbpedia-ja:J-POP;
       foaf:name ?name;
       dbpedia-owl:abstract ?abstract;
       prop-ja:origin ?origin.
       FILTER(CONTAINS(str(?origin), "愛知県"))
}
"""

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

table = "<table border=`1``>"
table += "<tr>"
table += "<th>name</th>"
table += "<th>abstract</th>"
table += "</tr>"

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

    url = result['url']['value']
    name = result['name']['value']
    abstract = result['abstract']['value']
    origin = result['origin']['value']    

    table += "<tr>"
    table += f"<td><a href={url}>{name}</a></td>"
    table += f"<td>{abstract}</td>"
    # table += f"<td>{origin}</td>"            
    table += "</tr>"

print(table)

print("</body>")

print("</html>")

下記が検索結果です. 愛知県出身の原一博氏や 鈴木早智子氏がリストに含まれていることが確認できます.

Image from Gyazo

参考書籍