Python学習【365日チャレンジ!】154日目のマスターU(@Udemy11)です。
私は文房具が大好きで、たまに大都会の文房具店に言ったときには興奮しすぎていろいろなものを購入してしまいます。
といっても、パーカーやクロス、モンブランといった高級ペンは流石に持っていませんが。。。
ロットリングやステッドラーから格安のジェットストリームまで、幅広いペンを持っている中でも、好きなシリーズが三菱の【PURE MALT】で、ボールペンやシャーペン、5色ペンなどを保有しています。
そんなお気に入りの【PURE MALT】の1つ、5色ペンが少し使っていない間にゴム質のところがネチャネチャしてきてしまいました。
なんとかする方法がないかと調べてみるといろいろ方法があるみたいなのですが、分解してゴムのネチャつき部分だけ水洗いするのも難しそうなので、とりあえずエタノールで拭き取ってみようと思います。
お気に入りのひとつなので、なんとかネチャつきが取れるといいんですが。。。
それでは今日も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を操作していきましょう。
すでにあるデータを削除
先程インストールした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ブラウザーを立ち上げた時に表示されています。
3行目では、この情報に加えて、データベースを最初に作成したときのパスワードを入れています。
5行目、6行目で、昨日Neo4jブラウザーから作成したデータベースを削除するための関数を書いています。
この関数を実行して、Neo4jにコマンドを送るためのコードが8行目と9行目です。
Pythonファイルを実行すると、コンソールには何も表示されませんが、Neo4jのデータベースからはデータが削除されています。
試しに、Neo4jブラウザーから次の友達の関係を表示するコードを実行してみると何も表示されません。
MATCH (master {name:"MasterU"})-[:FRIEND]->(yourfriends)
RETURN master,yourfriends
出力結果
続いて新しくデータを追加していきましょう。
データの追加
まずは私(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
master
がp
になって、”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から作成したMasterUの友達関係が表示されています。
有効性がないような気が。。。
今回は、PythonからNeo4jを操作しましたが、今日学習した内容では、Neo4jをPythonから操作する有効性が見つかりません。
触りだけしかやっていないので、当たり前といえば、当たり前なのですが、ビジュアルでわかりやすいというNeo4jの特徴を考えると、余計わかりづらくなってしまっているような気がします。
ネットで調べてみると、Anacondaにインストールされている対話型実行環境である【Jupyter notebook】であればグラフも表示されるようですが、それならNeo4jブラウザーを使ったほうが利便性が高いような気もします。
もっと深く学習すればそのあたりの利便性も理解できるのかもしれませんが、Neo4jを取り上げるのはここまでになります。
時間があれば、Udemyのコースで、より深くNeo4jを学習してみてください。
それでは明日もGood Python!