Amazon Neptuneを使ってみる

[KIT Developer Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kitdev) 10日目の記事になります.

## Amazon Neptuneを使ってみます.
この記事では, まだ使ってみたなどが少ないAmazon Neptuneを使ってみます.
それと同時に,　グラフ型データベースとはどのようなものかも記載していきます.

研究にて, グラフ型データベースを使用する機会があり, 自分用のメモとして残そうと考え, 書いています.

### Amazon Neptuneって耳にしたことありますか?
ざっくりいうと, Amazon NeptuneはAWS(クラウド)のグラフ型データベースサービスです.
![alt](https://d2908q01vomqb2.cloudfront.net/b3f0c7f6bb763af1be91d9e74eabfeb199dc1f1f/2017/11/27/-2017-11-27-15.40.03.png)

Amazon Neptuneの説明をする前に, 簡単にグラフ型データベースとは何かについて書いていきます.

## グラフ型データベースとは
* 頂点(Node, Vertex)と辺(Edge)からなる構造をもつデータベース
* 大量のオブジェクトとそれらの関係性を保持するのに適したデータベース
* 人間関係, 通信ネットワーク, SNS, レコメンデーションエンジン, 経路案内, 物流最適化, 自動診断, 侵入検知やゲノム配列決定などネットワーク構造を持つものを表現するのに適している.

### グラフ型データベースとRDBの比較
RDBだと複雑なER図になってしまうが, グラフ型データベースを用いると, 直感的にわかりやすいだけでなく, 検索クエリーも速度に加えて, コード量も減らすことができる.
* RDBの場合だと, joinが大量に発生する
 
![alt](https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/reinvent2017-report-amazon-neptune-04.jpg)

### グラフの記法
* プロパティグラフ(Property Graph)
各点, 各辺に属性データを内部情報として持つ記述方法
![alt](http://sylvadb.com/static/img/docs/get_started/simple_property_graph.png)

* RDF Graph
プロパティグラフが内部に持つ属性データも全て点と辺で表現する記述方法
![alt](https://www.researchgate.net/profile/Thomas_Krennwallner/publication/221510784/figure/fig1/AS:393979876134914@1470943530212/A-simple-RDF-graph.png)

* 横道にそれますが, RDFグラフはセマンティック・ウェブの実現手段として使われていたりします.
WEB上の情報をトリプル化,グラフ化し,オントロジーをコンピュータに教えることで, コンピュータが効率よくWEB上の情報を収集したり, 解釈したりできるようにするために使われていたりします.
* ↓RDFについて優しく書かれており, セマンティック・ウェブについても記述があるのでお薦めです.
 [RDF入門](https://www.slideshare.net/oracle4engineer/rdf-semantic-graph-intro)

本題に戻すと, 
## Amazon Neptuneとは
* AWSのサービスの1つ
* クラウド上でグラフ型データベースを利用できるサービス

### 特徴
* **オープングラフAPIをサポート**
    * GremlinとSPARQLに対してオープングラフ API を対応
    * Property Graph モデルとそのオープンソースクエリ言語である Apache TinkerPop Gremlin
    * W3C 標準の Resource Description Framework (RDF) モデルとその標準クエリ言語である SPARQL(スパークル) 
    * **つまり, どちらのグラフ記法に対応し, それに対するクエリ言語が使える!**
* 高い安全性
* 優れたパフォーマンスとスケーラビリティ
* 完全マネージド型
* 高可用性と耐久性
    * **ココらへんは流石AWSとだけ褒めておきます**

### ユースケース例
* ソーシャルネットワーキング
 
![alt](https://d1.awsstatic.com/product-marketing/Neptune/Neptune-Diagram_social-v3.20da6a2fc4f25a212e995894b52e721b403b58ba.png)

* ナレッジグラフ
 
![amazon neptune公式サイト](https://d1.awsstatic.com/product-marketing/Neptune/Neptune-Diagram_knowledge-graph.22076f2eae8aa3e7f3c6c7e7b11a181dfe1b4002.png)



## 導入
1. AWSアカウントがない場合は, 作成しましょう.
[AWSアカウント作成](https://portal.aws.amazon.com/billing/signup?sc_icampaign=acq_jp_h_nav_cta_201809_b&sc_ichannel=ha&sc_icontent=awssm-1354&sc_iplace=cta&trk=ha_awssm-1354_acq_jp_h_nav_cta_201809_b&redirect_url=https%3A%2F%2Faws.amazon.com%2Fregistration-confirmation&language=ja_jp#/start)

2. Amazon Neptuneのセットアップ
Neptuneインスタスの生成には, Amazon Virtual Private Cloud (VPC)が必要
[Amazon Neptuneのセットアップ](https://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/get-started-prerequisites.html)


3. NeptuneDBクラスターの起動
Amazon Neptune コンソールから, DBの詳細設定を行い, インスタンスの起動 
[NeptuneDBクラスターの起動](https://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/get-started-CreateInstance-Console.html)

4. DBへのアクセス
   * Gremlin [Gremlin を使用した Neptune グラフへのアクセス](https://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/access-graph-gremlin.html)
   * SPARQL [SPARQL を使用した Neptune グラフへのアクセス](https://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/access-graph-sparql.html)
   
## 最後に
* ユースケース次第ですが, グラフ型データベースが使われていく場面は増えていくんじゃないでしょうか.
 
* **[KIT Developer Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kitdev)に記事の完成を間に合わせられなく, 中途半端な記事になっていることは申し訳ありませんm(_ _)m**
*  **導入部分に関して, 細かい説明や画像を載せて更新していきたいと思っています.**

 
## 参考サイト
* [Amazon Neptune](https://aws.amazon.com/jp/blogs/news/amazon-neptune-a-fully-managed-graph-database-service/)
* [グラフ型データベース Neptune使ってみた](https://www.slideshare.net/laclefyoshi/neptune-103294851)
* [【レポート】Deep Dive：Amazon Neptune #reinvent #DAT318](https://dev.classmethod.jp/cloud/aws/reinvent2017-report-amazon-neptune/)