⛓️

Neo4j×Pythonでケミカルサプライチェーンを可視化する

2025/02/10に公開

背景

2024年は多くの化学プラントでトラブルがありました(参考文献1~4)。化学プラントは原料をパイプラインで供給していることが多く、サプライチェーンの上流でトラブルが発生すると下流プラントにも影響する可能性が高いです。そのため、化学メーカーの原料購買部員はサプライチェーンを把握することが重要です。

やったこと

将来的にLangChainで参照することを想定して、この記事ではNeo4jにケミカルサプライチェーンデータを保存し可視化してみます。

環境

  • Ubuntu 20.04.6 LTS
  • neo4j 1:2025.01.0 (ソフトウェアとしてのバージョン)
  • Python 3.10.9
  • pandas 2.2.3
  • neo4j 5.28.0 (Pythonライブラリとしてのバージョン)

手順

neo4jインストール

1. ソフトウェアをローカルPCにインストール

以下のURLを参照してインストールしました。Ubuntuのバージョンは異なりましたが、同じ手順で上手く行きました。
https://qiita.com/hoku/items/66ce12e928524d92958a

localhostにサーバーを立ち上げるときのコマンド

service neo4j start

サーバーを終了するときのコマンド

service neo4j stop

2. Pythonライブラリのインストール

pip install neo4j

以上で準備完了です。

データ準備

石油化学工業協会が公開しているサプライチェーンマップのp1の一部(下図、赤マーカー部)を、テストとして使用します。これは鹿島コンビナートで主に三菱ケミカル社を中心としたチェーンです。

データをエクセルで下図のように準備しました。

neo4jへのデータ登録

1. neo4jサーバーを起動

service neo4j start

2. 接続情報を.envに格納

NEO4J_URI=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=your_password

3. Pythonでデータ登録

import pandas as pd
from neo4j import GraphDatabase, basic_auth
from dotenv import load_dotenv
import os
load_dotenv()

NEO4J_URI = os.environ["NEO4J_URI"]
NEO4J_USER = os.environ["NEO4J_USER"]
NEO4J_PASSWORD = os.environ["NEO4J_PASSWORD"]

def add_nodes_and_relation(driver, name_from, product_from, relation, name_to, product_to):
    driver.execute_query(
        "MERGE (c1:Company { name: $name_from, product: $product_from})"
        "MERGE (c2:Company { name: $name_to, product: $product_to})"
        f"MERGE (c1)-[:{relation}]->(c2)",
        name_from=name_from, product_from=product_from,
        # relation=relation,
        name_to=name_to, product_to=product_to,
        database_="neo4j"
    )

# 登録データの読込み
df = pd.read_excel("コンビナートデータ_サンプル.xlsx")

with GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD)) as driver:
    for i, dat in df.iterrows():
        input_data = {
            "driver":driver,
            "name_from":dat["from_node"],
            "product_from":dat["from_node_type"],
            "relation":dat["relation"],
            "name_to":dat["to_node"],
            "product_to":dat["to_node_type"],
        }
        add_nodes_and_relation(**input_data)

慣れれば大した実装ではありません。

ブラウザで確認

http://127.0.0.1:7474/browser/ にアクセスします。

おおー、いい感じで可視化できたのではないでしょうか。こんな感じで、日本すべての化学プラントのサプライチェーンをデジタル化して可視化していきたいと思います。

サーバーとの接続を切断するときは、ターミナルで下記コマンド実行します。

service neo4j stop

Appendix

データ登録に失敗して全削除したい場合のコード

# 削除する場合
driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD))
driver.execute_query("MATCH (n) DETACH DELETE n")
driver.close()

所感

RDBの経験はあったものの、Neo4jの書き方には若干苦戦しました。Pythonで実装したブログ記事をあまり見つけられなかったので、結局公式ドキュメントのQuick Startを参照しました。次回は、LangChainを使ってみたいと思います。

参考文献

  1. https://www.nikkei.com/article/DGXZQOUC017QH0R00C24A8000000/
  2. https://www.idemitsu.com/jp/information/2024/240702.pdf
  3. https://www.idemitsu.com/jp/business/factory/tokuyama/news/2024/240716.pdf
  4. https://chemicaldaily.com/archives/451740
  5. https://www.jpca.or.jp/files/trends/kakusha.pdf
  6. https://qiita.com/hoku/items/66ce12e928524d92958a
  7. https://neo4j.com/docs/api/python-driver/current/

Discussion