# グラフデータモデル ## 定義 グラフデータモデルは、データを*頂点(vertex/node)*と*辺(edge/relationship)*の2種類の要素で表現するデータモデルであり、多対多関係が支配的でリレーショナルモデルでは表現しづらいドメイン(ソーシャルグラフ、Webグラフ、道路網、知識グラフ等)に適する。実装上は主に2つの系統がある。*プロパティグラフ*(labeled property graph)は各頂点・辺がラベルとキーバリューのプロパティ集合を持つモデルで、Neo4j・Memgraph・KùzuDBなどが実装する。*トリプルストア*は(主語, 述語, 目的語)という3つ組ですべての情報を表現するモデルで、Datomic・AllegroGraph・BlazegraphなどRDF(Resource Description Framework)データモデルの実装に採用される。両者は表現力がほぼ同等で、Amazon Neptuneのように両方をサポートするデータベースもある。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 3 Data Models and Query Languages]] "Graph-Like Data Models", "Property Graphs") ## プロパティグラフのリレーショナル表現 プロパティグラフは概念的には`vertices`テーブルと`edges`テーブルの2つのリレーショナルテーブルとして表現できる。`edges`テーブルは`tail_vertex`・`head_vertex`両方にインデックスを持ち、任意の頂点から入辺・出辺の両方向へ効率的にグラフを*traverse*(辿る)できる。これは多対多関係の連関テーブル(join table)を、複数種類の関係を単一テーブルへ一般化した形とみなせる。ただし1つの辺は2頂点しか結べないという制約があり、3項以上の関係(join tableの1行が複数の外部キーを持つケース)を表現するには追加の頂点を導入するか、hypergraphを使う必要がある。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 3 Data Models and Query Languages]] "Property Graphs") ## トリプルストアとRDF トリプルストアでは(*Jim*, *likes*, *bananas*)のように、主語・述語・目的語からなる文で情報を表現する。目的語がプリミティブ値ならその三つ組は頂点のプロパティ(例: (*lucy*, *birthYear*, *1989*))に相当し、目的語が別の頂点ならその述語はグラフの辺(例: (*lucy*, *marriedTo*, *alain*))に相当する。RDFはこのモデルをインターネット規模のデータ交換向けに設計したもので、主語・述語・目的語はしばしばURI(名前空間の衝突を避けるため)として表現される。RDFデータはTurtle(N3のサブセット)やXMLなど複数の記法でエンコードでき、Apache Jenaのようなツールが相互変換する。なお実運用のトリプルストアは単純な3つ組では足りず追加メタデータを持つことが多い——Amazon Neptuneはグラフ IDを加えた4つ組(quad)、Datomicはトランザクション IDと削除フラグを加えた5つ組を使う。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 3 Data Models and Query Languages]] "Triple Stores and SPARQL", "The RDF Data Model") ## 4つのグラフクエリ言語 本章は「アメリカからヨーロッパへ移住した人を探す」という共通クエリを軸に4つの言語を比較する。 - **Cypher**: プロパティグラフ向け。元々[[Neo4j]]向けに開発され、後にopenCypherとしてオープン標準化された。`(person) -[:BORN_IN]-> () -[:WITHIN*0..]-> (:Location {name:'United States'})`のような矢印記法でパターンマッチングを行い、`*0..`で「0回以上辺を辿る」可変長パス探索を正規表現の`*`のように簡潔に表現する。 - **SPARQL**: トリプルストア/RDF向け。Cypherより先に存在し、Cypherのパターンマッチング構文はSPARQLを参考にしている。変数は`?person`のようにクエスチョンマークで始まる。RDFは述語がプロパティと辺を区別しないため、プロパティのマッチングも辺と同じ構文で書ける。 - **Datalog**: SPARQL・Cypherより古く1980年代の学術研究に由来する。リレーショナルなデータモデル(*facts*=行)に基づくが、ルール(`:-`で定義される導出仮想テーブル)を積み上げて複雑なクエリを構築でき、再帰クエリに特に強い。Datomic・LogicBlox・CozoDB・LinkedInのLIquidなどニッチなDBで採用される。 - **GraphQL**: 他の3言語と異なりOLTP志向で意図的に制限的な言語である。信頼できないクライアント(モバイルアプリ・Webフロントエンド)からのリクエストを想定し、再帰クエリや任意の検索条件を許さない(サービス提供者が明示的に許可した結合のみ実行可能)。「グラフ」を名乗るがリレーショナル・ドキュメント・グラフいずれのDB上にも実装できる。 Cypherの4行のクエリと同等の処理をSQLの再帰共通テーブル式(`WITH RECURSIVE`)で書くと31行になる——事前に結合数が確定しないグラフ探索をSQLで表現する構文的コストの大きさを示す好例である。GQL(Graph Query Language)というISO標準がCypherを土台に2024年に発行され、グラフDB間の言語統一を目指している。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 3 Data Models and Query Languages]] "The Cypher Query Language", "Graph Queries in SQL", "Triple Stores and SPARQL", "Datalog: Recursive Relational Queries", "GraphQL") ## 横断的知見 - **知識グラフのAIOps応用(KGE)は、本書が形式化する「トリプルストア/RDF」という一般モデルの特殊化として位置づけられる**: [[知識グラフ]]ページが蓄積するLogKG・SynthoDiagは、ログの複数フィールドやマルチソースログを(実体, 関係, 実体)という構造に落とし込み、RotatEのような知識グラフ埋め込み(KGE)で連続ベクトル空間へ写像する。本章が説明するトリプルストアモデル(主語・述語・目的語の3つ組、RDF)は、このような応用型知識グラフが暗黙に前提とする形式的基盤である。本章はさらに「検索エンジンは知識グラフを使い、クロールで取得した事実やWikidataのような構造化データ源から組織・人物・場所などの実体間関係を記録する」と述べており、AIOpsのログ障害診断という狭いドメイン適用とは別に、知識グラフには汎用的なWeb規模の実体関係記録という応用系統が存在することを示す。両者は同じ理論的基盤(トリプル/RDF)を共有しつつ、応用範囲(閉じた構造化ログドメイン対 オープンなWeb由来の実体)が対照的である。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 3 Data Models and Query Languages]] "Graph-Like Data Models", [[知識グラフ]]) ## 未解決の問い - Cypher・SPARQL・Datalogは表現力の面でどこまで等価か。本章は3言語を並列に紹介するが、相互変換不可能なクエリのクラスは存在するか。 - GQL(2024年ISO標準)は今後どの程度グラフDB間の言語統一を実現するか。Cypher・GraphQLとの共存/置き換え関係はどうなるか。 - LogKG・SynthoDiagのようなAIOps知識グラフは、実装上トリプルストア/RDFの標準ツール(Apache Jena等)を使っているのか、それとも独自の中間表現を持つのか——本wikiのAIOps系ソースには明記がなく、DDIA側の一般モデルとの実装レベルでの対応関係は未検証。 ## 関連 - ソース: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 3 Data Models and Query Languages]] - 実体: [[Neo4j]] - 概念: [[知識グラフ]] / [[リレーショナル対ドキュメントモデル]] ## 出典 - [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 3 Data Models and Query Languages]]("Graph-Like Data Models", "Property Graphs", "The Cypher Query Language", "Graph Queries in SQL", "Triple Stores and SPARQL", "Datalog: Recursive Relational Queries", "GraphQL")