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/ )を使った可視化なども行いやすくなります。

図1

活用シーン

embulk-input-sparqlの使い方の紹介は以上ですが、
このプラグインの活用シーンを、少し考えたいと思います。

embulk等でのデータのバルクロードでは、
以下のデータを、データウェアハウスに分析用に取り込むことが多いと考えられます。

  • その組織が既に保有しているデータ
  • 情報システムやIoT機器から出力されるログデータ

上記のようなデータに加えて、
オープンなデータを取り込み、紐付けを行った分析・活用が出来ると。
オープンデータの活用範囲を広げることが出来ます。