SPARQLで取得したデータを入力とするEmbulkプラグイン(embulk-input-sparql)のご紹介
SPARQLのクエリでさまざまなendpointから、
データをバルクロード出来るように、
Embulkのプラグインを書いたので、その概要と使い方を紹介します。
embulk-input-sparql | GitHub
https://github.com/takemikami/embulk-input-sparql
SPARQLとは
SPARQLとは、
RDF(Resource Description Framework)で記述されたデータに対するクエリ言語です。
どんなクエリ言語かは、過去に作った資料があるので、以下をご覧下さい。
SPARQL入門 | slideshare
https://www.slideshare.net/takemikami/sparql-123607069
SPARQLを使ってデータを取得出来るendpointとしては、
例えば、以下のようなものが公開されています。
# Webサイト上からSPARQLを入力して、
# データの取得を試すことも出来るようになっています
e-Stat 統計LOD
http://data.e-stat.go.jp/lodw/sparqlendpoint
DBpedia Japanese
http://ja.dbpedia.org/page/SPARQL
Embulkとは
Embulkとは、データのバルクロードツールです。
embulk.org
https://www.embulk.org/
データのロード元・先を、
プラグインで追加出来る仕組みになっているので、
様々なデータストアに対応すること出来ることが大きな特徴です。
今回作成したembulk-input-sparqlプラグインを利用することで、
SPARQLで取得したデータを、
様々なロード先にバルクロードする事が出来るようになります。
使い方
それでは、embulk-input-sparqlの使い方を紹介します。
このエントリでは、
s-Stat 統計LODから国勢調査のデータをSPARQLで取得して、
MySQLにロードする流れを、例として紹介します。
embulkのセットアップ
まずはembulkをセットアップします。
Javaの実行環境が出来てる前提として、
embulk.org ( https://www.embulk.org/ )のQuickStartの通り、実行します。
curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
chmod +x ~/.embulk/bin/embulk
echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
現時点(2020年10月)の最新Stable版(embulk 0.9.23)は、
Java1.8系で実行する必要があるので、1.8系をJAVA_HOMEに指定しておきます。
macosの場合は、以下の通り。
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
プラグインの追加
次に、プラグインを追加します。
embulk-input-sparqlと、
MySQLにロードするためのembulk-output-mysqlを追加します。
embulk gem install embulk-input-sparql
embulk gem install embulk-output-mysql
追加されたプラグインは、以下のコマンドで確認します。
embulk gem list
MySQLの準備
データのロード先として、MySQLの環境を準備します。
OSによって構築方法は異なるので、MySQLのサイトを参照して下さい。
MySQL Community Edition
https://www.mysql.com/jp/products/community/
macosでhomebrewを使っている場合は、以下の通りです。
brew install mysql
mysql.server start
MySQLにデータベース・接続用ユーザを作成します。
$ mysql -uroot
mysql> create database mydb;
mysql> create user 'myaccount'@'%' identified by '※パスワードをここに指定※';
mysql> grant all on mydb.* to 'myaccount'@'%';
mysql> exit
データのロード先テーブルも作成しておきます。
$ mysql -umyaccount -p
mysql> use mydb
mysql> create table pref_population (pref varchar(128), year int, population int);
mysql> exit
実行
環境の準備が出来たので、実際にデータをロードしてみます。
データのロード元・ロード先の定義を、config.ymlに作成します。
ここでは、以下の内容を指定します。
in:
type: sparql
endpoint: https://data.e-stat.go.jp/lod/sparql/alldata/query
query: |
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX sdmx-dimension: <http://purl.org/linked-data/sdmx/2009/dimension#>
PREFIX estat-measure: <http://data.e-stat.go.jp/lod/ontology/measure/>
PREFIX cd-dimension: <http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/>
PREFIX cd-code: <http://data.e-stat.go.jp/lod/ontology/crossDomain/code/>
PREFIX g00200521-dimension-2010:<http://data.e-stat.go.jp/lod/ontology/g00200521/dimension/2010/>
PREFIX g00200521-code-2010:<http://data.e-stat.go.jp/lod/ontology/g00200521/code/2010/>
PREFIX sacs: <http://data.e-stat.go.jp/lod/terms/sacs#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?pref ?year ?population
where {
?s estat-measure:population ?population ;
sdmx-dimension:refArea ?area;
cd-dimension:timePeriod ?year ;
cd-dimension:sex cd-code:sex-all ;
cd-dimension:nationality cd-code:nationality-japan ;
g00200521-dimension-2010:area g00200521-code-2010:area-all ;
cd-dimension:age cd-code:age-all .
?area sacs:administrativeClass sacs:Prefecture;
rdfs:label ?pref.
FILTER (lang(?pref) = 'ja').
}
columns:
- { name: pref, type: string }
- { name: year, type: long }
- { name: population, type: long }
out:
type: mysql
host: localhost
user: myaccount
password: ※パスワードをここに指定※
database: mydb
ssl: false
table: pref_population
mode: truncate_insert
in配下には、以下のような内容を指定します。
- type ... 「sparql」と指定、inputプラグインの種別です。
- endpoint ... SPARQL endpointのURLを指定します。
- query ... SPARQLクエリを指定します。
- columns ... 出力するカラム・型を指定します。
次のコマンドで、バルクロードを実行します。
embulk run config.yml
バルクロードが成功すると、
以下のように、SPARQLで取得したデータがMySQLのテーブルにロードされます。
# ここでは都道府県・調査年・人口のデータをロードしています。
$ mysql -umyaccount -p
mysql> use mydb
mysql> select * from pref_population;
+--------------+------+------------+
| pref | year | population |
+--------------+------+------------+
| 香川県 | 2010 | 981113 |
| 茨城県 | 2010 | 2922821 |
| 栃木県 | 2010 | 1964917 |
| 岐阜県 | 2010 | 2037175 |
| 愛知県 | 2010 | 7174451 |
※途中省略※
| 愛媛県 | 2010 | 1415381 |
| 富山県 | 2010 | 1078898 |
| 岩手県 | 2010 | 1322417 |
+--------------+------+------------+
94 rows in set (0.00 sec)
mysql> exit
設定方法は省きますが、
MySQL等のデータベースにデータが取り込めていれば、
以下のような、Redash( https://redash.io/ )を使った可視化なども行いやすくなります。
活用シーン
embulk-input-sparqlの使い方の紹介は以上ですが、
このプラグインの活用シーンを、少し考えたいと思います。
embulk等でのデータのバルクロードでは、
以下のデータを、データウェアハウスに分析用に取り込むことが多いと考えられます。
- その組織が既に保有しているデータ
- 情報システムやIoT機器から出力されるログデータ
上記のようなデータに加えて、
オープンなデータを取り込み、紐付けを行った分析・活用が出来ると。
オープンデータの活用範囲を広げることが出来ます。