🌟

グラフDBを調べて感覚を掴んでみた

2024/04/26に公開

グラフDBを理解したいきっかけ

今回はこれまで仕事で使ったことのないグラフDBについて調べてみます。

初心者なので、あくまでも概要をつかみたいのが目的です。ちなみに、なんでグラフDBなんか調べようと思ったのかといえば、某外資企業のシンガポールのエンジニアが「AIでの利用の将来性ならベクトルDBではなくてグラフDBの方だと思うよ」と言っていたからです。
でも、グラフDBは関連性を表現するDBだと思うので、ベクトルDBとは使い方が全然違うはずで、知っておきたいというのがきっかけでした。なお、そのうち記事にしていきたいと思うのですが、私がやりたいと思っていることは、グラフDBもベクトルDBも両方必要だと思っています。

で、いつものようにChatGPTにまずは聞いてしまいます。

あなた
グラフDBの比較検討をしたいので、候補になる製品リストと特徴を教えてください

ChatGPT
グラフデータベース(Graph Database)の比較検討を行う際に、いくつかの主要な製品が存在します。以下に、いくつかの代表的なグラフデータベース製品とその特徴を挙げます。
• Neo4j:
オープンソースのグラフデータベースであり、非常に人気が高い。
Cypherと呼ばれるSQLに似たクエリ言語を提供し、グラフ構造のクエリを直感的に扱える。
ユーザーコミュニティが活発であり、豊富なドキュメントやサポートが利用可能。
• Amazon Neptune:
AWS上で提供されるマネージドなグラフデータベースサービス。
標準的なTinkerPop GremlinとSPARQLをサポートしており、グラフデータを効率的に操作できる。
セキュリティとスケーラビリティに優れ、AWSの他のサービスとの統合も容易。
• Microsoft Azure Cosmos DB:
マルチモデルデータベースであり、グラフデータベースの一つのモデルとしても利用可能。
GremlinとTinkerPopフレームワークをサポートしており、分散グラフクエリの実行が可能。
グローバル分散データベースとしてのスケーラビリティが高く、柔軟な料金体系を提供。
• TigerGraph:
高速かつスケーラブルなグラフデータベースで、リアルタイムアナリティクスに特化している。
GSQLという専用のクエリ言語を提供し、複雑なクエリを高速に実行できる。
分散データ処理と並列クエリ実行を活用して、大規模なデータセットにも対応。
• JanusGraph:
オープンソースの分散型グラフデータベースで、Apache TinkerPopの実装である。
多くのストレージバックエンドをサポートし、HadoopやCassandra、Amazon DynamoDBなどと統合可能。
高い拡張性と柔軟性を持ち、大規模なグラフデータセットを効率的に管理できる。
これらの製品は、それぞれ異なる特徴や利点を持っています。比較検討を行う際には、自身のプロジェクトの要件や制約に最も適した製品を選択することが重要です。

下の2つは知らないですが、上の3つは有名ですね。技術的にも10年以上経ってますし、製品としては成熟期になっているのでは、と思います。Oracleでいえば10gくらい?じゃないですかね。

知りたいのはエッジ(リレーションシップ)

関係性を表現するのが得意なDBなので、そこがRDBとの一番の違いですね。RDBの場合は結合キーでリレーションを表現しますが、効率が悪いというか、手間な印象はあります。個人的なイメージとしては、RDBにおけるモデリングの主役は正規化で、グラフDBにおけるモデリングの主役はリレーションだと思います。

ここで用語を整理します。グラフDBの場合、リレーションのことをエッジといいます。
必須用語としては、ノード、エッジ、プロパティがあります。以下のサイトがわかりやすかったので添付します。
https://www.imagazine.co.jp/12805-2/

ノードはオブジェクト指向のイメージに近いですね。振る舞いはないですが、データが実態を表現している感覚に近いです。正規化とは真逆なので、整理する前の生のデータ構造を表現する感じがします。

では実装方法も少しみてみます。

以下の記事はNeo4jの解説動画です。とてもわかりやすかったのでオススメします。45分の動画ですが、1.5倍再生でも十分ついていけるので、30分程度で理解できます。
あと、データの例としてSPY×FAMILYを用いているので、知っている人はわかりやすいと思います。いきなりボンドって言われても、あの犬だってわからないと難しいかもしれないです。ボンドが濡れて細くなるシーンが個人的には好きです。
https://www.youtube.com/watch?v=uRXH_LlgEWw


ここまでのところでだいぶ感覚はつかめました。ただ、少し疑問も湧いてきます。デモを観ながら思ったのですが、とりあえずノードを配置して、エッジで関連付けしていくのですが、そのモデリングが難しいと思います。

例えば、デモのSPY×FAMILYの場合、ファミリーという抽象概念で括っていますが、その括り方というか考え方の整理方法は難しい気がします。彼らの場合ファミリーでくくることはできますが、本当の家族ではないですしね。本当のファミリーと偽りのファミリーを区別すべきなのか、そういう整理がモデリングの上で難しいですし、使いこなす難しさになっていると思います。

