Python でグラフデータベース(AuraDB, Docker版Neo4j)を使ってみる
本記事では Neo4j、AuraDB を試す環境を準備して Python の簡単なプログラムを動かしてみます。
【目次】
[1]はじめに
前の記事『プロパティグラフ(Neo4j / AuraDB他)の概要を知る:グラフデータベース』で、プロパティグラフをモデルとするグラフデータベースの本を紹介しました。
本記事では実際に Neo4j、AuraDB を試す環境を作って、簡単なプログラムを動かしてみます。
今回は環境構築作業の負担が極力無い方法として AuraDB と Docker 版 Neo4j を取り上げます。
AuraDB は 登録すれば無料で使える Neo4j のクラウドホスティングです。例えば Google Colaboratory でプログラムを書いて AuraDB を使うことができます。
一方、Neo4j の Docker イメージも提供されていますので、ローカル環境で動作させることもできます。
AuraDB も Docker 版 Neo4j も接続設定を変えるだけで同じプログラムが動きます(動くはず)ので、例えば、ローカル環境でテストして本番にAuraDBを利用することもできます。
AuraDB と Neo4j は基本的には汎用データベースエンジンですが、可視化ツールなど面白そうなツールも組み込まれていて、使ってみると楽しいです。
[2]AuraDB を無料で使ってみる
実際の Neo4j データベースに触れる最も手軽な方法は AuraDB を使う事だと思います。
- Fully Managed Graph Database Service | Neo4j AuraDB
AuraDB は Neo4j のフルマネージドなクラウドサービスでいくつかプランがあります。
- Cloud & Self-Hosted Graph Database Platform Pricing | Neo4j Pricing
本記事では無料で利用できる AuraDB Free を利用します。
AuraDB Free はユーザ登録は必要ですが、クレジットカード番号の入力などはありませんので、気軽に始めることができます。
利用は上記サイトの「Start Free」ボタンをクリックし、 Google アカウントかユーザ登録して利用します。
AuraDB の登録手続きは画面の案内に従って進めるだけですので割愛しますが、この手続きの中でデータベースにアクセスするためのクレデンシャル情報(ユーザ、パスワードなど)が表示されます。
この情報を失うとアクセスできなくなりますので、ファイルとしてダウンロードするなど、記録しておく必要があります。
(参考)
手続きを進める中で AuraDS というのも出てきます。名前が少々紛らわしいのですが、こちらはグラフデータサイエンス向けとのことで価格体系も少し違うようです。
- Neo4j AuraDS Graph Data Science | Data Science Cloud | Graph Algorithms
さて、手続きが終わるとデータベースのインスタンスが作成されて以下のような画面が表示されます。
Query ボタンをクリックすると、Neo4j Browser User Interface が起動してデータベースを操作できます。(ユーザとパスワードの認証があります。)
- Neo4j Browser User Interface Guide
Neo4j ブラウザは、いわばコマンドラインツールの Web 版のような感じで、コマンドや Cpyher を入力して実行すると、結果をグラフや表などの形で表示してくれます。
以下はサンプルの Movie データを挿入して全ノード(とリレーション)をクエリした結果の画面です。(左側のアイコンをクリックすると表示形式を変更できます。)
これとは別に、インスタンス画面の Explore ボタンをクリックするとNeo4j Bloom というツールも使えます。
- Neo4j Bloom
こちらは Cypher などのコマンドを入力することなく、UI 操作だけでデータベース内のデータを可視化したり探索するようなツールという位置付けかと思います。
以下は上記と同じデータの状態で Bloom を起動したときの画面です。
さらに、Explore、Query ボタンの下に Import ボタンがあります。
こちらを利用すると自前で用意しているデータ(CSVファイル他)からウィザード形式でインポートできます。
プログラムを作成して AuraDB にアクセスしてみたいという方は、ホーム画面左側にあるConnect メニューにあるプログラミング言語ごとの項目をクリックします。
するとデータベースにアクセスするサンプルコードを見ることができます。
本記事ではプログラムからの利用例として、Python を利用して Google Colaboratory 環境から AuraDB へアクセスしてみます。
[3]ローカル環境の Docker で Neo4j を使ってみる
プログラム開発に AuraDB や Neo4j を利用することを考えると、例えば、プログラムのテストを行うときなど、ローカル環境にデータベースを構築しておくと便利なことが多いと思います。
Neo4j のインストール方法はいくつかありますが、ありがたいことに、Neo4j の Docker イメージが提供されていますので、本記事ではこれを利用します。
無料で、とてもお手軽に利用できます。
- Neo4j ー Docker - Operations Manual
- Docker Hub ー neo4j
いろいろな起動方法がありますが、ここでは2つほど利用例をメモしておきます。
(詳細は上記 Neo4j のドキュメントや Docker のマニュアルを参照して下さい。)
(1)使い捨て的な利用例
この方法はデータをディスクに永続化しない起動方法で、コンテナを停止するとデータも消えます。
これはちょっと試すだけ、という使い方もありますが、私はプログラムの回帰テストに便利なのでよく利用する使い方です。
docker run \
--publish=7474:7474 --publish=7687:7687 \
--env NEO4J_AUTH=neo4j/your_password \
--rm \
neo4j
シェルから上記コマンドを実行すると以下のように動作します。
- 最新版の neo4j の Docker イメージをダウンロードして起動します。
- ポート 7474 は HTTP でブラウザからアクセス、7687 は Neo4j API の neo4j や bolt アクセスで利用します。
- データベース認証のユーザを neo4j、パスワードを your_passowrd で起動します。
- データの永続化は行いませんので、コンテナ終了時にコンテナとデータベースのデータも破棄されます。
- CTRL-Cで終了できます。
コンテナ起動後、ブラウザから http://localhost:7474/ へアクセスすると、Neo4j Browser User Interface (AuraDB と同様)が表示されます。
これを使って Cypher 等のコマンドを実行できます。
なお、認証画面では docker run の NEO4J_AUTH で指定したユーザ名とパスワードを入力してログインします。
(2)データを永続化して利用する
先の方法だとコンテナを停止するとデータが消えてしまいますが、当然ディスクにデータを保存しながら動作させることもできます(通常のデータベースとしての利用です)。
このあたりになると利用目的に応じて様々なバリエーションが考えられるので、ここではマニュアルに記載されている起動方法をメモしておきます。
docker run \
--restart always \
--publish=7474:7474 --publish=7687:7687 \
--env NEO4J_AUTH=neo4j/your_password \
--volume=/path/to/your/data:/data \
--volume=/path/to/your/logs:/logs \
neo4j:5.2.0
ここではイメージのバージョン(例では 5.2.0)を明示的に指定し、volume オプションを指定してローカルディスクのパスをマッピングしています。また、docker の restart オプションも指定しています。
ブラウザから http://localhost:7474/ へアクセスすれば、Neo4j Browser User Interface も利用できます。
その他いろいろな設定方法が上記 Neo4j Docker のドキュメントに書かれていますので参考にしてください。
[4]アプリ(Python)から AuraDB / Neo4j にアクセスしてみる
ここでは AuraDB あるいはローカルの Neo4j にアプリからアクセスできることを超簡単な例を通してみてみます。
アプリから Neo4j / AuraDB にアクセスする場合は、プログラミング言語毎に用意されているドライバライブラリを利用します。
本記事では Python を利用した例としましたので、例えば Colaboratory から AuraDB へアクセスする場合も、ローカル環境の Docker コンテナへのアクセスも、接続情報を変更するだけで同じコードが動くと思います。
(1)サンプルデータ
サンプルとして「TechnoDaifukucho というブログの著者は Techno Daifuku という人です」という情報をプロパティグラフで表現してみます。
具体的には以下のように構成します。
- Blog ラベルを持つ、ブログを表すノードを作ります。
- title プロパティに「TechnoDaifukucho」という値を設定します。
- Person ラベルを持つ、人を表すノードを作ります。
- name プロパティに「Techno Daifuku」という値を設定します。
- Blog ノードから Person ノードへ AUTHOR というタイプのリレーションを設定します。
このように書くと何だか意味不明なので図にしてみます。丸がノードで、矢印がリレーションを表します。
(参考)
上記の図は Neo4j のサイトにあるグラフを描くWebツールを利用して作成しました。なかなか面白いツールです。
- arrows.app
さて、以下は上記のプロパティグラフを作る Cypher クエリの例です。
MERGE (b:Blog {title: 'TechnoDaifukucho'})
MERGE (p:Person {name: 'Techno Daifuku'})
MERGE (b)-[:AUTHOR]->(p)
なお、本来は一意性制約やトランザクション、さらにラベルやタイプなどのオントロジー的な側面も検討すべきと思いますが、簡単なサンプルという事で今回は割愛します。
(2)Python で Cypher クエリを実行してみる
上記の Cypher クエリは Neo4j Browser User Interface からも実行できますが、ここでは Python を例にプログラムから実行してみます。
まず、Neo4j データベースに接続するためのドライバをインストールします(AuraDB と Neo4j 共通です)。
pip install neo4j-driver
(参考)
もしインストールに失敗する場合、環境によっては「pip install wheel」を予め実行してからインストールすると成功する場合があります。
以下はクエリを実行する Python のコードです。
from neo4j import GraphDatabase
# 接続設定
uri = "接続文字列"
username = "ユーザ名"
password = "パスワード"
# データベースサーバへ接続
driver = GraphDatabase.driver(uri, auth=(username, password))
# 接続確認
driver.verify_connectivity()
# 実行するクエリ文字列
query = """
MERGE (b:Blog {title: 'TechnoDaifukucho'})
MERGE (p:Person {name: 'Techno Daifuku'})
MERGE (b)-[:AUTHOR]->(p)
"""
# クエリを実行
with driver.session() as session:
session.run( query)
# 接続を閉じる
driver.close()
ここで、接続設定(uri、username、password の変数)は以下のように設定します。
- AuraDB の場合
- credentials~.env ファイルをダウンロードした場合
- uri = NEO4J_URI(neo4j+s://で始まるURI)の値
- username = NEO4J_USERNAME の値
- password = NEO4J_PASSWORD の値
- ユーザ名とパスワードは AuraDB にログインする値と同じです。
- uri はログイン画面のインスタンス画面に Connection URI として表示されています。
- Docker 版 Neo4j の場合
- uri = neo4j://localhost:7687
- 7687 は docker run で指定したポートです。
- bolt://localhost:7687 でも接続できます。
- username、password は docker run で指定した値を設定します。
接続文字列や認証など、ドライバーの詳細については以下を参照して下さい。
- The Neo4j Python Driver Manual
プログラムを実行した後、ちゃんと登録されたかどうか確認するために、Neo4j Browser User Interface を開いて以下のクエリを実行してみます。
MATCH (b:Blog) - [r:AUTHOR] -> (p:Person) RETURN b, r, p
すると以下のように表示されます。(以下は Docker 版で実行した例です。)
なお、全てのノードとそのノード間のリレーションが表示したいときは以下のクエリを実行します(上記の他にデータが無ければ同じ結果になると思います。)
MATCH (n) RETURN n
コメント
コメントを投稿