Neo4jにcsvデータをimportしようとした際に、直インストールやDockerで構築したNeo4jでは正常にimportできましたが、Docker Composeで構築したNeo4jでは失敗しました。
試行錯誤の上、最終的にはDocker Compose上でも正常にimportできましたが、はまりポイントがいくつかあったので、私の場合の成功例として備忘録を残します。
準備 #
import用データの作成 #
importするcsvデータを作成します。 今回はNeo4jの公式マニュアルで提示されている以下の3ファイルをimportします。
-
movies.csv
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
actors.csv personId:ID,name,:LABEL keanu,"Keanu Reeves",Actor laurence,"Laurence Fishburne",Actor carrieanne,"Carrie-Anne Moss",Actor
-
roles.csv
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で起動します。
Placing Files #
Neo4j用にディレクトリを1つ作成して、その配下に準備したdocker-compose.yml
、importデータファイル、import用スクリプトを以下のように配置します。
(Neo4j directory)
├── 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されていることが分かります。

終わりに #
今回の構成でのハマりポイントは以下の2つでした。
- Docker ComposeでのNeo4jでは、Neo4jが起動する前にcsvデータをインポートする必要がある
EXTENSION_SCRIPT
でimportを実行して解消
EXTENSION_SCRIPT
がroot権限で実行されるため、importデータの所有者がrootになりNeo4jが起動できないEXTENSION_SCRIPT
内でimport処理後に所有者をneo4jに変更して解消