Python Neo4j インストール

Python学習【365日チャレンジ!】154日目のマスターU(@Udemy11)です。

私は文房具が大好きで、たまに大都会の文房具店に言ったときには興奮しすぎていろいろなものを購入してしまいます。

といっても、パーカーやクロス、モンブランといった高級ペンは流石に持っていませんが。。。

ロットリングやステッドラーから格安のジェットストリームまで、幅広いペンを持っている中でも、好きなシリーズが三菱の【PURE MALT】で、ボールペンやシャーペン、5色ペンなどを保有しています。

そんなお気に入りの【PURE MALT】の1つ、5色ペンが少し使っていない間にゴム質のところがネチャネチャしてきてしまいました。

ボールペンPuremalt

なんとかする方法がないかと調べてみるといろいろ方法があるみたいなのですが、分解してゴムのネチャつき部分だけ水洗いするのも難しそうなので、とりあえずエタノールで拭き取ってみようと思います。

お気に入りのひとつなので、なんとかネチャつきが取れるといいんですが。。。

それでは今日もPython学習を始めましょう。

昨日の復習

昨日は、Neo4jブラウザーでグラフデータベースを操作する方法を学習しました。

Neo4j専用のブラウザーを使ってコードを実行していきましたが、関係性が図になって表示されるので、非常にわかりやすいデータベースだと言えます。

世の中では【見える化】なんてことも言われているので、これからどんどんと使われていくような気はしますが、ある程度時間がかかるかもしれませんね。

コードの書き方も特徴的で視覚的にわかる記述でつながりを記録していました。

そんなNeo4jブラウザーからのデータベース操作についてはこちらの記事をごらんください。

Neo4jのインストールについてはこちらの記事を参考にしてください。

今日は、Neo4jをPythonから操作する方法について学習します。

neo4j-driver

PythonからNeo4jを操作するには、neo4j-driverパッケージをインストールする必要がありますので、ターミナルでpipインストールを実行します。

pip install neo4j-driver

上記コードを実行すると、パッケージがインストールされます。

もしくは、Pycharmの【Preferences】からパッケージをインストールしましょう。
Pycharmからパッケージをインストールする方法については、下記の記事などで紹介していますので参照にしてみてください。

私の場合、どういうわけかSystem InterpreterをAnacondaのPythonに設定したところ、Pycharmからパッケージをインストールできなくなったので、ターミナルからpipを使ってインストールしました。

Pythonを使ってNeo4jを操作する

それではPythonからNeo4jを操作していきましょう。

すでにあるデータを削除

先程インストールしたneo4j-driverをインポートしてサーバーにアクセスします。

from neo4j import GraphDatabase

driver = GraphDatabase.driver('bolt://localhost:7687', auth=('neo4j', 'Password'))

def clear_db(tx):
    tx.run('MATCH (n) DETACH DELETE n')

with driver.session() as session:
    session.write_transaction(clear_db)

Neo4jのサーバーに接続するための情報は、Neo4jブラウザーを立ち上げた時に表示されています。

Python Neo4j サーバーへの接続

3行目では、この情報に加えて、データベースを最初に作成したときのパスワードを入れています。

5行目、6行目で、昨日Neo4jブラウザーから作成したデータベースを削除するための関数を書いています。

この関数を実行して、Neo4jにコマンドを送るためのコードが8行目と9行目です。

Pythonファイルを実行すると、コンソールには何も表示されませんが、Neo4jのデータベースからはデータが削除されています。

試しに、Neo4jブラウザーから次の友達の関係を表示するコードを実行してみると何も表示されません。

MATCH (master {name:"MasterU"})-[:FRIEND]->(yourfriends)
RETURN master,yourfriends

出力結果

Python Neo4j サーバーへの接続

続いて新しくデータを追加していきましょう。

データの追加

まずは私(MasterU)を作成して、友人を2人(MarkとKent)を追加します。

from neo4j import GraphDatabase

