はじめに
こんにちは!今回は、Neo4j-docker-starterリポジトリのexample
ディレクトリに含まれるPythonスクリプトを詳しく解説していきます。このチュートリアルは、Neo4jグラフデータベースとPythonを使ったアプリケーション開発に興味がある初心者の方々に向けて書かれています。
Neo4jは強力なグラフデータベースで、複雑な関係性を持つデータを効率的に扱うことができます。このチュートリアルでは、Dockerを使ってNeo4j環境を簡単にセットアップし、Pythonを使って基本的なデータベース操作を学んでいきます。
それでは、一緒にNeo4jの世界を探検しましょう!
環境セットアップ
まずは、Neo4j-docker-starterリポジトリをクローンし、必要な環境をセットアップしましょう。
-
リポジトリのクローン:
git clone https://github.com/Sunwood-ai-labs/Neo4j-docker-starter.git cd Neo4j-docker-starter
-
Docker Composeを使ってNeo4jコンテナを起動:
docker-compose up -d
-
必要な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}")
コードの解説
-
必要なライブラリのインポート:
neo4j
: Neo4jデータベースとの接続を管理します。loguru
: ログ出力を簡単に行えるライブラリです。art
: アスキーアートを表示するためのライブラリです。
-
接続情報の設定:
URI
: Neo4jデータベースのアドレスです。ローカルの場合は"neo4j://localhost:7687"
を使用します。AUTH
: ユーザー名とパスワードのタプルです。デフォルトのユーザー名は"neo4j"
です。
-
データベースへの接続:
GraphDatabase.driver()
: Neo4jドライバーを作成します。with
文を使用してドライバーを自動的にクローズします。driver.verify_connectivity()
: 接続が正常に確立されたかを確認します。
-
エラーハンドリング:
try-except
文を使用して、接続中に発生する可能性のあるエラーを捕捉します。
実行方法
python example/example01_connect.py
このスクリプトを実行すると、Neo4jデータベースへの接続を試み、成功した場合は「Neo4jデータベースに接続しました。」というメッセージが表示されます。
Neo4jをローカルのDockerで動かしてみた①
「Neo4jデータベースに接続」 https://t.co/hOHjN4xMEH pic.twitter.com/Pz7hKWB91g— Maki@Sunwood AI Labs. (@hAru_mAki_ch) June 29, 2024
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}")
コードの解説
-
セッションの作成:
driver.session()
: データベースとのセッションを開始します。database="neo4j"
: 使用するデータベース名を指定します。
-
データの作成:
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
ノードが作成されます。
Neo4jをローカルのDockerで動かしてみた②
「データを作成」 https://t.co/8DGyQmJk9t pic.twitter.com/fqywanSi4W— Maki@Sunwood AI Labs. (@hAru_mAki_ch) June 29, 2024
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}")
コードの解説
-
データの検索:
MATCH (p:Person {name: $name})
:Person
ラベルを持ち、指定された名前を持つノードを検索します。RETURN p.name AS name, p.age AS age
: 検索結果から名前と年齢を返します。
-
結果の処理:
for record in result
: 検索結果をループで処理します。logger.info()
: 各レコードの情報をログに出力します。
実行方法
python example/example03_query.py
このスクリプトを実行すると、データベースから"John Doe"という名前のPerson
ノードを検索し、その情報を表示します。
Neo4jをローカルのDockerで動かしてみた③
「クエリの実行」 https://t.co/JxLxIdVq2R pic.twitter.com/GjoszrdNxY— Maki@Sunwood AI Labs. (@hAru_mAki_ch) June 29, 2024
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}")
コードの解説
- データの更新:
MATCH (p:Person {name: $name})
: 更新するノードを検索します。SET p.age = $new_age
: ノードのage
プロパティを新しい値に設定します。
実行方法
python example/example04_update.py
このスクリプトを実行すると、"John Doe"の年齢が35に更新されます。
Neo4jをローカルのDockerで動かしてみた④
「データのアップデート」 https://t.co/GaFFGCZ1np pic.twitter.com/rImhBdVa81— Maki@Sunwood AI Labs. (@hAru_mAki_ch) June 29, 2024
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}")
コードの解説
- データの削除:
MATCH (p:Person {name: $name})
: 削除するノードを検索します。DELETE p
: 検索されたノードを削除します。
実行方法
python example/example05_delete.py
このスクリプトを実行すると、"John Doe"のノードがデータベースから削除されます。
Neo4jをローカルのDockerで動かしてみた⑤
「データの削除」 https://t.co/o1ryU1Qqkr pic.twitter.com/D7hYmutLDO— Maki@Sunwood AI Labs. (@hAru_mAki_ch) June 29, 2024
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}")
コードの解説
-
トランザクション関数の定義:
create_person_if_not_exists()
: 指定された名前のPerson
ノードが存在しない場合に作成します。create_friendship()
: 二人の人物間に友好関係を作成します。
-
トランザクションの実行:
session.execute_write()
: 書き込みトランザクションを実行します。
-
複雑な操作の実行:
- このスクリプトは、二人の人物(AliceとBob)のノードを作成し、その間に友好関係を結びます。
実行方法
python example/example06_transaction.py
このスクリプトを実行すると、AliceとBobのノードが作成され、両者の間に友好関係が結ばれます。
Neo4jをローカルのDockerで動かしてみた⑥
「トランザクションの作成」
これで一通りのチュートリアルは完了した! https://t.co/XrEq6xzB68 pic.twitter.com/CHxX94IIQ1— Maki@Sunwood AI Labs. (@hAru_mAki_ch) June 29, 2024
リポジトリ
まとめ
Neo4j-docker-starterリポジトリのexampleディレクトリに含まれるスクリプトを詳しく解説し、さらに実践的なソーシャルネットワークアプリケーションの例を通じて、Neo4jとPythonを使ったグラフデータベースアプリケーション開発の基礎を学びました。
グラフデータベースは、複雑な関係性を持つデータを扱う上で非常に強力なツールです。今回学んだ基本的な概念と技術を足がかりに、さらに高度なアプリケーションの開発に挑戦してみてください。
Neo4jの公式ドキュメントやコミュニティフォーラムなどのリソースを活用しながら、継続的に学習を進めることをお勧めします。グラフデータベースの世界には、まだまだ探求すべき多くの可能性が眠っています。
コメント