Neo4j_使い始め備忘録

# これは何？
- Neo4jの環境構築～デプロイの備忘録です。
- Neo4jを使い始めたい方の参考になれば幸いです。

# 環境
今回は、ローカルからデプロイする流れをまとめます。

- vscode
- python 3.9.13
- java 11.0.2
- Neo4j 5.1.0

※javaを入れないと動きませんので注意！（以下からダウンロードしてパスを通してください）
https://jdk.java.net/archive/

# Neo4j
### 1. アカウント作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/e1dc1ea6-3f2a-b380-eaa7-a0fa8f16f225.png)


### 2. インスタンス作成

- フリーモードでインスタンス作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/839f0003-9159-3b3a-3dd1-3a3f821cfdab.png)

- インスタンスができ、クレデンシャルをダウンロードします
    - usernameとpasswordが作成したインスタンスと紐付きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/b4353792-b4be-652b-f240-dbed17f7ea6e.png)

- インスタンスができればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/7192e0e3-cf43-6782-73db-5cbcb65bc49c.png)

- Openを押すとworkspaceに移動します。先ほどダウンロードしたtxtファイルからpasswordを確認し入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/19a6e7aa-99c9-3834-c61d-797cbfa0b989.png)

- ちなみに、txtファイルの中身はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/fecbf98b-f446-e409-7f08-bc36a807d8d3.png)

- workspaceが開けばOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/f3b75628-6955-2f92-1b89-ef0a875f6b85.png)


### 3. vscodeからデプロイ
- 仮想環境を作り、先ほどのtxtファイルを同じ階層に入れておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/76e0981c-2a25-a5bb-d330-5e72b71a2597.png)

- iniファイル作成
    - neo4j.iniファイルを作成
    - txtファイルを見ながら、uri, user, passwordを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/5fd7db7d-a22d-02f3-23da-add1019b48ed.png)

- requirements.txt用意し、Neo4jをインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/2f893570-947b-b5a6-394d-d406f833a0cc.png)

- デプロイ用のコードを用意
    - [▶こちらの記事](https://tech.nkhn37.net/python-neo4j-graph-database/#Pythonneo4j)を参考にさせていただきました

<details><summary>neo4j_sample.pyファイルの中身</summary>
<div>

```python
import configparser
from neo4j import GraphDatabase


def clear_db(tx):
    tx.run('MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r')


def search_all(tx):
    result = tx.run('MATCH (n) OPTIONAL MATCH (n)-[r]-() RETURN n,r')
    return [r for r in result]


def add_person_node(tx, name):
    tx.run('CREATE (p:Person {name: $name}) RETURN p', {'name': name})


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


def main():
    # ===== neo4jの設定取得
    config = configparser.ConfigParser()
    config.read('neo4j.ini')
    uri = config['NEO4J']['uri']
    user = config['NEO4J']['user']
    password = config['NEO4J']['password']

    # neo4jドライバーの作成
    driver = GraphDatabase.driver(uri, auth=(user, password))
    with driver.session() as session:
        # データベースのクリア
        session.write_transaction(clear_db)

        # ノードの追加
        session.write_transaction(add_person_node, 'taro')

        # FRIEND関係の追加
        session.write_transaction(add_friend_relationship, 'taro', 'hanako')
        # 繰り返しで追加
        friend_list = ['jiro', 'haruka', 'sakura']
        for f in friend_list:
            session.write_transaction(add_friend_relationship, 'taro', f)

        # データの検索
        result = session.read_transaction(search_all)

    # 結果の確認
    for res in result:
        print(res)


if __name__ == '__main__':
    main()
```
</div>
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/9d408ee5-4cb8-e727-7974-7fe555b2b5be.png)

# エラー：ルーティング情報を取得できません
- 最も手こずった箇所です
- 私の場合、python neo4j_sample.py で実行するとルーティング情報を取得できないエラーが発生しました
    - DeprecationWarning: write_transaction has been renamed to execute_write　session.write_transaction(clear_db)　Unable to retrieve routing information
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/8bd29e91-21e6-e81c-7887-81b5ebcf301a.png)

- uriを +s:// から  +ssc://  に変更するとエラーが消えました
    - [▶こちらの記事](https://github.com/neo4j/neo4j-python-driver/issues/628)を参考にしました
    - 適切な証明書(？)をダウンロードしていないため、弾かれている模様でした。実際の業務等で使用するには、別で解決策を探す必要があります。DockerからNeo4jを立ち上げたりすれば大丈夫…⁇

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/c431c64d-41db-3e12-f012-9860e93ba903.png)

- workspaceに戻るとこんな風にグラフができています（内訳はコード参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/eb06367b-04a6-3f41-dc2f-bf1f8a30ab17.png)

# 学び
- ローカルでCypher Queryを書き、デプロイするところまでは流れを掴めました
- ただ、ルーティングエラーが気になるので、業務で使用するにはDockerから立ち上げる、またはNeo4jのデスクトップアプリをインストールするなどが必要そうです
- あとはCypher Queryを学ぶ必要がありますね…

# 参考記事
- [Pythonでneo4jを使用する](https://tech.nkhn37.net/python-neo4j-graph-database/#Pythonneo4j)