要旨
開発環境(Windows11でのWSL2(ubuntu))にNeo4jを構築する手順を備忘録として残す
前提
- VScodeでWSL2(ubuntu)にアクセスでき、dockerがすでに実行できる環境であること
手順
1. Neo4jのDockerコンテナを起動する
1.1 Docker起動方法
Neo4jをDockerコンテナで運用する際、docker runコマンドでも起動可能だが、以下の理由からdocker composeを利用する。
- 起動時のオプション(環境変数、ポート、ボリュームなど)を明示的に記録できる
- 複数のサービスを一括管理する準備が容易になる
1.2 ディレクトリ構成
- 以下のようにhomeディレクトリ配下に構成させるとする
suzuki/ <==HOMEディレクトリ
├── docker-compose.yaml <== ここに用意する
├── neo4j/
├── conf
├── data
├── logs
└── plugins
├── apoc-2025.08.0-core.jar <==ここに入れる
├── neo4j-graph-data-science-2.21.0.jar <==ここに入れる
└── neo4j-graph-data-science-2.21.0.zip
Dockerはコンテナ内の /data
、/conf
、/plugins
をホスト(ローカルPC)の./neo4j
ディレクトリ内の対応するサブディレクトリにマウントするようにすれば
Neo4jに関するすべてのファイルが./neo4j
ディレクトリに整理されて保存されるので管理がしやすくなる。
1.3 ディレクトリの作成
まず、docker-compose.yaml
ファイルを置く場所と同じ階層に、neo4j
ディレクトリを作成し、その中にサブディレクトリを作成する。
mkdir -p neo4j/{data,logs,conf,plugins}
このコマンドは、neo4j
ディレクトリと、その下にあるdata
,logs
,conf
,plugins
の4つのサブディレクトリを一度に作成します
1.4 docker-composer.yamlの作成
# ファイルを作成する
touch docker-compose.yaml
services:
neo4j:
image: neo4j:latest
ports:
- "7474:7474"
- "7687:7687"
environment:
NEO4J_AUTH: "neo4j/your password" <==パスワードは適宜変えてください
NEO4J_apoc_export_file_enabled: "true"
NEO4J_apoc_import_file_enabled: "true"
NEO4J_apoc_import_file_use__neo4j__config: "true"
NEO4J_dbms_security_procedures_unrestricted: "apoc.*,gds.*"
ulimits:
nofile:
soft: 40000
hard: 40000
volumes:
- ./neo4j/data:/data
- ./neo4j/logs:/logs
- ./neo4j/conf:/conf
- ./neo4j/plugins:/plugins
-
NEO4J_AUTH: "neo4j/your password"
- パスワード部分は適宜変えてください
-
NEO4J_dbms_security_procedures_unrestricted: "apoc.*,gds.*"
で、apocと、GDSの手続きがコンテナ内で利用可能になる -
volumes:
の部分は、さきほど作成したフォルダに合わせて記述する -
soft:40000と、hard:40000
は、Neo4jコンテナのファイルディスクリプタの最大数を設定- ファイルディスクリプタとは、OSがファイルやネットワークソケットなどのリソースを識別するために使用する番号。Neo4jのようなグラフデータベースでは、多くのファイル(データファイル、インデックスファイルなど)を同時に開く必要があるため、この制限が必要になる。
- soft limit(ソフトリミット): プロセスが一時的に設定できる最大値。この値はプロセス自身が変更可能。ただしhard limitを超えることはできない. - hard limit (ハードリミット): ユーザが設定できる最大値で、ソフトリミットの上限を定義します。ハードリミットは、一般ユーザが引き上げることはできない。
- この設定では、ソフトリミットとハードリミットの両方を
40000
に設定している。 - これはNeo4jが大量のファイルを扱えるように、ファイルのディスクリプタをデフォルトの制限に意図的に引き上げていることを意味する。これにより大規模なグラフデータセットを扱う際に発生する可能性のある「Too many open file」(開いているファイルが多すぎます)といったエラーを防ぐことができる
- ファイルディスクリプタとは、OSがファイルやネットワークソケットなどのリソースを識別するために使用する番号。Neo4jのようなグラフデータベースでは、多くのファイル(データファイル、インデックスファイルなど)を同時に開く必要があるため、この制限が必要になる。
1.5 GDS(Graph Data Science)ライブラリをマウントする
1.5.1.公式のウェブサイトから GDSライブラリをマウントするをダウンロードする
1.5.2 解凍
ダウンロードした、neo4j-graph-data-science-2.21.0.zip
ファイルを解凍(unzip)すると、jarファイルを得る
1.5.3 jarファイルの格納
neo4j-graph-data-science-2.21.0.jar
を、pluginsの中にコピーして入れる
1.6 APOCファイルをダウンロードしてマウントする
- ダウンロードしていれないと、Neo4jの起動後に
CALL apoc.help('apoc')
をブラウザから投入すると、Error Neo.ClientError.Procedure.Procedure.ProrocolNotFound
エラーになる
1.6.1 コンテナ名の確認
docker ps
-
NAMES
で表示される名前が、次のdocker exec
コマンドで指定すべき正しい名前。
例えば、docker-composeで起動した場合、名前は通常docekr-compose.yaml
を書いたディレクトリ名と、サービス名({neo4j})から生成される。例:mydirectory_neo4j_1
1.6.2 正しいVersion確認コマンドの実行
bash docker exec -it <コンテナ名> neo4j --version
# 例えばホームのsuzukiディレクトリで作業した場合
docker exec -it suzuki-neo4j-1 neo4j --version
2025.08.0
2025.08.0
というバージョンであることがわかる
1.6.3 GitHubからダウンロードする
GitHub neo4j apoc releasesからダウンロードする
# versionが2025.08.0の場合
wget https://github.com/neo4j/apoc/releases/download/2025.08.0/apoc-2025.08.0-core.jar
1.6.4 pluginsディレクトリに配置
ダウンロードしたファイルをホストマシンのpluginsディレクトリに配置する
mv apoc-<version>-core.jar ./plugins/
1.7 コンテナを起動する
docker compose up -d
# 起動
docker compose up -d
[+] Running 2/2
✓Network suzuki_default Created
✓Container suzuki-neo4j-1 Started
-
-d
はバックグランドで実行のオプション - もし起動しても、apocが動かないなど、おかしい場合は一度落として、フォアグラウンドで起動すると起動ログでエラーが確認できるので、それをみてエラーの原因を確認する
# 一度落とす
docker compose down
# フォアグラウンドで起動させる
docker compose up
[+] Running 2/2
✓Network suzuki_default Created
✓Container suzuki-neo4j-1 Started
# この後に起動ログが表示される
1.8 確認
1.8.1 Neo4jにブラウザからアクセスする
-
http://localhost:7474/browser/
にアクセスする- もしフォアグラウンドで
docker compose up
を実行した場合は、VS Codeにより自動でブラウザが起動する
- もしフォアグラウンドで
1.8.2 APOCの利用可能の確認
Neo4jブラウザで以下を実行し、APOCが利用可能になっていることを確認
CALL apoc.help('apoc')
1.8.3 テストデータの登録
起動したNeo4jにテストデータを登録する。
ブラウザ管理画面で以下のCypherクエリを実行し、ノードとリレーションシップを作成する。
CREATE (p:Person {name: "Alice", age: 30})-[:KNOWS]->(p2:Person {name: "Bob", age: 25})
1.8.4 登録したデータを確認する。
MATCH (n) RETURN n
1.8.5 データ永続化の確認
コンテナを再起動してデータが永続化されているか確認する。
コンテナを停止する。
docker compose down
コンテナを再起動する。
docker compose up -d
再びCypherクエリを実行し、データが存在することを確認する。
MATCH (n) RETURN n
参考