プロパティグラフ(Neo4j / AuraDB他)の概要を知る:グラフデータベース
グラフデータベース ― Neo4jによるグラフデータモデルとグラフデータベース入門
- Ian Robinson (著), Jim Webber (著), Emil Eifrem (著), 佐藤 直生 (監訳), 木下 哲也 (翻訳)
- 発売日:2015/3/25
今でも特別な要件が無い限りデータベース選択の第一候補はRDB(関係データベース)になることが多いと思います。
しかし、多様なプログラミング言語があるように、多様なデータベースがあり、オープンソースあるいはクラウド時代になって、より幅広く利用されるようになりました。(よく NoSQL とひとくくりにされてしまいますけど。)
今回はそのなかでもグラフデータベースの本を取り上げます。
この本のタイトルは『グラフデータベース』となっていますが、グラフデータベースに関する一般論というよりは、サブタイトルの通り『Neo4j によるグラフデータモデルとグラフデータベース入門』といった内容です。
Neo4j は意外に歴史のあるオープンソースのデータベースですが、最近特によく目にするようになりました。(最近では Neo4j のフルマネージドなクラウドサービスである AuraDB も利用できるようになってます。)
- Wikipedia: Neo4j
- Neo4j Graph Data Platform | Graph Database Management System
- Fully Managed Graph Database Service | Neo4j AuraDB
さて、グラフデータベースのモデルにもいろいろありますが、Neo4j のデータモデルはプロパティグラフです。
プロパティグラフとは、本書では以下の特徴を備えたものと説明されています。
- プロパティグラフはノード、関係、プロパティで構成される。
- ノードはプロパティを持つ。ノードを、任意のキー/値ペアの形式でプロパティを格納するドキュメントと考える。キーは文字列であり、値は任意のデータ型になる。
- 関係は、ノードをつないで構造化する。関係には必ず方向、ラベル、開始ノード、終了ノードがあり、ダングリング(宙ぶらりんの)関係はない。関係の方向とラベルは、ノードの構造を意味的にはっきりさせる。
- ノードと同様に、関係もプロパティを持つことができる。関係にプロパティを追加できる機能は、グラフアルゴリズムへの追加メタデータの提供、関係への意味(質や重みなど)の追加、実行時のクエリの制約に特に役立つ。
このように書くと少々難しそうな雰囲気ですが、グラフを図的に考えると(原理そのものは)非常に直感的で分かりやすいものです。
実際、本書の冒頭に以下のように書かれています。
- 本書の大部分ではグラフデータモデルについて話をしますが、グラフ理論に関する書籍ではありません。グラフデータベースを活用するために、理論はあまり必要ありません。実質的にグラフが何かを理解していれば良いのです。
ちなみにプロパティグラフを扱うデータベースとしては Amazon Neptune 他もあります。
このような状況は、RDB では表現し難いような領域にもアプリ化が進んでいるように思えます。
この本は比較的薄くて読みやすく、グラフデータベース(主にNeo4j / Aura)が得意とするユースケースを始め、プロパティグラフ関連技術の全体像を把握するには良い本だと思います。
<本の内容>
【目次】
- 1章 はじめに
- 1.1 グラフとは何か
- 1.2 グラフ領域の概要
- 1.3 グラフデータベースの能力
- 1.4 まとめ
- 2章 つながりのあるデータを格納するための選択肢
- 2.1 リレーショナルデータベースには関係が欠如している
- 2.2 NoSQLデータベースにも関係が欠如している
- 2.3 グラフデータベースは関係を包含する
- 2.4 まとめ
- 3章 グラフでのデータモデリング
- 3.1 モデルと目的
- 3.2 プロパティグラフモデル
- 3.3 グラフのクエリ:Cypher入門
- 3.4 リレーショナルモデリングとグラフモデリングの比較
- 3.5 クロスドメインモデル
- 3.6 一般的なモデリングの落とし穴
- 3.7 アンチパターンの回避
- 3.8 まとめ
- 4章 グラフデータベースアプリケーションの構築
- 4.1 データモデリング
- 4.2 アプリケーションアーキテクチャ
- 4.3 テスト
- 4.4 キャパシティプランニング
- 4.5 まとめ
- 5章 実世界のグラフ
- 5.1 グラフデータベースを選ぶ理由
- 5.2 一般的なユースケース
- 5.3 実世界の例
- 5.4 まとめ
- 6章 グラフデータベースの内部
- 6.1 ネイティブグラフ処理
- 6.2 ネイティブグラフストレージ
- 6.3 プログラミングAPI
- 6.4 非機能的な特徴
- 6.5 まとめ
- 7章 グラフ理論を使った予測分析
- 7.1 深さ優先探索と幅優先探索
- 7.2 ダイクストラ法での経路探索
- 7.3 A*アルゴリズム
- 7.4 グラフ理論と予測モデリング
- 7.5 ローカルブリッジ
- 7.6 まとめ
- 付録A NoSQLの概要
- A.1 NoSQLの台頭
- A.2 ACIDとBASEの対比
- A.3 NoSQLの4象限
- A.4 キーバリューストア
- A.5 カラムファミリー
- A.6 集約ストアでのクエリと処理の比較
- A.7 グラフデータベース
- 付録B Neo4j以外のグラフデータベース
- B.1 商用のグラフデータベース
- B.2 オープンソースのグラフデータベース
- B.3 その他のグラフデータベース
- B.4 Titanのインストールと使用方法
- B.5 TinkerPop
目次だけ見ると、かなり技術的な詳細に入り込んでいるように見えますが、個々に深い説明があるわけではありません。むしろ、グラフデータベースのモデルから実装や適用事例まで幅広く概観しているため、全体像を把握するには丁度良い感じだと思います。
なお付録Bは日本語版のみ収録されている内容のようです。
<感想>
私はセマンティックウェブが流行ったころに RDF / OWL をかじったこともあり、グラフデータベースに興味はありましたが、トリプル以外のグラフ表現にはほぼ興味が無かったため、Neo4j の名前は知っていてもスルーしてました(涙)。
しかし最近グラフデータベースの利用を検討していたところ、Neo4j のことを思い出して一応調べておこうと思って手に取ったのがこの本です。
この本でプロパティグラフを知って最初に思ったことは、RDBを使ったことがある方に是非読んでいただきたいな、ということでした。
まず、プロパティグラフは RDB にとても近いと感じます。
(ノードとプロパティは RDB のレコードそのもの、そして RDB のテーブル間を join 演算で結合するのではなく、レコードにあたるノード間をリレーションで直接リンクする、といった感じです。)
面白いのはリレーションにもプロパティを持てることで、これは RDB で多対多の関係を表す中間テーブルを作るケースをスッキリ表現できるように見えます。(そう簡単ではない場合も多いと思いますが。)
何となく、プロパティグラフは RDB をご存知の方には理解しやすく、さらに RDB で少し痛いところを救ってくれるように見えます。
RDBでモデリングしていると、どうもスッキリ表現できないな、ということがありますが、この本ではリレーショナルデータベースの表現例とプロパティグラフの表現例を比較することで、プロパティグラフだとシンプルに表現できる場合があることを、理由とともに例示しています。
- 本書には「皮肉にも、リレーショナルデータベースは関係を扱うのが下手なのです」とまで書いてます(笑)。
RDB では表現が難しいものをグラフならシンプルに表現できる、というのはセマンティックウェブ技術を初めて知った時の感動?を思い出して、何だか懐かしかったです(笑)。
この本にはグラフデータベースが得意なユースケースの例示もあって、とても参考になるのですが、この本の内容だけ読むと RDB を使うのが悪のように思えてしまいます。。。
その意味で、この本の少々残念なところを書いておくと、グラフデータベースが不得意なところが殆ど書かれていないところでしょうか。
プロパティグラフと RDB(と他のNoSQL)との対比でプロパティグラフの優位性を示すなら、プロパティグラフが不得意なところも明示して欲しいところです。
(プロパティグラフも銀の弾丸ではないと思うし、RDB が専門好の方が読むと、RDB を批判しているように読める可能性がある気がしました。)
もっとも、この本をグラフデータベースの一般書ではなく、プロパティグラフ製品のチラシのように考えれば、不利な点は書かないものかもしれません(その意味でもサブタイトルをタイトルにしたほうがよいように思えます)。
ところで RDB がここまで普及した理由を考えると、(様々な要因があるとは思いますが)個人的には SQL 標準の存在が大きいと考えています。
Neo4j のクエリ言語は Cypher で SQL標準のようなものではないと思っていましたが、(私は詳しく調べていませんが)案外そうでもないようで、openCypher や ISO / GQL(Graph Query Language)で標準化が進んでいるようです。
- openCypher
- Graph Query Language GQL
私はこの本で初めて Cypher を知りましたが、Cypher は、あると便利な機能がうまく詰め込まれた、とても実用的でうまく設計されたクエリ言語だと思います。
私の場合はプロパティグラフに興味を持ったというより、Cypher に興味を持ったといえるくらいです。
本書でも Cypher の簡単な解説と利用例が書かれていますが、もし興味を持たれたらネット上のマニュアルを読んでみることをお勧めしたいです。
- Cypher Query Language - Developer Guides
さて、この本でプロパティグラフや Cypher の面白さを知ると、実際にプログラムから使いたくなるところですが、残念ながら各種プログラミング言語を利用した実装までは書かれていませんので、製品サイト(例えば Neo4j)で各種言語用ドライバーを参照する必要があります。
また、本書の内容の問題ではありませんが、個人的に残念なのは、RDB や NoSQL との比較は書かれているのに、RDF / OWL のトリプルとの比較は無く、ほぼスルーされていることです。(流派の違いなんでしょうか。。。)
このあたりについては、いつか本ブログで書いてみたいと思ってます。
長々と書きましたが、この本はプロパティグラフデータベースの利点、使いどころや勘どころをコンパクトに知ることができる良い本だと思います。
関連記事
- クエリのような API に入門する:初めてのGraphQL
- 安全な委譲の仕組みを理解する(OAuth徹底入門)
- アジャイルに一貫したモデリングから実装を維持する方法を知る本(エリック・エヴァンスのドメイン駆動設計)
- REA パターンとオントロジー(ビジネスパターンによるモデル駆動設計)
- 百科事典のようなAI技術の包括的な教科書(エージェントアプローチ 人工知能/AIMA:Artificial Intelligence: A Modern Approach)
- Pythonでオントロジー指向プログラミング(Ontologies with Python: Programming OWL 2.0 Ontologies with Python and Owlready2)
- RDF, OWLの面白さを知る本(Semantic Web for the Working Ontologist)
コメント
コメントを投稿