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ドライバは、データを扱うフォーマットとしてバイナリ型式(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.12C:\> 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ドライバーによる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
演習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 sysdriver = 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
TLS暗号化
遠隔地から接続する場合は、TLS暗号化モードで接続します。
var driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "neo4jadmin"),
Config.Builder.WithEncryptionLevel(EncryptionLevel.Encrypted).ToConfig());
まとめ
一言でいうと、Boltドライバーはとても使いやすいですね!
他の言語など、さらに詳しく勉強したい方は、下記のドキュメントを参照してくさい。
[参考]