CloudflareWorkers+HonoでグラフDB ( Neo4jAura 無料版 ) にアクセスしてみたメモ

# 概要
[Neo4j Auraとは？AuraDB Freeで無料＆手軽にグラフデータベースを使ってみよう](https://www.creationline.com/tech-blog/data-management/neo4j/53077)を参考に、Neo4j Auraに登録してアクセスしてみた。

[ソースコード](https://github.com/hibohiboo/odyssage/blob/c9e9f8db4738465e27d9421a4eca32af71df9669/apps/backend/src/index.ts) ※[Testというかwrangler.tomlの設定がおかしい](https://qiita.com/hibohiboo/items/f3cda0ebf794282d8ff0)

# Neo4j Auraの登録

https://neo4j.com/product/auradb/ にアクセスし、「Start Free」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/ce0ab0bd-ced9-8846-c442-6b1cbc6408ea.png)

今回はメールアドレスで登録した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/b69fe524-5000-55b5-5524-d3889cf76297.png)

登録したメールアドレスにVerifyのメールが来るので、「Verify  my e-mail address」と書かれたボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/b8dd50f6-d85f-5d84-5653-8ec4db8a7b7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/1071def4-1227-8565-e564-9f29ff95c7d1.png)

下記のようなページに飛ばされるので、最初の利用規約を読んで同意ボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/56f4d576-d8d7-7050-f0b1-10697fd65149.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/03a28d1f-6173-8d7a-d931-515fef460387.png)

無料のインスタンスを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/7c83849d-712b-4376-e837-c10fe61f257b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/121b2124-b1aa-2ca8-c567-619ae960500d.png)

パスワードをダウンロードする。うっかり消さないように注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/c1daf963-7bdd-5f0a-20c6-06863d36a127.png)

下記のような内容が書かれたものが取得できる。
```
# Wait 60 seconds before connecting using these details, or login to https://console.neo4j.io to validate the Aura Instance is available
NEO4J_URI=neo4j+s://<your-instance-id>.databases.neo4j.io
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=<your-password>
AURA_INSTANCEID=<your-instance-id>
AURA_INSTANCENAME=Instance01
```

# 接続方法の確認
インスタンスの右上のConnectから。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/41ad8b74-2105-c41a-2197-c18ae16fe364.png)
Driversを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/9aed222f-1c36-d56c-c34a-540fac835d5d.png)

今回はJSを選択。サンプルが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/cc038816-592a-e8f9-b24a-f11da26b2bf6.png)



# ローカルで動作確認

[js-driver](https://neo4j.com/docs/api/javascript-driver/current/)を確認して記載。


```diff:worker-configuration.d.ts
interface Env {
	Bindings: {
		NEON_CONNECTION_STRING: string;
+		NEO4J_URL: string;
+		NEO4J_USER: string;
+		NEO4J_PASSWORD: string;
	};
}
```

```diff:.dev.vars
NEON_CONNECTION_STRING=postgresql://<DB_USER_NAME>:<DB_PASSWORD>@<NEON_DB_DOMAIN>.us-west-2.aws.neon.tech/main?sslmode=require
+ NEO4J_URL=neo4j+s://<your-instance-id>.databases.neo4j.io
+ NEO4J_USER=neo4j
+ NEO4J_PASSWORD=<your-password>
```


```ts:src/index.ts
import { Hono } from 'hono';
import neo4j from 'neo4j-driver';
import type { Neo4jError } from 'neo4j-driver-core';

const app = new Hono<Env>();
app.get('/scenarios', async (c) => {
	let driver;

	try {
		driver = neo4j.driver(c.env.NEO4J_URL, neo4j.auth.basic(c.env.NEO4J_USER, c.env.NEO4J_PASSWORD));
		const session = driver.session();
		const result = await session.run('match (s:Scenario) return (s)');
		const data = result.records.map((record) => record.get('s').properties);

		return c.json(data);
	} catch (err) {
		const neo4jError = err as Neo4jError;
		console.log(`Connection error\n${err}\nCause: ${neo4jError.cause}`);

		return c.text('Server Error', 500);
	} finally {
		if (driver) {
			await driver.close();
		}
	}
});
export default app;
```

実行

```
npm run dev
```
下記URLで確認した。
http://127.0.0.1:8787/scenarios

# Cloudflareにアップして確認。

secretを追加する。

```
wrangler secret put NEO4J_URL
wrangler secret put NEO4J_USER
wrangler secret put NEO4J_PASSWORD
```

Workersの更新は [GithubActions](https://github.com/hibohiboo/odyssage/blob/develop/.github/workflows/cloudflare-workers-deploy.yml)で行っている。

デプロイ後、下記URLから動作することを確認。( 3日間触らないとインスタンスが停止してしまうので500の可能性あり[*](https://www.creationline.com/tech-blog/data-management/neo4j/53077))

https://odyssage-backend.hibohiboo66-cloudflare.workers.dev/api/graph-scenarios


# 参考
[GraphDB KuzuのWebAssemblyをブラウザ上で動かしneo4j-nvlで可視化してみたメモ](https://qiita.com/hibohiboo/items/30aadc02d932e579e8c2)