「牛の舌って薄いんですね」

蒼樹うめ『ひだまりスケッチ』第 6 巻「一頭から一枚」より

『☆ピコピコプラネット☆』を使ってみる

この記事は、アイドルマスター 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 に直接曲名やユニット名を記述しないのは、アルバムと曲は多対多の関係にあるからです。アルバムは複数の曲を収録していますし、曲は複数のアルバムに収録される可能性があります(アーティストが違う場合もある)。

f:id:foooomio:20191208213855p:plain

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> でやるとうまくいかないです(あかんやん)。

OPTIONALIF を組み合わせれば、いい感じに取得することは可能だと思います。多分・・・ちょっと思いつかなかったです。

可能性は無限大?

締まりのない終わり方でしたが、使い方次第でいろいろなことができると思います。SPARQL クエリの書き方が難しいですが・・・

みなさんもぜひ触ってみてください。

mltd.pikopikopla.net

宣伝です!

今週末の 12 月 7 日(土)、アイマスハッカソン 2019 が関東と関西で同時開催されます。参加者はまだ受付中ですので、ご興味ありましたら是非ご参加ください!