Docker Compose上のNeo4jにcsvデータをインポートする方法
この記事では、Docker Compose上のNeo4jにcsvデータをインポートする方法をまとめています。
Neo4jにcsvデータをimportしようとした際に、直インストールやDockerで構築したNeo4jでは正常にimportできたのですが、Docker Composeで構築したNeo4jでは失敗してしまいました。
試行錯誤の上、最終的にはDocker Compose上でも正常にimportできたのですが、はまりポイントがいくつかあったので、私の場合の成功例として備忘録を残します。
準備
import用データの作成
importするcsvデータを作成します。 今回はNeo4jの公式マニュアルで提示されている以下の3ファイルをimportします。
- movies.csv
movieId:ID,title,year:int,:LABEL
tt0133093,"The Matrix",1999,Movie
tt0234215,"The Matrix Reloaded",2003,Movie;Sequel
tt0242653,"The Matrix Revolutions",2003,Movie;Sequel
- actors.csv
personId:ID,name,:LABEL
keanu,"Keanu Reeves",Actor
laurence,"Laurence Fishburne",Actor
carrieanne,"Carrie-Anne Moss",Actor
- roles.csv
:START_ID,role,:END_ID,:TYPE
keanu,"Neo",tt0133093,ACTED_IN
keanu,"Neo",tt0234215,ACTED_IN
keanu,"Neo",tt0242653,ACTED_IN
laurence,"Morpheus",tt0133093,ACTED_IN
laurence,"Morpheus",tt0234215,ACTED_IN
laurence,"Morpheus",tt0242653,ACTED_IN
carrieanne,"Trinity",tt0133093,ACTED_IN
carrieanne,"Trinity",tt0234215,ACTED_IN
carrieanne,"Trinity",tt0242653,ACTED_IN
docker-compose.ymlの準備
docker-compose.ymlを以下のように作成します。
version: '3'
services:
neo4j:
image: neo4j:latest
ports:
- 57474:7474
- 57687:7687
volumes:
- ./volumes/neo4j/data:/data
- ./volumes/neo4j/logs:/logs
- ./volumes/neo4j/import:/import
- ./volumes/neo4j/script:/script
environment:
- EXTENSION_SCRIPT=/script/import_data.sh
-
image neo4jのlatestです。
-
ports ホスト側で57474、57687でアクセスできるようにマッピングしています。
-
volumes データを永続化するためにホスト側にディレクトリを作成してコンテナ側にマウントしています。
ホスト側ディレクトリ コンテナ側ディレクトリ 用途 ./volumes/neo4j/data /data Neo4jデータ用ディレクトリ ./volumes/neo4j/logs /logs Neo4jのlogディレクトリ ./volumes/neo4j/import /import importデータを保存するディレクトリ ./volumes/neo4j/script /script import用スクリプトを保存するディレクトリ -
enviromnet dockerのNeo4j imageは、環境変数EXTENSION_SCRIPTにスクリプトを指定でき、そのスクリプトで環境の初期化や設定(資格情報の読み込みやneo4j.conf設定の動的な設定等)に使うことが可能です。 EXTENSION_SCRIPTが指定されている場合は、まずdockerのNeo4j imageの entrypoint コードが実行され、次にEXTENSION_SCRIPTで指定されたスクリプトが実行され、最後にNeo4jが起動されます。
docker-composeでcsvデータをimportする場合には、Neo4jの起動後にimport処理を実施するとエラーになるため、今回は、EXTENSION_SCRIPTにimport用スクリプトを指定して、Neo4jが起動される前にimport処理を実施します。
import用スクリプトの準備
EXTENSION_SCRIPTで指定するimport用スクリプトを準備します。 20-22行目でimportデータを指定していますので、適宜変更してください。今回は、movies.csv、actors.csv、roles.csvの3つです。
#!/bin/bash
set -euC
# EXTENSION_SCRIPTはコンテナが起動するたびにコールされるため、
# import処理が実施済かフラグファイルの有無をチェック
if [ -f /import/done ]; then
echo "Skip import process"
return
fi
# neo4jのdatabaseの削除
echo "Start the database deletion process"
rm -rf /data/databases
rm -rf /data/transactions
echo "Complete the database deletion process"
# CSVデータのインポート
echo "Start the data import process"
bin/neo4j-admin database import \
--nodes=/import/movies.csv \
--nodes=/import/actors.csv \
--relationships=/import/roles.csv \
neo4j
echo "Complete the data import process"
# import処理の完了フラグファイルの作成
echo "Start creating flag file"
touch /import/done
echo "Complete creating flag file"
# EXTENSION_SCRIPTはroot権限で実行されるため、本スクリプトを実行すると、
# /dataと/logsの所有者がrootになってしまうので、所有者をneo4jに変更。
# 所有者を変更しないとNeo4jが起動できません。
echo "Start ownership change"
chown -R neo4j:neo4j /data
chown -R neo4j:neo4j /logs
echo "Complete ownership change"
Docker Composeでの起動
ここまでで必要なファイルの準備が完了しましたので、実際にDocker Composeで起動します。
各種ファイルの配置
Neo4j用にディレクトリを1つ作成して、その配下に準備したdocker-compose.yml、importデータファイル、import用スクリプトを以下のように配置します。
.(Neo4j用のディレクトリ)
├── docker-compose.yml
└── volumes
└── neo4j
├── import
│ ├── actors.csv
│ ├── movies.csv
│ └── roles.csv
└── script
└── import_data.sh
Neo4jの起動
docker-compose.ymlを配置したディレクトリに移動して、以下のコマンドを実行します。
なお、私はrootless dockerにしているので実行にroot権限が不要ですが、環境によってはsudo
を先頭に付与する必要があります。
docker-compose up -d
Neo4jの起動確認
http://localhost:57474にアクセスして、Neo4jにアクセスできることを確認します。 その際に、Neo4jへの接続画面になるので、以下のように入力して、Neo4jに接続します。
フィールド | 値 | 備考 |
---|---|---|
Connect URL | neo4j://localhost:57687 | ポート番号はデフォルトの7687ではなく57687ですので、注意してください。 |
Database | 空のままで良いです。 | |
Authentication type | Username /Password | |
Username | neo4j | 初期値です。 |
Password | neo4j | 初期値です。Neo4jに接続後、変更要求があります。 |
実際にCypherクエリを実行してみると、以下のようにデータがimportされていることが分かります。
終わりに
この記事では、Docker Compose上のNeo4jにcsvデータをインポートする方法を備忘録として残しました。 今回の構成でのハマりポイントは以下の2つでした。
- Docker ComposeでのNeo4jでは、Neo4jが起動する前にcsvデータをインポートする必要がある
- EXTENSION_SCRIPTでimportを実行して解消
- EXTENSION_SCRIPTがroot権限で実行されるため、importデータの所有者がrootになりNeo4jが起動できない
- EXTENSION_SCRIPT内でimport処理後に所有者をneo4jに変更して解消
この記事が少しでも誰かの助けになると幸いです。