NHK番組LODでSPARQLを書いてみる

これは [SPARQL Advent Calendar 2015](http://qiita.com/advent-calendar/2015/sparql) 23日目の記事です。
普段は生命情報系のRDFを対象にSPARQLを叩いていますが、折角なのでこれまで触ったことがないデータを対象にSPARQLを投げてみようということで、今年11月に試験提供が開始された[NHK番組LOD](http://www.nhk.or.jp/strl/lod/index.html)を選びました。

SPARQLのやさしい解説はしていませんので、よくわからない方は[SPARQL本](http://www.amazon.co.jp/dp/4802090439)を是非ご参照ください！（宣伝）
#NHK番組LODとは
NHK番組LODは、番組放送データの新しい活用方法の調査・研究を目的として、ひとまず[LODチャレンジJapan2015](http://lodc.jp/2015/concrete5/index.php)用に期間限定(2015年11月12日～2016年7月18日)で提供されているデータのようです。

[利用方法](http://www.nhk.or.jp/strl/lod/usage.html) | [データ仕様](http://www.nhk.or.jp/strl/lod/data_spec.html) | [SPARQLサンプル](http://www.nhk.or.jp/strl/lod/sparql_sample.html)

ドキュメントを読んだりちょっと触ればわかりますが、ざっくり特徴をまとめると以下のような感じです。

- WebAPIでデータ取得でき、リクエストURLにSPARQLを埋め込める
- API利用には事前にAPIキーの取得が必要
- DBpediaのSPARQLエンドポイントようなGUIは用意されていない
- API成功時のレスポンスはSPARQLの仕様に準拠したフォーマットが採用されている
- クロスドメイン通信は許可されていない(javascript(ajax)では利用出来ない)
- 放送予定の番組データが提供されている(だいたい2〜3日分ぐらい？原則毎日更新)
- 放送局(東京,帯広,沖縄...)毎の放送データが提供されている

#SPARQL例

##サンプル１：ある放送局の放送予定番組一覧を取得する

```
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX nhklod: <http://lod2015.nhk.jp/nhklod/>
PREFIX nhklod-area: <http://lod2015.nhk.jp/nhklod/area/>
PREFIX nhklod-service: <http://lod2015.nhk.jp/nhklod/service/>
PREFIX nhklod-genre: <http://lod2015.nhk.jp/nhklod/genre/>

SELECT ?start_time ?service_name ?title
{
  ?program
    rdf:type nhklod:Program ;
    nhklod:title ?title ;
    nhklod:start_time ?start_time ;
    nhklod:area ?areaIRI ;
    nhklod:service ?serviceIRI .
   ?areaIRI nhklod:area_name "神戸"^^xsd:string .
  ?serviceIRI nhklod:service_name ?service_name .
  FILTER ( STR(?service_name) IN ("NHK総合1", "NHKEテレ1") )
}
ORDER BY ?start_time
```

上記のSPARQLは神戸放送局の"NHK総合1"または"NHKEテレ1"チャンネルでの放送予定(リアルタイムではない)の番組一覧を取得しています。読みやすいように"神戸"と書いていますが、実際には?areaIRIを直接エリアコード([データ仕様](http://www.nhk.or.jp/strl/lod/data_spec.html))で指定する方がシンプルなクエリになります。
`nhklod:area nhklod-area:280 ;`
また、[データ仕様](http://www.nhk.or.jp/strl/lod/data_spec.html)のチャンネル名は全角半角が実際のデータと異なっていますのでご注意ください（指摘中）。

結果(jsonをテーブル形式にしたもの)

|start_time                 |service_name  |title                                                    |
|---------------------------|--------------|---------------------------------------------------------|
|2015-12-23T01:40:00+09:00  |NHKEテレ1      |放送休止                                                   |
|2015-12-23T04:10:00+09:00  |NHK総合1       |ＮＨＫプレマップ「おやすみ日本　眠いいね！」２９（火）夜１１：２５から  |
|・・・・                     |・・          |・・・・                                                  |
情報提供：ＮＨＫ


##サンプル２：番組内容をテキスト検索する

```
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX nhklod: <http://lod2015.nhk.jp/nhklod/>
PREFIX nhklod-area: <http://lod2015.nhk.jp/nhklod/area/>
PREFIX nhklod-service: <http://lod2015.nhk.jp/nhklod/service/>
PREFIX nhklod-genre: <http://lod2015.nhk.jp/nhklod/genre/>

SELECT ?start_time ?service_name ?title ?content
{
  ?program
    rdf:type nhklod:Program ;
    nhklod:title ?title ;
    nhklod:content ?content ;
    nhklod:start_time ?start_time ;
    nhklod:area ?areaIRI ;
    nhklod:service/nhklod:service_name ?service_name .
   ?areaIRI nhklod:area_name "神戸"^^xsd:string .
   FILTER (REGEX (?content, "ディーン") && REGEX (?content, "フジオカ") ) 
}
ORDER BY ?start_time
```
上記のクエリは番組内容のテキストから"ディーン"及び"フジオカ"が含まれる番組リストを取得しています。これで、ディーン・フジオカがいっぱい出てきそうな日だけ朝ドラを観る、なんてことも可能だーーー！！（つべこべ言わず毎日観ましょう）

結果(jsonをテーブル形式にしたもの)

|start_time                 |service_name  |title                                                    |content                                                  |
|---------------------------|--------------|---------------------------------------------------------|---------------------------------------------------------|
|2015-12-23T07:30:00+09:00  |NHKBSプレミアム |	連続テレビ小説　あさが来た（７５）「東京物語」|	あさ（波瑠）とうめ（友近）は、東京の五代友厚（ディーン・フジオカ）の事務所を訪れる。そこに現れたのは、政府の要人で内務卿を務める大久保利通（柏原収史）であった。あさは、三人でこれからの日本について語る。居眠りしていたうめが目を覚ますと、その様子に驚いて…。改めて大阪のためにがんばろうと思う、あさ。一方、大阪の新次郎（玉木宏）は千代の世話をしながらあさのことを心配に思って…。|
|2015-12-23T07:30:00+09:00  |NHKBSプレミアム(104ch) |	連続テレビ小説　あさが来た（７５）「東京物語」|	あさ（波瑠）とうめ（友近）は、東京の五代友厚（ディーン・フジオカ）の事務所を訪れる。そこに現れたのは、政府の要人で内務卿を務める大久保利通（柏原収史）であった。あさは、三人でこれからの日本について語る。居眠りしていたうめが目を覚ますと、その様子に驚いて…。改めて大阪のためにがんばろうと思う、あさ。一方、大阪の新次郎（玉木宏）は千代の世話をしながらあさのことを心配に思って…。 |
|・・・・                     |・・          |・・・・                                                  |・・・・   |
情報提供：ＮＨＫ

##サンプル３：２つの放送局の片方でしかやってない番組を調べる
```
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX nhklod: <http://lod2015.nhk.jp/nhklod/>
PREFIX nhklod-area: <http://lod2015.nhk.jp/nhklod/area/>
PREFIX nhklod-service: <http://lod2015.nhk.jp/nhklod/service/>
PREFIX nhklod-genre: <http://lod2015.nhk.jp/nhklod/genre/>

SELECT DISTINCT ?title ?genre
WHERE {
  ?program_area1 rdf:type nhklod:Program ;
    nhklod:title ?title ;
    nhklod:area nhklod-area:270 .
  MINUS
  {
    ?program_area2 rdf:type nhklod:Program ;
      nhklod:title ?title ;
      nhklod:area nhklod-area:130 .
  }
  ?program_area1 nhklod:genre/nhklod:genre_name ?genre
}
```
ちょっとマニアックなクエリですが、大阪(270)で放送されているが、東京(130)では放送されていない番組をピックアップしています。
どうせ関西だしお笑い番組でも映しとけ、みたいな結果を期待していましたが、そこまで大きな番組の違いはありませんでした。画一放送、さすが公共放送の鑑ですね(?)。

結果(jsonをテーブル形式にしたもの)

|title	| genre |
|-------|-------|
|関西のニュース・気象情報	| 	定時・総合 |
|関西の気象情報	| 	天気 |
|関西のニュース・気象情報	| 	天気 |
|関西のニュース	| 	ローカル・地域 |
|関西８４５～関西のニュースと気象情報～		| ローカル・地域 |
|ニュースほっと関西▽デスクが“斬る”３来年の政治展望▽あさが来たで大にぎわい！	| 	ローカル・地域 |
|おはよう関西　▼“遊び”で社員育成！技術とアイディア磨く	| 	ローカル・地域 |
|平成２７年度　ＮＨＫ新人お笑い大賞～堺市立美原文化会館から中継～	| 	芸能・ワイドショー |
|助けて！きわめびと「“笑顔”の写真を撮りたい」	| 	暮らし・住まい |
|ぐるっと関西　おひるまえ　▽年末年始のヒストリアの秘話	| 	暮らし・住まい |
|ぐるっと関西　おひるまえ　▽年末年始のヒストリアの秘話	| 	番組紹介・お知らせ |
|助けて！きわめびと「“笑顔”の写真を撮りたい」	| 	トークバラエティ |
|平成２７年度　ＮＨＫ新人お笑い大賞～堺市立美原文化会館から中継～	| 	お笑い・コメディ |
|助けて！きわめびと「“笑顔”の写真を撮りたい」	| 	ドキュメンタリー／教養 |
情報提供：ＮＨＫ

#まとめ
他のLODと繋がりそうなURIはありませんでしたが、ユースケースの一つとしては、地域的な要素、時間的な要素、番組内容に含まれる単語等で番組を探し出してユーザに通知するとかかなぁと思いました。
ご興味のある方は、是非もっと調べつくしてLODチャレンジJapan2015へご応募を！