DBpediaを使って歌手の一覧を取得する


DBPediaとは?

クエリ言語SPARQLを用いることで日本語版のWikipediaから情報を抽出できるウェブサービスです。

今回の目標

ソニー・ミュージック・エンタテインメント・ジャパン(以下SMEJと略記)に所属している歌手の一覧を取得します。

Wikipediaからデータを取得するため、知名度の低い情報が掲載されていない可能性が高いなどの問題があります。が、今回は気にしないことにします。

SMEJのカテゴリに存在するページを取得する

Wikipediaには「Category:SMEJのアーティスト」というページが存在することを利用し、以下のクエリを実行します。

PREFIX dbpedia-owl:  <http://dbpedia.org/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX category-ja: <http://ja.dbpedia.org/resource/Category:>

select distinct ?artist where {
  ?artist rdf:type dbpedia-owl:Artist.
  ?artist dbpedia-owl:wikiPageWikiLink category-ja:SMEJのアーティスト.
}

歌手の一覧が返ってきます。この結果には「Category:SMEJのアーティスト」にある項目のみが含まれていて、下位カテゴリに属する項目は含まれていません。

SMEJの下位カテゴリを取得する

アーティスト一覧を取得するには、「Category:SMEJのアーティスト」だけでなくその下位に存在するカテゴリに属する記事を再帰的に取得する必要があります。

SELECT DISTINCT *
WHERE {
    ?categories skos:broader{0,10} <http://ja.dbpedia.org/resource/Category:SMEJのアーティスト> .
}

skos:broader{数字, 数字}は再帰の深さ(0から10)を指定しています。

この結果には「Category:シャ乱Qのアルバム」や「Category:ハロー!プロジェクトのコンサート」など今回は必要ない(歌手名でない)ものが含まれています。

SMEJとその下位カテゴリに含まれるアーティスト一覧を取得する

上記の2つを組み合わせることで「Category:SMEJのアーティスト」またはその下位カテゴリに属する歌手一覧が取得できます。

PREFIX dbpedia-owl:  <http://dbpedia.org/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX category-ja: <http://ja.dbpedia.org/resource/Category:>

select distinct * where{
    ?categories skos:broader{0,10} category-ja:SMEJのアーティスト .
    ?singer rdf:type dbpedia-owl:Artist .
    ?singer dbpedia-owl:wikiPageWikiLink ?categories .
}

アーティストの名前をテキストで取得する

それぞれの歌手の名前をプレーンテキストで取得します。名前は http://ja.dbpedia.org/property/namehttp://ja.dbpedia.org/property/名前 のいずれかに存在するので、FILTER式を用いてどちらの情報も拾うようにします。

PREFIX dbpedia-owl:  <http://dbpedia.org/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX category-ja: <http://ja.dbpedia.org/resource/Category:>
PREFIX property: <http://ja.dbpedia.org/property/>

select distinct ?name where{
    ?categories skos:broader{0,10} category-ja:SMEJのアーティスト .
    ?singer rdf:type dbpedia-owl:Artist .
    ?singer dbpedia-owl:wikiPageWikiLink ?categories .
    ?singer ?filter_name ?name .
    FILTER(?filter_name = property:name || ?filter_name = property:名前)
}