グラフデータベースとAmazon Neptuneについて

# Amazon Neptune

この記事は[KDDI Engineer Advent Calendar 2020](https://qiita.com/advent-calendar/2020/kddi_engineer) の19日目の記事です。

データ間の関係性が複雑な案件があり、リレーショナルデータベースでの実現は難しそうなので、グラフデータベースを試してみることになりました。
そもそも、グラフデータベースって？ってとこから馴染みがないので、グラフデータベースとAWSで提供されているフルマネージドグラフデータベースサービスの[AWS Neptune](https://aws.amazon.com/jp/neptune/)について調べてみました。

みんな大好き [AWS Black Belt Online Seminar](https://aws.amazon.com/jp/about-aws/events/webinars/#blackbelt) に今年の7月のNeptuneのセミナーがあったので、こちらをベースに気になったところをまとめてみます。詳しく知りたい方は、動画もありましたので[こちら](https://aws.amazon.com/jp/blogs/news/webinar-bb-amazon-neptune-2020/)をどうぞ。

[![thumbnail](https://image.slidesharecdn.com/20200714awsblackbeltamazonneptune-200715044453/95/20200714-aws-black-belt-online-seminar-amazon-neptune-1-638.jpg)](https://www.slideshare.net/AmazonWebServicesJapan/20200714-aws-black-belt-online-seminar-amazon-neptune)

# グラフとは？

![Qraph](https://image.slidesharecdn.com/20200714awsblackbeltamazonneptune-200715044453/95/20200714-aws-black-belt-online-seminar-amazon-neptune-8-1024.jpg)

グラフデータベースのグラフとは、統計情報を視覚的に表現するために用いる図のことではなく、グラフ理論のグラフである。

Wikipediaでは、いくつかのページにグラフについての説明があり、後に出てくるグラフデータベース操作言語の一つGremlinで使われている G = (V,E) という G,V,E も、それぞれ Graph, Vertices(Vertex), Edges の頭文字であることがここからも分かる。

<blockquote>一般的な用語では「ネットワーク」などと呼ばれるものに感覚的には相似した、節点と枝（頂点と辺、などと呼ぶこともある）からなる構造。</blockquote>

<blockquote>グラフ（英: Graph）とは、ノード（頂点）群とノード間の連結関係を表すエッジ（枝）群で構成される抽象データ型、and・orその実装である具象データ型である。グラフ理論を基盤として、なんらかの証明が可能であったり、豊富なアルゴリズムが利用できること、などが特徴である。</blockquote>

<blockquote>グラフは G=(V,E) で表され、V は頂点（vertices）の集合、E は頂点と頂点をつなぐエッジ（edges）の集合である。形式的には、グラフ G は順序対 G=(V,E) で定義され、V は有限の集合、E は V から選んだ2つの元からなる集合の集合である。</blockquote>

![ex Graph](https://image.slidesharecdn.com/20200714awsblackbeltamazonneptune-200715044453/95/20200714-aws-black-belt-online-seminar-amazon-neptune-10-1024.jpg)

# グラフデータベースとは？

![Propeirty](https://image.slidesharecdn.com/20200714awsblackbeltamazonneptune-200715044453/95/20200714-aws-black-belt-online-seminar-amazon-neptune-17-1024.jpg)

ノード間の関係性を示すデータ構造を持つデータベースをグラフデータベースといい、ノードとエッジそれぞれにプロパティを持つモデルをプロパティグラフモデルと呼びます。


# Gremilinとは？

![Gremlin](https://tinkerpop.apache.org/docs/current/images/gremlin-logo.png)

[TinkerPop](https://tinkerpop.apache.org/docs/current/reference/)というApacheプロジェクトで提供されているグラフトラバーサル言語がGremlin。
ノードとノードの繋がりを辿っていく経路のことをTraversalと呼ぶ。Traverseは横切る、走査するの意。


![Gremlin 101](https://image.slidesharecdn.com/20200714awsblackbeltamazonneptune-200715044453/95/20200714-aws-black-belt-online-seminar-amazon-neptune-26-1024.jpg)

# Amazon Neptune

AWSで提供されているフルマネージドグラフデータベース。
[Amazon Neptune](https://aws.amazon.com/jp/neptune/) のサービスページでや、Black beltのスライドでも記載されている通り、性能、信頼性、監査ログ提供など、リレーショナルデータベース、他のNoSQLのサービス同様に、マネージドサービスとして商用利用できそうな要件は揃ってそう。

<blockquote>Amazon Neptune は高速かつ信頼性の高いフルマネージドグラフデータベースサービスです。このサービスでは、高度に接続されたデータセットと連携するアプリケーションを簡単に構築および実行できます。</blockquote>

![Amazon Neptune](https://image.slidesharecdn.com/20200714awsblackbeltamazonneptune-200715044453/95/20200714-aws-black-belt-online-seminar-amazon-neptune-29-1024.jpg)

![Amazon Neptune](https://image.slidesharecdn.com/20200714awsblackbeltamazonneptune-200715044453/95/20200714-aws-black-belt-online-seminar-amazon-neptune-61-1024.jpg)

# Amazon Neptuneのコスト

課題はコスト。米国リージョンに比べると東京リージョンの方が高かったりAurora並みで、db.t3.mediumスタンダードインスタンスが0.15USD/時間なので、1ヶ月1万円ちょっと。
メモリ最適化インスタンスだと、0.42USD/時間〜10.08USD/時間で、1ヶ月3万円〜76万円。使用するインスタンスによってなかなか差がありそう。

当初はなかった[データベースクラスターの停止](https://aws.amazon.com/jp/about-aws/whats-new/2020/02/amazon-neptune-supports-stopping-starting-database-clusters/)が今年の2月にサポートされたので、開発環境は長期休暇は停止しておいた方がよさそうです。1回で最大7日間までなので、この年末は25日に停止したら、年が変わる頃に起動されちゃうけど。

ぼくらのチームがサービスで使おうとすると、RDS ProxyがGAになったり、Pinpointも東京リージョンで使えるようになったりしたので、Neptuneもコスト下がったりしないかなー。

![スクリーンショット 2020-12-19 18.48.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447180/6c866763-bef5-fa3c-c6d6-93f9e92da2d5.png)

# Neptune WorkbenchとJupyter Notebook

Neptune Workbenchを使うと、Jupyter Notebookからクエリ実行できるので、実行結果もJupyter Notebookで可視化することができ、作成したデータベースの検証にも便利そう。

https://dev.classmethod.jp/articles/neptune-workbench-support-visualization/

![Neptune Workbench](https://image.slidesharecdn.com/20200714awsblackbeltamazonneptune-200715044453/95/20200714-aws-black-belt-online-seminar-amazon-neptune-48-1024.jpg)

# まとめ

Black Beltを一通り動画で観たらだいぶイメージは掴めました。
Gremlinでのクエリは、SQLに比べてもシンプルに使えそうだけど、ノード、エッジ、プロファイルをどう定義するかのグラフデータベースの設計がなかなか経験者がいなくて苦労しそう。さて、チームのみんなで頑張ってみますかね。