メインコンテンツへスキップ

Docker Compose上のNeo4jにcsvデータをインポートする方法

··2 分·
Neo4j
Makoto Morinaga
著者
Makoto Morinaga
技術メモ、コーディング、環境構築のための個人ノート。
目次

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を以下のように作成します。

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つです。

import_data.sh
#!/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用スクリプトを以下のように配置します。

directory tree
(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を先頭に付与する必要がります。

Terminal
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に変更して解消

関連記事

Gatsby v2からGatsby v3への移行
··2 分
Blog Gatsby
Gatsbyによるブログ構築
··4 分
Netlify Gatsby Blog
正規方程式による最小二乗法の解の導出
··5 分
Normal-Equation Least-Squares-Methods