この記事は、アイドルマスター Advent Calendar 2018 の18日目の記事です。

アイドルマスター Advent Calendar 2018
https://adventar.org/calendars/3046

im@sparqlにContributeしやすくするため
rdflintという、RDFファイルのチェックツールを作ったので、
このエントリでは、その背景と使い方を紹介します。

takemikami/rdflint | GitHub
https://github.com/takemikami/rdflint

ツール作成の背景

im@sparqlとは、SPARQLというクエリ言語を用いて、
アイドルマスターのデータを検索・利用出来るWebサービスなのですが。
このデータはGitHubのリポジトリで管理されており、
誰でも、データを追加・編集して、PullRequestを送ることが出来ます。

im@sparql
https://sparql.crssnky.xyz/imas/

imas/imasparql | GitHub
https://github.com/imas/imasparql

PullRequestを送ることが出来るとは言うものの、
担当アイドルに関するちょっとした誤字の修正レベルでも。
Apache Jena Fusekiを立ち上げて、
RDFファイルをロードして、
SPARQLを投げてみて問題無いかをチェック
という工程をこなす必要があり、
慣れていないとちょっと時間がかかってしまいそうです。

Apache Jena Fusekiにロードしてエラーが出ないかの確認程度は、
コマンド一発で確認出来るようにしたいと思い、このツールを作りました。
# コマンド一発ならCIでも実行出来るため。

ツール作成のために、Apache Jenaを調べてみると、割と簡単だったので、
ついでに以下のようなチェック機能も作成しました。

  • 未定義の語彙を、述語や目的語に使用していないかチェックする機能
  • SPARQLでクエリを投げて、結果を検証するカスタムルールの定義機能

基本的な使い方

それでは、実際の使い方を説明します。

まずは、以下のようにim@sparqlをGitHubからcloneします。

$ git clone git@github.com:imas/imasparql.git
$ cd imasparql

次に、rdflintを取得して、実行してみます。

$ wget https://jitpack.io/com/github/takemikami/rdflint/0.0.2/rdflint-0.0.2-all.jar
$ java -jar rdflint-0.0.2-all.jar -baseuri https://sparql.crssnky.xyz/imasrdf/

この状態では、何もエラーは出ないはずです。

エラーがある場合は、以下のように表示されます。

この例は、
箱崎星梨花を示すURIが
https://sparql.crssnky.xyz/imasrdf/RDFs/detail/Hakozaki_Serika
にも関わらず、
https://sparql.crssnky.xyz/imasrdf/RDFs/detail/Hakozaki_serika
で参照しているために、エラーとなっています。
※「S」が大文字小文字の誤り。

# この誤りは、以下のPullRequestで修正済み。
# https://github.com/imas/imasparql/pull/168

カスタムルールの実行

次にカスタムルールを定義して実行してみます。

以下のような設定ファイルを作成します。

.rdflint-config.yml

baseUri: https://sparql.crssnky.xyz/imasrdf/
rules:
- name: アイドル定義用ファイル
  target: "RDFs/765AS.rdf"
  query: |
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    SELECT ?s ?o
    WHERE {
      ?s rdf:type ?o .
      FILTER NOT EXISTS {
        ?s rdf:type <https://sparql.crssnky.xyz/imasrdf/URIs/imas-schema.ttl#Idol>
      }
    }    
  valid: |
    while(rs.hasNext()) {
      log.warn("アイドル以外の定義があります " + rs.next())
    }    

以下のコマンドでカスタムルールを実行します。

$ java -jar rdflint-0.0.2-all.jar -config .rdflint-config.yml

この状態では、何もエラーは出ないはずです。

このカスタムルールは、 RDFs/765AS.rdfファイルに、
https://sparql.crssnky.xyz/imasrdf/URIs/imas-schema.ttl#Idol型以外の定義があると
エラーにしています。

queryの部分に、問題のあるデータを抽出するSPARQLクエリを書き、
validの部分で、クエリの結果行分エラーを出力しています(groovyスクリプトです)。

試しに、Song.rdfから「魔法をかけて!」の定義を
RDFs/765AS.rdfにコピーして見ると、以下のようなエラーになります。

RDFs/765AS.rdf
  warn   アイドル定義用ファイル: アイドル以外の定義があります ( ?o = <https://schema.org/MusicRecording> ) ( ?s = <https://sparql.crssnky.xyz/imasrdf/RDFs/detail/%E9%AD%94%E6%B3%95%E3%82%92%E3%81%8B%E3%81%91%E3%81%A6%21%20%28M%40STER%20VERSION%29_01> )

このように基本的なルールが機械的にチェック出来ると、
レビュアの手を煩わせなくて済むため、
PullRequestを送る側も、心理的なハードルも下がると考えられます。

そうなれば、編集者とレビュアもContributeしやすいし、
プロデューサーさんのお給料も上がりますね!

rdflintを活用するといいことばっかりです!
プロデューサーさん、わたし、頑張ります♪