📝

Amazon Neptune とは

に公開

マネージドグラフデータベース - Amazon Neptune よくある質問 - AWS

Amazon Neptune は、グラフデータベースエンジン、グラフ分析データベースエンジン、グラフ機械学習 (ML)、視覚化ツールを含むサービスで、個別に使用することも、一緒に使用することもできます。

AWS が提供するグラフデータベースサービスです。

機能概要

  • 高速で信頼性に優れたフルマネージド型のグラフデータベースサービス
  • リードレプリカ、バックアップ、レプリケーションなどが可能
  • 保管時および伝送中の暗号化をサポート
  • データベース管理タスクを AWS にオフロード可能
  • オープングラフ API をサポート
  • Neptune Database, Neptune Analytics, Neptune ML を使用可能
  • サーバレスかつスケーラブル

ユースケース

Amazon Neptuneではじめるグラフデータベース入門

  • ソーシャルネットワーク
  • レコメンデーション
  • ナレッジグラフ
  • 不正検知
  • ライフサイエンス
  • ネットワーク IT 運用

グラフデータベース

グラフとリレーショナルデータベース - データベースの違い - AWS

  • 関係の保存やナビゲートするための設計されたデータベース
  • データをエンティティと関係性のネットワークとして保存
  • データを参照として保存せずエンティティデータと関係データの両方を明示的に保存
  • 関係性の強さや重みなどに基づいて計算する
  • ノードは実世界のオブジェクト
    • 名前、ID などの属性を含む
  • エッジはオブジェクト間の関係を格納
    • 友達など
  • プロパティはノードとエッジの属性
    • 名前、ID などの情報

リレーショナルデータベースとの比較

グラフとリレーショナルデータベース - データベースの違い - AWS

リレーショナルデータベース グラフデータベース
モデル 行と列を含む表形式。 データがノードおよびエッジとして表される相互接続ノード
運用 作成、読み取り、更新、および削除 (CRUD) などの SQL オペレーション。 オペレーションには、CRUD およびグラフトラバーサルオペレーションが含まれます
パフォーマンス リレーショナルデータベースは、関係をトラバースする際に複雑なクエリに直面し、パフォーマンスが低下する可能性があります。 グラフデータベースは、コネクテッドデータ間の関係の表現とクエリで優れたパフォーマンスを発揮します。
使いやすさ リレーショナルデータベースは、大規模なデータセットや構造化データに適しています。マルチホップクエリには適していません。 グラフデータベースは、関係中心のデータを扱う際に簡単に使用できます。グラフクエリ言語を使用すると、複数のホップデータを迅速にクエリできます。

リレーショナルデータベースとの比較については上記 AWS 公式サイトをご参照ください。

試してみた

Amazon Neptune を使って以下のように Alice が Bob と知り合いという関係性を作成してクエリしてみました。

┌──────────────────────────┐                    ┌──────────────────────────┐
│ Alice                    │                    │ Bob                      │
├──────────────────────────┤                    ├──────────────────────────┤
│ id: 40cdef1b-cead-...    │  ──── knows ────→  │ id: 12cdef1b-d869-...    │
│ label: person            │                    │ label: person            │
│ name: Alice              │                    │ name: Bob                │
│ age: 30                  │                    │ age: 25                  │
└──────────────────────────┘                    └──────────────────────────┘

01. データベースの作成

Amazon Neptune のコンソールから以下の設定で作成しました。

  • タイプ: Provisioned
  • テンプレート: 開発とテスト
  • クラスターストレージ設定: Neptune Standard
  • ノートブックを作成: オフ
  • IAM DB 認証: IAM 認証をオフにする

上記以外はデフォルト設定で作成しました。





02. EC2 インスタンスの作成

Neptune データベースへの接続用に以下の設定で EC2 インスタンスを作成しました。

  • AMI: Amazon Linux 2023
  • キーペア: なし
    • インスタンスコネクトで接続します
  • VPC: デフォルト
  • サブネット: デフォルト
  • セキュリティグループ: デフォルト
  • インスタンスプロファイル: AdministratorAccess 権限を付与したプロファイル

03. データベースへの接続

EC2 インスタンスの起動後、EC2 インスタンスにログインして以下のコマンドを実行します。

# 必要なソフトなどを取得
$ sudo yum install java-11-amazon-corretto -y
$ wget https://archive.apache.org/dist/tinkerpop/3.5.2/apache-tinkerpop-gremlin-console-3.5.2-bin.zip
$ sudo yum install unzip -y
$ unzip apache-tinkerpop-gremlin-console-3.5.2-bin.zip

