fbpx

Neo4j公式の言語ドライバー(Bolt)によるプログラミング #neo4j

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

Neo4j v3.0からBoltプロトコルをベースにしたバイナリドライバーで「.NET/Java/JavaScript/Python」の4つの言語の公式的なサポートを発表しています。ここでは、Neo4j Boltドライバーの概要とPythonドライバーの利用方法を簡略に紹介します。

Neo4j Boltバイナリドライバーとは

概要

Boltバイナリドライバーとは、Boltプロトコルをベースにし、多様なプログラミング言語やデータ環境からNeo4jに一元的に接続できるようにするために開発された言語ドライバーです。Neo4jは、これまで、HTTPやJVMベースのドライバーを提供して来ましたが、パフォーマンス問題を含む様々な要求が累積している状況のなかで、Neo4j 3.0の発表を念頭に2015年からBoltバイナリドライバーの開発に着手しています。

bolt-driver-1

Boltドライバは、データを扱うフォーマットとしてバイナリ型式(PackStream)を採用し、データサイズを軽量化することでパフォーマンスの向上を図り、複数の言語において統一された規格の下で開発されています。そして、遠隔地からの接続時にはTLS(Transport Layer Security)暗号化をサポートすることでセキュリティを強化しています。今後、従来のREST及びJVMベースのAPIも、しばらくは混在するような状況が続くでしょうが、Boltドライバーの進化と共に、機能的に競合するようなものは、おそらく自然淘汰していくでしょう。

Boltドライバーの構成要素

Boltドライバーの構成要素は、下記の通り、とてもシンプルです。

 

driver = GraphDatabase.driver() データベースオブジェクト
session = driver.session() ドライバーオブジェクト
session.run() 実行ステートメント
session.close() 終了ステートメント

事前準備

OSは、Linux/Windows/Macのいずれも対応しています。ここではWindowsをベースにします。

Neo4jのインストール

今回の演習環境のバージョン構成は、次の通りです。


Neo4j:3.0.6
ドライバ―バージョン:1.0
Boltプロトコル:1

Boltドライバーを使うためには、Neo4j v3.0以上が必要です。
インストールは、下記のサイトを参照してください。

WindowsでNeo4jを使ってみる
MacでNeo4jを使ってみる

Pythonのインストール

今回は、python-2.7.12.msiをインストールしています。3.xでも良いです。

C:\> python -V
Python 2.7.12

C:\> pip -V
pip 8.1.1 from c:\python27\lib\site-packages (python 2.7)

Neo4j ドライバーインストール

BoltのNeo4j ドライバーをインストールしてください。

C:\> pip install neo4j-driver
Collecting neo4j-driver
Downloading neo4j_driver-1.0.2-py2.py3-none-any.whl
Installing collected packages: neo4j-driver
Successfully installed neo4j-driver-1.0.2

Neo4jデータベースの準備

今回に紹介する範囲では、誰かに迷惑をかけないデータベースがあれば結構です。ここでは、Neo4jのデフォルト映画データベースを前提に解説しています。

映画データベースは、次のようなデータモデルです。

bolt-driver-2

BoltドライバーによるNeo4jプログラミング

Neo4jは、起動中である必要があります。

演習0:Keanu Reevesさんが出演した映画の検索

C:\> python query0.py
Keanu Reeves-ACTED_IN->Something's Gotta Give
Keanu Reeves-ACTED_IN->Johnny Mnemonic
Keanu Reeves-ACTED_IN->The Replacements
Keanu Reeves-ACTED_IN->The Devil's Advocate
Keanu Reeves-ACTED_IN->The Matrix Revolutions
Keanu Reeves-ACTED_IN->The Matrix Reloaded
Keanu Reeves-ACTED_IN->The Matrix

python query0.py

from neo4j.v1 import GraphDatabase, basic_auth

driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "neo4jadmin"))
session = driver.session()

v_name = 'Keanu Reeves'

result = session.run("MATCH (a:Person { name : '%s'})-[r:ACTED_IN]->(b) "
"RETURN a.name,type(r) AS Type, b.title" % (v_name))

for record in result:
print("%s-%s->%s " % (record["a.name"], record["Type"], record["b.title"]))

session.close()

演習1:俳優ノード作成

俳優ノードを作成してみます。

C:\>python query1.py

query1.py

from neo4j.v1 import GraphDatabase, basic_auth

driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "neo4jadmin"))
session = driver.session()

v_name = 'Nakamura'

session.run("CREATE (:Person {name: '%s'})" % (v_name))

