Neo4j-docker-starterリポジトリの詳細解~Pythonで始めるグラフデータベース入門~

Pythonチュートリアル

はじめに

こんにちは!今回は、Neo4j-docker-starterリポジトリのexampleディレクトリに含まれるPythonスクリプトを詳しく解説していきます。このチュートリアルは、Neo4jグラフデータベースとPythonを使ったアプリケーション開発に興味がある初心者の方々に向けて書かれています。

Neo4jは強力なグラフデータベースで、複雑な関係性を持つデータを効率的に扱うことができます。このチュートリアルでは、Dockerを使ってNeo4j環境を簡単にセットアップし、Pythonを使って基本的なデータベース操作を学んでいきます。

それでは、一緒にNeo4jの世界を探検しましょう!

環境セットアップ

まずは、Neo4j-docker-starterリポジトリをクローンし、必要な環境をセットアップしましょう。

  1. リポジトリのクローン:

    git clone https://github.com/Sunwood-ai-labs/Neo4j-docker-starter.git
    cd Neo4j-docker-starter
  2. Docker Composeを使ってNeo4jコンテナを起動:

    docker-compose up -d
  3. 必要なPythonパッケージのインストール:

    pip install neo4j loguru art

これで環境のセットアップは完了です。次は、各サンプルスクリプトを詳しく見ていきましょう。

example01_connect.py:データベースへの接続

まずは、Neo4jデータベースに接続する基本的な方法を学びましょう。

# example01_connect.py
from neo4j import GraphDatabase
from loguru import logger
from art import tprint
import sys

URI = "neo4j://localhost:7687"  
AUTH = ("neo4j", "your_password")  

try:
    tprint("example01_connect.py")
    with GraphDatabase.driver(URI, auth=AUTH) as driver:
        driver.verify_connectivity()
        logger.info("Neo4jデータベースに接続しました。")
except Exception as e:
    logger.error(f"エラーが発生しました: {e}")

コードの解説

  1. 必要なライブラリのインポート

    • neo4j: Neo4jデータベースとの接続を管理します。
    • loguru: ログ出力を簡単に行えるライブラリです。
    • art: アスキーアートを表示するためのライブラリです。
  2. 接続情報の設定

    • URI: Neo4jデータベースのアドレスです。ローカルの場合は"neo4j://localhost:7687"を使用します。
    • AUTH: ユーザー名とパスワードのタプルです。デフォルトのユーザー名は"neo4j"です。
  3. データベースへの接続

    • GraphDatabase.driver(): Neo4jドライバーを作成します。
    • with文を使用してドライバーを自動的にクローズします。
    • driver.verify_connectivity(): 接続が正常に確立されたかを確認します。
  4. エラーハンドリング

    • try-except文を使用して、接続中に発生する可能性のあるエラーを捕捉します。

実行方法

python example/example01_connect.py

このスクリプトを実行すると、Neo4jデータベースへの接続を試み、成功した場合は「Neo4jデータベースに接続しました。」というメッセージが表示されます。

example02_create.py:データの作成

次に、Neo4jデータベースにデータを作成する方法を見ていきましょう。

from neo4j import GraphDatabase
from loguru import logger
from art import tprint

URI = "neo4j://localhost:7687"  
AUTH = ("neo4j", "your_password") 

try:
    tprint("example02_create.py")
    with GraphDatabase.driver(URI, auth=AUTH) as driver:
        with driver.session(database="neo4j") as session:
            session.run("CREATE (p:Person {name: $name, age: $age})", name="John Doe", age=30)
            logger.info("データを作成しました。")
except Exception as e:
    logger.error(f"エラーが発生しました: {e}")

コードの解説

  1. セッションの作成

    • driver.session(): データベースとのセッションを開始します。
    • database="neo4j": 使用するデータベース名を指定します。
  2. データの作成

    • session.run(): Cypherクエリを実行します。
    • CREATE (p:Person {name: $name, age: $age}):
      • CREATE: 新しいノードを作成するCypherコマンドです。
      • p:Person: Personというラベルを持つノードを作成します。
      • {name: $name, age: $age}: ノードのプロパティを設定します。
    • name="John Doe", age=30: クエリのパラメータを指定します。

実行方法

python example/example02_create.py

このスクリプトを実行すると、Neo4jデータベースに新しいPersonノードが作成されます。

example03_query.py:データの検索

データベースからデータを検索する方法を学びましょう。

from neo4j import GraphDatabase
from loguru import logger
from art import tprint

URI = "neo4j://localhost:7687"  
AUTH = ("neo4j", "your_password") 

try:
    tprint("example03_query.py")
    with GraphDatabase.driver(URI, auth=AUTH) as driver:
        with driver.session(database="neo4j") as session:
            result = session.run("MATCH (p:Person {name: $name}) RETURN p.name AS name, p.age AS age", name="John Doe")
            for record in result:
                logger.info(f"名前: {record['name']}, 年齢: {record['age']}")
except Exception as e:
    logger.error(f"エラーが発生しました: {e}")

