Neo4j (2) Pythonからデータを操作する

前回の記事でNeo4jの起動までできました。今回はデータを操作してみます。

ji1jdi.hatenablog.com

Neo4jのデータを操作するにはCypherというクエリ言語を使います。これを実行する方法としては次のようなものがあるようです。

今回はドライバを使う方法でPythonからNeo4jを操作してみます。ドライバには公式ドライバとコミュニティ版のドライバがありますが、公式版を使うことにします。

neo4j.com

準備

Pythonの仮想環境venvを使って環境を構築していきます。次のコマンドで仮想環境を作成して有効化します。

$ python3 -m venv .venv
$ . .venv/bin/activate

次にNeo4jのPythonドライバをインストールします。

$ pip install neo4j

Neo4jにアクセスする際に必要となるユーザー名やパスワードは環境変数に設定しておくことにします。 python-dotenvモジュールを使ってスクリプト実行時に環境変数を設定します。

$ pip install python-dotenv

次の内容の.envファイルを作成します。「XXXX」の部分とNEO4J_URIの値は環境に合わせて読み替えます。

NEO4J_USER = XXXX
NEO4J_PASSWORD = XXXX
NEO4J_URI = bolt://localhost:7687

交信局と交信の関係をグラフにする

アマチュア無線に関連があるデータをグラフで表現してみます。次のスクリプトは交信局と交信の関係をグラフにします。

import os
from dotenv import load_dotenv
from neo4j import GraphDatabase

def sample(user, passwd, uri):
    driver = GraphDatabase.driver(uri, auth=(user, passwd))

    with driver.session() as session:
        session.write_transaction(write)

    driver.close()

def write(tx):
    tx.run('CREATE (s0:Station {name: "JA1QRS"})'
           'CREATE (c0:Contact {name: "Contact"})'
           'CREATE (s1:Station {name: "JA8QRP"})'
           'CREATE (c1:Contact {name: "Contact"})'
           'CREATE (s0)-[:MADE]->(c0)-[:WITH]->(s1)'
           'CREATE (s1)-[:MADE]->(c1)-[:WITH]->(s0)'
           'CREATE (c0)-[:MATCHED]->(c1)'
           'CREATE (c1)-[:MATCHED]->(c0)')

if __name__ == "__main__":
    load_dotenv()

    user   = os.getenv('NEO4J_USER')
    passwd = os.getenv('NEO4J_PASS')
    uri    = os.getenv('NEO4J_URI')

    sample(user, passwd, uri)

これを実行後、ブラウザからNeo4jのコンソールを起動して、次のCypherクエリを実行します。

MATCH (n) RETURN n;

コンソールには次のグラフが表示されます。コンソールからグラフのイメージをエクスポートすることもできます。