Slide 1

Slide 1 text

Amazon Neptuneで始める初めてのグラフDB -グラフDBを使う意味を考える- 2024.09.07

Slide 2

Slide 2 text

2 自己紹介 氏名:兼安 聡 所属:株式会社サーバーワークス アプリケーションサービス部 在住:広島(フルリモート) 担当:DevOps、PM、SM 2024 Japan AWS Top Engineers (Database) 2024 Japan AWS All Certifications Engineers 認定スクラムマスター X:@satoshi256kbyte

Slide 3

Slide 3 text

3 今回のLTについて Amazon NeptuneはグラフDBが扱えるマネージドサービス です これを用いて生まれて初めてグラフDBを触ってみました 触ってみた結果自分が感じたグラフDBの意味を共有します

Slide 4

Slide 4 text

4 Amazon Neptuneで表現したグラフDB API Gateway CPU 最適化 メモリ 最適化 一般 EC2 ALB ECS オンプレ Tom Sawyerで出力してますが、 発表用に見やすさ重視で加工してます

Slide 5

Slide 5 text

5 Amazon Neptuneで表現したグラフDB わかる人にはわかる知識のつながり を表現している API Gateway CPU 最適化 メモリ 最適化 一般 EC2 ALB ECS オンプレ

Slide 6

Slide 6 text

6 Amazon Neptuneで表現したグラフDB つまりベテランの頭の中を 図示したもの、マインドマップ API Gateway CPU 最適化 メモリ 最適化 一般 EC2 ALB ECS オンプレ

Slide 7

Slide 7 text

7 Amazon Neptuneで表現したグラフDB ある程度の知識があれば、 これを見て新たな気づきが得られる API Gateway CPU 最適化 メモリ 最適化 一般 EC2 ALB ECS オンプレ ALBって、オンプレとも連携できる かもしれないのか(気づき)

Slide 8

Slide 8 text

8 グラフのモデルとクエリ言語 モデル クエリ言語 構造 プロパティグラフ • Gremlin (Apache TinkerPop) • Cypher (Neo4j) • ノード(頂点)とエッジ(辺)で構成 • ノードとエッジに任意のプロパティを持つ • ノード: エンティティやオブジェクト • エッジ: ノード間の関係 RDF • SPARQL • トリプル形式(主語、述語、目的語) • 主語: リソースやエンティティ • 述語: 関係やプロパティ • 目的語: 関係の相手やプロパティの値

Slide 9

Slide 9 text

9 グラフのモデルとクエリ言語 モデル クエリ言語 構造 プロパティグラフ • Gremlin (Apache TinkerPop) • Cypher (Neo4j) • ノード(頂点)とエッジ(辺)で構成 • ノードとエッジに任意のプロパティを持つ • ノード: エンティティやオブジェクト • エッジ: ノード間の関係 RDF • SPARQL • トリプル形式(主語、述語、目的語) • 主語: リソースやエンティティ • 述語: 関係やプロパティ • 目的語: 関係の相手やプロパティの値 今回はプロパティグラフと Gremlinを使用

Slide 10

Slide 10 text

10 構成図 グラフDBにAmazon Neptuneを使用 データ登録はPython+Gremlin プログラムはJupyter Notebookで実行 勉強目的なのであえてプログラムでデータ 投入 データの参照はマーケットプレイスの、 Tom Sawyerを使用 Tom Sawyerはグラフの可視化に優れる 自前でグラフDBをインストールして 準備するより圧倒的に楽

Slide 11

Slide 11 text

11 Amazon Neptuneへのデータ投入 port = 8182 server = '{Amazon Neptuneのエンドポイント}' endpoint = f'wss://{server}:{port}/gremlin' graph = Graph() connection = DriverRemoteConnection(endpoint, 'g', transport_factory=lambda: AiohttpTransport(call_from_event_loop=True)) g.addV('compute').property(T.id, '1').property('name', 'EC2').iterate() g.addV('networking & container delivery').property(T.id, '4').property('name', 'ELB').iterate() # エッジ(繋がり)を追加 (ELBとEC2) g.V('4').addE('connect').to(__.V('1')).iterate() 雰囲気だけ感じてください 一見面倒に見えるが、 新たな繋がりを作る時にテーブル定義の 変更が発生しないのが大きい

Slide 12

Slide 12 text

12 一部を切り出すこともできる g.V().has('name', 'EC2').outE('instance type') CPU 最適化 メモリ 最適化 一般 EC2

Slide 13

Slide 13 text

13 一部を切り出すこともできる import pandas as pd # EC2とインスタンスタイプの情報を取得し、表形式で表示する ec2_instance_type_info = g.V().has('name', 'EC2') \ .as_('ec2') \ .outE('instance type').inV() \ .project('compute_name', 'instance_type_name', 'first_character') \ .by(__.select('ec2').values('name')) \ .by(__.values('name')) \ .by(__.values('first character')) \ .toList() # 結果をDataFrameに変換 df = pd.DataFrame(ec2_instance_type_info) compute_name instance_type_name first_character EC2 一般 m EC2 コンピューティング最適化 c EC2 メモリ最適化 r

Slide 14

Slide 14 text

14 知識のデータの話なのでベクトルDBとグラフDBの違いを考える ベクトルDB 生成AIに使われる 類似性検索を得意としている グラフDB 複雑な関係をより自然に表現できる 人に理解と気づきを与えるのに適している データの準備に時間がかかるのは同じ

Slide 15

Slide 15 text

16 <まとめ>私が感じたグラフDBの意味 グラフDBはわかる人にはわかる繋がりを表現できる つまり、ベテランの頭の中であり、これを見たほうが 早く理解と気づきを得られる可能性がある という方向性でグラフDBを試行錯誤してます 同士がいたら一緒に活用方法を考えさせてください

Slide 16

Slide 16 text

17 ありがとうございました

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

19 Appendix 今回検証に使用したソースコード https://github.com/satoshi256kbyte/study-graphdb-neptune