Slide 1

Slide 1 text

Amazon Neptuneで始めてみるグラフDB -OpenSearchによるグラフの全文検索- 2024.10.23/25

Slide 2

Slide 2 text

2 自己紹介 氏名:兼安 聡 所属:株式会社サーバーワークス アプリケーションサービス部 在住:広島(フルリモート) 担当:DevOps、PM、SM 2024 Japan AWS Top Engineers (Database) 2024 Japan AWS All Certifications Engineers 認定スクラムマスター X:@satoshi256kbyte 去年よく触ってたDBはAmazon Timestream 今年はAmazon Neptuneをよく触ってます

Slide 3

Slide 3 text

目次 • グラフDBとは • Amazon Neptuneのデータを操作する方法 • Amazon Neptuneと全文検索 • (独断)グラフDBのメリット 業務で使っていますが、自分たち以外で使ってる人を見たことがないので、 使用方法の紹介とメリットはこれはなんじゃないかというのをお話ししま す。

Slide 4

Slide 4 text

グラフDBとは

Slide 5

Slide 5 text

5 グラフDBとは グラフDBは知識を可視化します 文章ではなく、繋がりで表現するのが特徴で、繋がりを表 現するのに特化した機能を持ちます 回答そのものではなく気づきを与えるものと考えています 左記の画像、とても小さいので見辛いと思います。 オリジナル画像をこちらに置いておきました。

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

8 グラフのモデルとクエリ言語 プロパティグラフとは 今回はプロパティグラフとGremlinを使用します AWSの公式ページでこの組み合わせが最初に出てきます [補足]この組み合わせ、手動でNeptuneを使わずに手動 でセットアップしようとすると結構大変でした。 ノード(頂点) label:query_type エッジ ノード(頂点) label:query_language プロパティ 値 id 5 name Gremlin

Slide 9

Slide 9 text

9 グラフのモデルとクエリ言語 Pythonのサンプルコード Gremlinはプロパティグラフを操作する言語です SQLとは全く違う記法です 癖のある記法ではあります 左記のコードの特徴は、データを登録するにあたり、 DDLに相当するものがないことです。 グラフDBはスキーマレスなのでどんどんとデータを追 加することができます。 繋がりのデータはいろんなタイプのデータがどんどん と追加されるのを想定しているので、柔軟性に長けて います。 〜省略〜 port = 8182 server = Neptuneのエンドポイント' endpoint = f'wss://{server}:{port}/gremlin' graph = Graph() connection = None try: connection = DriverRemoteConnection(endpoint, 'g', transport_factory=lambda: AiohttpTransport(call_from_event_loop=True)) g = graph.traversal().withRemote(connection) g.addV('service').property(T.id, '1').property('name', 'Neptune').iterate() g.addV('graph_type').property(T.id, '4').property('name', 'Property Graph').iterate() g.addV('query_language').property(T.id, '5').property('name', 'Gremlin').iterate() g.addV('query_language').property(T.id, '6').property('name', 'Cypher').iterate() g.addV('graph_type').property(T.id, '7').property('name', 'RDF Graph').iterate() g.addV('query_language').property(T.id, '8').property('name', 'SPARQL').iterate() 〜省略〜 g.V('1').addE('Graph Type').to(__.V('4')).iterate() g.V('4').addE('Query Language').to(__.V('5')).iterate() g.V('4').addE('Query Language').to(__.V('6')).iterate() g.V('1').addE('Graph Type').to(__.V('7')).iterate() g.V('7').addE('Query Language').to(__.V('8')).iterate() 〜省略〜 result = g.V().limit(25).bothE() print(result) finally: if connection is not None: connection.close() ノード(頂点)の登録 エッジの登録

Slide 10

Slide 10 text

Amazon Neptuneのデータを操作する方法

Slide 11

Slide 11 text

11 Amazon Neptuneのデータを操作する方法 AWS上のリソース上でプログラムを実行し、Neptuneを操作 EC2、Lambda、Jupyter Notebookなど Webベースのツールで操作 Tom Sawyer Graph Database Browser クライアントから接続してプログラムツールでアクセス 踏み台サーバーが必要

Slide 12

Slide 12 text

12 Amazon Neptuneのデータを操作する方法 – 構成図 Tom Sawyer Graph Database Browser クライアントから直に繋ぐ

Slide 13

Slide 13 text

13 Amazon Neptuneを操作するツール グラフDBを操作するツールとしては Tom Sawyer Graph Database Browserがあります。 これはphpMyAdminのようにブラウザでクエリが実行で きるツールです。 ローカルPCで動くツールやプログラムでNeptuneに繋ぐ ことはできるにはできます。 ただし、RDSと異なりパブリックアクセスがまだ実装され てない(2024年10月時点)ので、踏み台サーバーが必要 になります。

Slide 14

Slide 14 text

14 Tom Sawyer Graph Database Browserのイメージ g.V().has('name', 'Full-Text Search') .outE().as('edges1') // Full-Text Searchから出るエッジ .inV().as('nodes1') // 接続されているノード .outE().as('edges2') // さらに次のエッジ .inV().as('nodes2') // 次の段階のノード .select('edges1', 'nodes1', 'edges2', 'nodes2') この部分だけ抽出

Slide 15

Slide 15 text

Amazon Neptuneと全文検索

Slide 16

Slide 16 text

16 Amazon Neptune+OpenSearchによるグラフDBの全文検索 Amazon NeptuneはOpenSearchと連携させることで、全文検索機能を付与することができます。 この連携は、AWSよりソリューションが提供されており、AWS公式から提供されている CloudFormationテンプレートを実行することで起動させることができます。 【引用】Amazon OpenSearch Service を使用した Amazon Neptune でのフルテキスト検索