あとは、ノードを考えていく時に、RDBのようにある程度かっちりと正規化した方がいいのか、というのも難しい問題です。アーニャにだけ年齢を入れていましたが、そういうものなの?というのは少し疑問があります。RDBの正規化をベースに考えると全員の年齢を入れていきますが、グラフDBのモデリング観だと必要なものだけでいいのかもしれません。このように、モデリングのエッセンスを知りたいなと思いました。

グラフDBでのモデリング

Google先生に聞きながらグラフDBのモデリング観を色々調べてみたんですが、あまりいいものを見つけられませんでした。調べ方が悪いのかもしれませんが、RDBとの違いとか、グラフDBの良さを書いているものばかりなんですよね。10分考えてダメだったのでまたChatGPTに聞いてみます。

あなた
グラフDBのデータ設計におけるモデリング手法、特にリレーションの付け方を学びたいですが、どうすれば良いですか?

ChatGPT
グラフデータベースのデータ設計におけるモデリング手法やリレーションの付け方を学ぶためには、以下の手順を参考にすることが役立ちます。
• グラフ理論の基礎を理解する:
グラフデータベースのデータモデリングは、グラフ理論に基づいています。そのため、まずは基本的なグラフ理論の概念を理解することが重要です。頂点(ノード)と辺(エッジ)の関係性、グラフの種類(有向グラフ、無向グラフ)、経路の概念などを学びましょう。
• 実際のデータを観察する:
モデリングを開始する前に、実際のデータをよく観察しましょう。データの特性や関係性を把握することで、適切なグラフモデルを設計する上でのヒントを得ることができます。
• エンティティと関係の識別:
データ内のエンティティ(ノード)とそれらの間の関係(エッジ)を識別します。これには、エンティティが何であり、どのような関係が存在するかを理解することが含まれます。
• エンティティと関係の属性を定義する:
エンティティと関係には、さまざまな属性が関連付けられることがあります。それらの属性を定義し、どの属性がエンティティに関連付けられ、どの属性が関係に関連付けられるかを考えます。
• リレーションの定義:
グラフデータベースでは、エンティティ間の関係を明確に定義することが重要です。関係は、エッジ(辺)として表現され、エンティティ間の接続を示します。どのような関係があり、それらの関係が有向か無向かを明確にします。
• グラフクエリの設計とテスト:
データモデルを設計したら、実際のグラフデータベースに実装する前に、いくつかのクエリを設計し、それらがデータモデルに適合しているかどうかをテストします。これにより、データモデルの適合性や効率性を評価することができます。
このようにして、グラフデータベースのデータ設計におけるモデリング手法やリレーションの付け方を学ぶことができます。実際のプロジェクトでは、データの特性や要件に合わせて柔軟にモデリングを行うことが重要です。

うーん、なんかイマイチな回答です。もうちょっとリレーションの付け方について具体的に知りたいので、ダイレクトに聞いてみます。

あなた
リレーションの付け方として、パターン化できるのであれば、そのパターンを知りたいです。

ChatGPT
グラフデータベースにおけるリレーションの付け方には、一般的なパターンが存在します。これらのパターンは、実際のデータモデルに適用する際に役立ちます。以下に、よく使われるリレーションのパターンをいくつか紹介します。
• 親子関係(Parent-Child Relationship):
このパターンでは、一つのエンティティが別のエンティティの親であるという関係を示します。例えば、ユーザーとそのユーザーが所有するアイテムの関係がこのパターンに該当します。親エンティティ(親ノード)から子エンティティ(子ノード)への有向エッジを使用して表現されます。
• 友人関係(Friend Relationship):
ソーシャルネットワークなどでよく見られるパターンで、一つのエンティティが別のエンティティと友人であるという関係を示します。双方向の関係であり、無向エッジを使用して表現されます。
• 依存関係(Dependency Relationship):
あるエンティティが別のエンティティに依存している関係を示します。例えば、ソフトウェアコンポーネント間の依存関係や、タスク間の依存関係が該当します。通常、有向エッジを使用して表現されます。
• マッチング関係(Match Relationship):
二つのエンティティが互いに関連付けられていることを示します。例えば、求職者と求人の間のマッチング関係が該当します。双方向の関係であり、無向エッジを使用して表現されることがあります。
• 所有関係(Ownership Relationship):
一つのエンティティが別のエンティティを所有している関係を示します。例えば、会社とその従業員の間の所有関係が該当します。通常、有向エッジを使用して表現されます。
これらは一般的なパターンであり、実際のデータモデルに適用する際には、それぞれの特定のケースに合わせてカスタマイズすることが重要です。データの特性やビジネス要件に応じて、適切なリレーションのパターンを選択し、データモデルを設計してください。

なるほど、確かにこのパターン分類は結構参考になります。ノードを眺めてみて、リレーションを張るときに(書いていて、エッジよりリレーションの方がわかりやすいと思うようになってきました)、こういうパターンが隠れていないかを考えながら作ることができれば、便利なDBになっていきそうですね。とはいえ、このリレーションを見つけるにはセンスが必要な気もしますし、手間をかけてDBを育てていく必要がありそうです。そこがグラフDBの難しさであったり、イマイチ流行らないポイントなのかもしれません。

今回のブログはここまでです。おおよそのグラフDBの概要はわかったので、次にまた進みたいと思います。では。

Discussion