session.close()

Webインターフェースからノードを確認してみましょう。

MATCH (person:Person) WHERE person.name='Nakamura' RETURN person

actor-nakamura

演習1-1:映画ノード作成

映画ノードを作成してみます。

C:\> python query1-1.py

query1-1.py

from neo4j.v1 import GraphDatabase, basic_auth

driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "neo4jadmin"))
session = driver.session()

v_title = 'Tokyo 2020'

session.run("CREATE (:Movie {title: '%s'})" % (v_title))

session.close()

演習2:ノード作成の確認

作成したノードを確認してみます。

C:\>python query2.py
a.name: Nakamura, b.title: Tokyo 2020

query2.py

from neo4j.v1 import GraphDatabase, basic_auth

driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "neo4jadmin"))
session = driver.session()

v_name= 'Nakamura'
v_title = 'Tokyo 2020'

result = session.run("MATCH (a:Person) WHERE a.name = '%s' "
"MATCH (b:Movie) WHERE b.title = '%s' "
"RETURN a.name, b.title" % (v_name,v_title))

for record in result:
# print("%s %s " % (record["a.name"], record["b.title"]))
print(", ".join("%s: %s" % (key, record[key]) for key in record.keys()))

session.close()

演習3:リレーション作成

俳優ノードと映画ノードのリレーションを作成してみましょう。

C:\> python query3.py

query3.py

from neo4j.v1 import GraphDatabase, basic_auth
import sys

driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "neo4jadmin"))
session = driver.session()

v_name = 'Nakamura'
v_title = 'Tokyo 2020'

with session.begin_transaction() as tx:
try:
tx.run("MATCH (a:Person) WHERE a.name = '%s' "
"MATCH (b:Movie) WHERE b.title = '%s' "
"CREATE (a)-[:ACTED_IN]->(b)" % (v_name, v_title))
tx.success = True
print("succeed")
# tx.run("error").consume()
except:
tx.success = False
print "Expected error:", sys.exc_info()[0]

session.close()

COMMITとROLEBACKは、明示的に実行する必要があります。

tx. success = True
COMMITを意味します。

tx. success = False
ROLEBACKを意味します。

コメントしている箇所をアンコメントにしたりしながら試してみてください。明示的にtx. successを宣言しないと処理は有効になりません。

例えば、tx. success = Trueを宣言しても、例外が発生し、tx. success = Falseが宣言されると、処理はロールバックされます。tx. success = Trueの宣言をしなかった場合、暗黙的にコミットされるようなことは起きません。

演習4:リレーションの確認

では、最後のサブグラフを確認してみましょう。

C:\> python query4.py
Nakamura-ACTED_IN->Tokyo 2020

query4.py

from neo4j.v1 import GraphDatabase, basic_auth

driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "neo4jadmin"))
session = driver.session()

v_name = 'Nakamura'

result = session.run("MATCH (a:Person { name : '%s'})-[r:ACTED_IN]->(b) "
"RETURN a.name,type(r) AS Type, b.title" % (v_name))

for record in result:
print("%s-%s->%s " % (record["a.name"], record["Type"], record["b.title"]))

session.close()

グラフを出力してみましょう。

MATCH (a:Person)-[:ACTED_IN]->(b) WHERE a.name='Nakamura' RETURN a, b

atcter-movie

TLS暗号化

遠隔地から接続する場合は、TLS暗号化モードで接続します。

var driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "neo4jadmin"),
Config.Builder.WithEncryptionLevel(EncryptionLevel.Encrypted).ToConfig());

まとめ

一言でいうと、Boltドライバーはとても使いやすいですね!
他の言語など、さらに詳しく勉強したい方は、下記のドキュメントを参照してくさい。

[参考]

公式ドキュメント(4.Driver)

公式ドキュメント(Appendix A. Reference)

Using Neo4j from Python

Neo4j Bolt Driver for Python

GitHub(neo4j-python-driver)

Author

モダンアーキテクチャー基盤のソリューションアーキテクトとして活動しています。

[著書]
・Amazon Cloudテクニカルガイド―EC2/S3からVPCまで徹底解析
・Amazon Elastic MapReduceテクニカルガイド ―クラウド型Hadoopで実現する大規模分散処理
・Cypherクエリー言語の事例で学ぶグラフデータベースNeo4j
・Neo4jを使うグラフ型データベース入門(共著)
・RDB技術者のためのNoSQLガイド(共著)

leeの記事一覧

新規CTA