im@sparqlにContributeしやすくするためにRDFファイルのチェックツールを作った
この記事は、アイドルマスター 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を活用するといいことばっかりです!
プロデューサーさん、わたし、頑張ります♪