この記事は、アイドルマスター Advent Calendar 2019 の 3 日目の記事です。
3 日目が空席でしたので、昨日の記事に引き続き、『☆ピコピコプラネット☆』について書かせていただきたいと思います。
アルバム情報の取得
『☆ピコピコプラネット☆』で現状最も情報が多いのがアルバム情報です。ランティスのミリオンライブのページに掲載されているものから、ソロコレクション、コミックの特典まで網羅しています。
そのアルバム情報の SPARQL での引き方について見ていきましょう。
アルバムと曲の関係
まず『THE IDOLM@STER LIVE THE@TER PERFORMANCE 01』(LTP01)のリソースの記述を見てみましょう。
<LTP_01> a :MusicAlbum ;
:name "THE IDOLM@STER LIVE THE@TER PERFORMANCE 01" ;
:numTracks 4 ;
:track [
a :MusicRecording ;
:recordingOf <Thank_You> ;
:byArtist <765_MILLIONSTARS> ;
:position 1
] , [
a :MusicRecording ;
:recordingOf <Thank_You> ;
:byArtist <765PRO_ALLSTARS> ;
:position 2
] , [
a :MusicRecording ;
:recordingOf <Thank_You> ;
:byArtist <765THEATER_ALLSTARS> ;
:position 3
] ;
:albumRelease [
a :MusicRelease ;
:url <https://www.lantis.jp/imas/release_LACM-14080.html> ;
:image <https://www.lantis.jp/imas/img/release_imgs__0011s_0012_LTP01_H1.png> ;
:catalogNumber "LACM-14080" ;
:datePublished "2013-04-24"^^xsd:date
] ;
:isPartOf <LTP_Series> .
『☆ピコピコプラネット☆』では、schema.org をベースとして記述しているため、http://schema.org/
のプレフィックスに :
をあてています(普通は schema:
が使われることが多いです)。こうすることで記述量を減らせるというメリットがあります。
:track
は複数の :MusicRecording
を持ちます。その :MusicRecording
は :recordingOf
に :MusicComposition
(曲)を、:byArtist
に :MusicGroup
(ユニット)を持ちます。
:track
に直接曲名やユニット名を記述しないのは、アルバムと曲は多対多の関係にあるからです。アルバムは複数の曲を収録していますし、曲は複数のアルバムに収録される可能性があります(アーティストが違う場合もある)。

LTP01 に収録されている曲とアーティストを取得するクエリは以下のようになるでしょう。
BASE <https://mltd.pikopikopla.net/resource/>
PREFIX : <http://schema.org/>
SELECT ?song ?artist
WHERE {
<LTP_01> :track [
:recordingOf/:name ?song ;
:byArtist/:name ?artist
] .
}
:recordingOf/:name ?song
は :recordingOf [ :name ?song ]
と記述するのと同等です。
ユニット名のないユニット
:byArtist
が取りうる値には現状 3 パターンあります。
- ユニット名ありの
:MusicGroup
- ユニット名なしの
:MusicGroup
(空白ノード)
- アイドル
mltd:Idol
例えば、LTP02 は以下のようになっています。
<LTP_02> a :MusicAlbum ;
:name "THE IDOLM@STER LIVE THE@TER PERFORMANCE 02" ;
:numTracks 13 ;
:track [
a :MusicRecording ;
:recordingOf <キラメキ進行形> ;
:byArtist <天海春香> ;
:position 2
] , [
a :MusicRecording ;
:recordingOf <透明なプロローグ> ;
:byArtist <七尾百合子> ;
:position 4
] , [
a :MusicRecording ;
:recordingOf <トキメキの音符になって> ;
:byArtist <箱崎星梨花> ;
:position 6
] , [
a :MusicRecording ;
:recordingOf <Maria_Trap> ;
:byArtist <天空橋朋花> ;
:position 8
] , [
a :MusicRecording ;
:recordingOf <Precious_Grain> ;
:byArtist <最上静香> ;
:position 10
] , [
a :MusicRecording ;
:recordingOf <Legend_Girls> ;
:byArtist [
a :MusicGroup ;
:member
<天海春香> ,
<天空橋朋花> ,
<七尾百合子> ,
<箱崎星梨花> ,
<最上静香>
] ;
:position 12
] ;
:albumRelease [
a :MusicRelease ;
:url <https://www.lantis.jp/imas/release_LACA-15300.html> ;
:image <https://www.lantis.jp/imas/img/release_imgs__0011s_0011_LTP02_H1.png> ;
:catalogNumber "LACA-15300" ;
:datePublished "2013-05-29"^^xsd:date
] ;
:isPartOf <LTP_Series> .
『Legend Girls』を歌唱しているユニットにはユニット名がつけられていないため、:name
を持たない :MusicGroup
の空白ノードを記述しています。
したがって、LTP02 に収録されている曲名と歌っているアイドルを取得するクエリはこのようになります。
BASE <https://mltd.pikopikopla.net/resource/>
PREFIX : <http://schema.org/>
SELECT ?song (GROUP_CONCAT(?artist) AS ?members)
WHERE {
<LTP_02> :track [
:recordingOf/:name ?song ;
:byArtist/:member?/:name ?artist
] .
}
GROUP BY ?song
ちょっと複雑になりましたね・・・ちなみにこれを <LTP_01>
でやるとうまくいかないです(あかんやん)。
OPTIONAL
や IF
を組み合わせれば、いい感じに取得することは可能だと思います。多分・・・ちょっと思いつかなかったです。
可能性は無限大?
締まりのない終わり方でしたが、使い方次第でいろいろなことができると思います。SPARQL クエリの書き方が難しいですが・・・
みなさんもぜひ触ってみてください。
mltd.pikopikopla.net
宣伝です!
今週末の 12 月 7 日(土)、アイマスハッカソン 2019 が関東と関西で同時開催されます。参加者はまだ受付中ですので、ご興味ありましたら是非ご参加ください!