コードの解説

  1. データの検索

    • MATCH (p:Person {name: $name}): Personラベルを持ち、指定された名前を持つノードを検索します。
    • RETURN p.name AS name, p.age AS age: 検索結果から名前と年齢を返します。
  2. 結果の処理

    • for record in result: 検索結果をループで処理します。
    • logger.info(): 各レコードの情報をログに出力します。

実行方法

python example/example03_query.py

このスクリプトを実行すると、データベースから"John Doe"という名前のPersonノードを検索し、その情報を表示します。

example04_update.py:データの更新

既存のデータを更新する方法を見ていきましょう。

from neo4j import GraphDatabase
from loguru import logger
from art import tprint

URI = "neo4j://localhost:7687"  
AUTH = ("neo4j", "your_password") 

try:
    tprint("example04_update.py")
    with GraphDatabase.driver(URI, auth=AUTH) as driver:
        with driver.session(database="neo4j") as session:
            session.run("MATCH (p:Person {name: $name}) SET p.age = $new_age", name="John Doe", new_age=35)
            logger.info("データを更新しました。")
except Exception as e:
    logger.error(f"エラーが発生しました: {e}")

コードの解説

  1. データの更新
    • MATCH (p:Person {name: $name}): 更新するノードを検索します。
    • SET p.age = $new_age: ノードのageプロパティを新しい値に設定します。

実行方法

python example/example04_update.py

このスクリプトを実行すると、"John Doe"の年齢が35に更新されます。

example05_delete.py:データの削除

データベースからデータを削除する方法を学びましょう。

from neo4j import GraphDatabase
from loguru import logger
from art import tprint

URI = "neo4j://localhost:7687"  
AUTH = ("neo4j", "your_password") 

try:
    tprint("example05_delete.py")
    with GraphDatabase.driver(URI, auth=AUTH) as driver:
        with driver.session(database="neo4j") as session:
            session.run("MATCH (p:Person {name: $name}) DELETE p", name="John Doe")
            logger.info("データを削除しました。")
except Exception as e:
    logger.error(f"エラーが発生しました: {e}")

コードの解説

  1. データの削除
    • MATCH (p:Person {name: $name}): 削除するノードを検索します。
    • DELETE p: 検索されたノードを削除します。

実行方法

python example/example05_delete.py

このスクリプトを実行すると、"John Doe"のノードがデータベースから削除されます。

example06_transaction.py:トランザクションの使用

最後に、より複雑な操作を安全に行うためのトランザクションの使用方法を見ていきましょう。

from neo4j import GraphDatabase
from loguru import logger
from art import tprint

URI = "neo4j://localhost:7687" 
AUTH = ("neo4j", "your_password") 

def create_person_if_not_exists(tx, name):
    tx.run("MERGE (p:Person {name: $name})", name=name)

def create_friendship(tx, name1, name2):
    create_person_if_not_exists(tx, name1)
    create_person_if_not_exists(tx, name2)
    tx.run("MATCH (p1:Person {name: $name1}), (p2:Person {name: $name2}) CREATE (p1)-[:FRIEND]->(p2)", name1=name1, name2=name2)

try:
    tprint("example06_transaction.py")
    with GraphDatabase.driver(URI, auth=AUTH) as driver:
        with driver.session(database="neo4j") as session:
            session.execute_write(create_friendship, "Alice", "Bob")
            logger.info("AliceとBobのノードを作成し、友好関係を結びました。")
except Exception as e:
    logger.error(f"エラーが発生しました: {e}")

コードの解説

  1. トランザクション関数の定義

    • create_person_if_not_exists(): 指定された名前のPersonノードが存在しない場合に作成します。
    • create_friendship(): 二人の人物間に友好関係を作成します。
  2. トランザクションの実行

    • session.execute_write(): 書き込みトランザクションを実行します。
  3. 複雑な操作の実行

    • このスクリプトは、二人の人物(AliceとBob)のノードを作成し、その間に友好関係を結びます。

実行方法

python example/example06_transaction.py

このスクリプトを実行すると、AliceとBobのノードが作成され、両者の間に友好関係が結ばれます。

リポジトリ

GitHub - Sunwood-ai-labs/Neo4j-docker-starter: Your Neo4j, in a Box.
Your Neo4j, in a Box. Contribute to Sunwood-ai-labs/Neo4j-docker-starter development by creating an account on GitHub.

まとめ

Neo4j-docker-starterリポジトリのexampleディレクトリに含まれるスクリプトを詳しく解説し、さらに実践的なソーシャルネットワークアプリケーションの例を通じて、Neo4jとPythonを使ったグラフデータベースアプリケーション開発の基礎を学びました。

グラフデータベースは、複雑な関係性を持つデータを扱う上で非常に強力なツールです。今回学んだ基本的な概念と技術を足がかりに、さらに高度なアプリケーションの開発に挑戦してみてください。
Neo4jの公式ドキュメントやコミュニティフォーラムなどのリソースを活用しながら、継続的に学習を進めることをお勧めします。グラフデータベースの世界には、まだまだ探求すべき多くの可能性が眠っています。

コメント

タイトルとURLをコピーしました