Slide 17

Slide 17 text

17 グラフDBの全文検索 セットアップ時のポイント① このソリューション、自動で作成されて便利ではあるのですが、注意ポイントがあります。 NeptuneはVPCの中にいないといけない NeptuneはNeptune Streamを有効化しないといけない これは、パラメータグループで変更&再起動が必要 OpenSearch サービスドメインを事前に作成しておく必要がある OpenSearch サービスドメインは推奨設定に従って作るとIPv6を求められるので、VPCとサブネット の設定を変えるかIPv4モードに変えないといけない 推奨設定に従って作るとIAM認証になるので、Neptune側もそれに合わせるか、解除する必要がある OpenSearch用のセキュリティグループを作り、Neptuneのセキュリティグループに通しておく必要 がある リソースポリシーのデフォルトが全てDeny、これをAllowにしないと連携が成功しない (これはすごいハマりました・・・)

Slide 18

Slide 18 text

18 グラフDBの全文検索 セットアップ時のポイント② CloudFormationテンプレートのパラメータにも注意ポイントがあります パラメータ:List of Security Group Ids The Security groups associated with the Neptune Stream Cluster and Neptune Target Cluster. ここで指定したセキュリティグループが連携を実行するLambdaに付与される 原文をそのまま受け止めて、Neptuneが属するセキュリティグループと捉えると適切でない可能性が ある パラメータ:List of Route Table Ids Comma Delimited list of Route table ids associated with the Subnets. For Example: rtb- a12345,rtba7863k1. Optional parameter - Only needed when creating DynamoDB VPC Endpoint. ここで指定したルートテーブルに、LambdaがDynamoDBと通信するためのVPCエンドポイントが繋 がる。従って、これも上と同じようにNeptuneが属するサブネットと捉えると適切でない可能性があ る

Slide 19

Slide 19 text

19 グラフDBの全文検索 クエリのサンプル opensearch_endpoint = 'https://vpc-graphdb-opensearch-domain2-irj4z6yxd23cofmombf5zkam7q.ap-northeast- 1.es.amazonaws.com' try: connection = DriverRemoteConnection(endpoint, 'g', transport_factory=lambda: AiohttpTransport(call_from_event_loop=True)) g = graph.traversal().withRemote(connection) \ .withSideEffect('Neptune#fts.endpoint', opensearch_endpoint) # Elasticsearch endpointの設定 # 'policy' に近い名前を持つ要素を検索するクエリ result = g.V().hasLabel('key_checkpoint') \ .has('name', 'Neptune#fts policy~') \ .elementMap() \ .toList() # 検索結果をリストとして取得 df = pd.DataFrame(result) # 結果を表示 print(df) finally: if connection is not None: connection.close()

Slide 20

Slide 20 text

20 グラフDBの全文検索 クエリのサンプル – 検索結果 プロパティ 値 id 16 name Resource Policy error 403 ノード(頂点) label:key_checkpoint

Slide 21

Slide 21 text

•(独断)グラフDBのメリット

Slide 22

Slide 22 text

22 グラフDBのメリット 繋がりを見ることでわかる人には !?と思ってくれるかも

Slide 23

Slide 23 text

23 今時の調べる手段 インターネット検索 鉄板 キーワードが思いつかないと検索できない 生成AI 未経験者、初心者に優しい 冗長 正解に辿り着くまでに何度もやり取りする必要がある グラフDB 繋がりが見えることで、自分にない気づきやヒントを得やすい わかる人にしかわからない、初心者よりちょっと先ぐらいの人向け

Slide 24

Slide 24 text

24 今時の調べる手段 未経験者 初心者 中級者 上級者 ここの人に(特に)向いてるのが生成AI ここの人に向いてる(かもしれない)のがグラフDB 知識継承のために、上級者の知識をデータベース化しようという流れがあると した場合

Slide 25

Slide 25 text

25 生成AIで調べる時のイメージ 【質問】NeptuneとOpenSearchの連携を構築する手順を教えてください 【回答】手順の文章 【質問】連携を実行するとポリシーエラーが出ました 【回答】原因と対応方法の候補 この一問一答形式のやりとりが時間がかかりすぎると感じる人や、 これでも正解が得られない可能性がある領域にいる人は俯瞰した図をそのまま 提供してもらった方が早い可能性がある

Slide 26

Slide 26 text

26 グラフDBが初心者〜中級者に向いている理由 ある程度知識があるので、冗長な説明は不要で俯瞰した情報が欲しいときが多 い グラフDBは生データで加工が入っていないので、(入れた情報が正しけれ ば)間違いなく正解のデータである

Slide 27

Slide 27 text

27 まとめ グラフDBはわかる人にはわかる繋がりを表現できる 初心者〜中級者にとってはグラフDBの方がわかりや すく、正確と言える可能性があります まだはっきりと方向性が見えてるわけではないが、生 成AIでは拾いきれないニーズをまかなうものとして、 存在感を示すのではないかと思っています 同士がいたら一緒に活用方法を考えさせてください

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

30 Appendix ➢参考ブログ ➢Amazon Neptuneで始める初めてのグラフDB① Neptuneクラスターと Notebookの作成 ➢Amazon Neptuneで始める初めてのグラフDB② Gremlinを用いたグラフデー タの基本操作 ➢Amazon Neptuneで始める初めてのグラフDB③ Amazon NeptuneとTom Sawyer Graph Database Browserとの接続 ➢Amazon Neptuneで始める初めてのグラフDB④ G.V()を用いてローカル端末 からAmazon Neptuneに接続する ➢Amazon Neptuneで始める初めてのグラフDB⑤ Amazon OpenSearch Serviceと連携した全文検索