driver = GraphDatabase.driver('bolt://localhost:7687', auth=('neo4j', 'Password'))

def add_friend(tx, name, friend_name=None):
    if not friend_name:
        return tx.run('CREATE (p:Person {name: $name}) RETURN p', name=name)
    return tx.run('MATCH (p:Person {name: $name})'
                  'CREATE (p)-[:FRIEND]->(:Person {name: $friend_name})',
                  name=name, friend_name=friend_name)

def print_friend(tx, name):
    for record in tx.run('MATCH (p {name: $name})-[:FRIEND]->(yourfriends)'
                         'RETURN p,yourfriends', name=name):
        print(record)

with driver.session() as session:
    session.write_transaction(add_friend, 'MasterU')
    for f in ['Mark', 'Kent']:
        session.write_transaction(add_friend, 'MasterU', f)
    session.read_transaction(print_friend, 'MasterU')

一気にコードを書いてしまいましたが、先程と同様にNeo4jのサーバーにアクセスします。

5行目から10行目にかけてのコードは、友達を追加する関数ですが、実行時に第2引数のfriend_nameが存在しない場合は、第1引数の自分の名前(MasterU)のオブジェクトpを生成しています。

CREATE (p:Person {name: $name}) RETURN p

この部分がNeo4jのコードの部分に対応しますが、昨日は次のように書きました。

CREATE (master:Person {name: "MasterU"}) RETURN master

masterpになって、”MasterU"&nameになっています。

$nameは、7行目の最後のname=nameで第1引数のMasterUが代入されるので、生成するオブジェクトの名称が変わっただけになります。

同様に、8行目から10行目までも昨日Neo4jブラウザーで実行した下記のコードに対応したコードになっています。

CREATE (master)-[:FRIEND]->(:Person {name:name}))

昨日は、FOREACHを使ってループして複数の友達を登録していましたが、これと同じ操作は引数friend_nameを代入するときの19行目20行目でforループを使って実行しています。

12行目は、出力するための関数ですが、昨日実行した下記コードに対応した記述になっています。

MATCH (master {name:"MasterU"})-[:FRIEND]->(yourfriends)
RETURN master,yourfriends

最後の17行目から21行目で、引数を代入してデータベースに書き込んでいますが、コンソールへの出力は次のようになります。

コンソールへの出力結果

<Record p=<Node id=0 labels=frozenset({'Person'}) properties={'name': 'MasterU'}> yourfriends=<Node id=2 labels=frozenset({'Person'}) properties={'name': 'Kent'}>>
<Record p=<Node id=0 labels=frozenset({'Person'}) properties={'name': 'MasterU'}> yourfriends=<Node id=1 labels=frozenset({'Person'}) properties={'name': 'Mark'}>>

文字情報を出力しているので、ちょっと分かりづらいですよね。

私は意味が理解できていません。。。

なので、このコードを実行したあと、Neo4jブラウザーから次のコードを実行してみました。

MATCH (master {name:"MasterU"})-[:FRIEND]->(yourfriends)
RETURN master,yourfriends

出力結果

Python Neo4j サーバーへの接続

Pythonから作成したMasterUの友達関係が表示されています。

有効性がないような気が。。。

今回は、PythonからNeo4jを操作しましたが、今日学習した内容では、Neo4jをPythonから操作する有効性が見つかりません。

触りだけしかやっていないので、当たり前といえば、当たり前なのですが、ビジュアルでわかりやすいというNeo4jの特徴を考えると、余計わかりづらくなってしまっているような気がします。

ネットで調べてみると、Anacondaにインストールされている対話型実行環境である【Jupyter notebook】であればグラフも表示されるようですが、それならNeo4jブラウザーを使ったほうが利便性が高いような気もします。

もっと深く学習すればそのあたりの利便性も理解できるのかもしれませんが、Neo4jを取り上げるのはここまでになります。

時間があれば、Udemyのコースで、より深くNeo4jを学習してみてください。

Udemy講座 Neo4j

それでは明日もGood Python!