# 設定ファイルの編集
$ cd apache-tinkerpop-gremlin-console-3.5.2
$ vi conf/remote.yaml

# 手順 01 で作成したデータベースの書き込みエンドポイントに置換
hosts: [db-neptune-1.cluster-cne1azpjxnfs.ap-northeast-1.neptune.amazonaws.com]
port: 8182
serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}

# Gremlin コンソールを起動
$ bin/gremlin.sh
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass (file:/home/ec2-user/apache-tinkerpop-gremlin-console-3.5.2/lib/groovy-2.5.14-indy.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Jan 21, 2026 4:04:23 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.

         \,,,/
         (o o)
-----oOOo-(3)-oOOo-----

# プラグインの有効化
gremlin> :plugin use tinkerpop.server
==>tinkerpop.server activated

# SSL を有効にしてクラスターに接続
gremlin> cluster = Cluster.build().addContactPoint("db-neptune-1.cluster-cne1azpjxnfs.ap-northeast-1.neptune.amazonaws.com").port(8182).enableSsl(true).create()
==>db-neptune-1.cluster-cne1azpjxnfs.ap-northeast-1.neptune.amazonaws.com/172.31.42.87:8182

# クライアント接続
gremlin> client = cluster.connect()
==>org.apache.tinkerpop.gremlin.driver.Client$ClusteredClient@723742b2

# 接続テスト
gremlin> client.submit("g.V().count()").all().get()
==>result{object=2 class=java.lang.Long}

04. データの追加とクエリ実行

接続テスト完了後、以下のコマンドを実行します。

# Alice を追加
gremlin> client.submit("g.addV('person').property('name', 'Alice').property('age', 30)").all().get()
==>result{object=v[40cdef1b-cead-00d4-be47-eebe814a816d] class=org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex}

# Bob を追加
gremlin> client.submit("g.addV('person').property('name', 'Bob').property('age', 25)").all().get()
==>result{object=v[12cdef1b-d869-1cc6-3e3b-8e26fde02a03] class=org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex}

# エッジとして Alice から Bob への "knows" 関係を作成
gremlin> client.submit("g.V().has('name', 'Alice').as('a').V().has('name', 'Bob').addE('knows').from('a')").all().get()
==>result{object=e[f8cdef1c-0ab0-c1a5-e019-09a7b1febad2][40cdef1b-cead-00d4-be47-eebe814a816d-knows->12cdef1b-d869-1cc6-3e3b-8e26fde02a03] class=org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge}

# 全ての頂点を表示
gremlin> client.submit("g.V().valueMap(true)").all().get()
==>result{object={id=40cdef1b-cead-00d4-be47-eebe814a816d, label=person, name=[Alice], age=[30]} class=java.util.LinkedHashMap}
==>result{object={id=12cdef1b-d869-1cc6-3e3b-8e26fde02a03, label=person, name=[Bob], age=[25]} class=java.util.LinkedHashMap}

# 全てのエッジを表示
gremlin> client.submit("g.E().valueMap(true)").all().get()
==>result{object={id=f8cdef1c-0ab0-c1a5-e019-09a7b1febad2, label=knows} class=java.util.LinkedHashMap}

# Alice が知っている人を検索
gremlin> client.submit("g.V().has('name', 'Alice').out('knows').values('name')").all().get()
==>result{object=Bob class=java.lang.String}

# 頂点の数を確認
gremlin> client.submit("g.V().count()").all().get()
==>result{object=2 class=java.lang.Long}

# エッジの数を確認
gremlin> client.submit("g.E().count()").all().get()
==>result{object=1 class=java.lang.Long}

Alice が Bob と知り合いという関係性を作成してクエリで関係性を確認できました。

05. ノートブックの作成

グラフとして可視化するために以下の設定でノートブックを作成しました。

  • Neptune サービス: データベース
  • クラスター: 手順 01 で作成したクラスター
  • ノートブック名: 任意の名称
  • IAM ロール: 新規作成

上記以外はデフォルト設定で作成しました。



06. 視覚化してみる

手順 05 で作成したノートブックのステータスが準備完了になったことを確認後、Graph Explorer を開くをクリックします。

Open Graph Explorer をクリックします。

Add All をクリックします。

ノードをダブルクリックするとエッジが表示されます。

ノードをドラッグアンドドロップで移動させることも可能です。

グラフの状況からも Alice が Bob と知り合いということを確認できました。

まとめ

今回は Amazon Neptune について紹介しました。
どなたかの参考になれば幸いです。

参考資料

Discussion