NeoTechnology が 数年にわたって開発 を続けてきた Neo4j の バージョン 1.0 がリリースされた。Neo4j は プロパティグラフ (property graph) データモデルを指向する Java ベースの グラフデータベース (graph database) である。InfoQ では NeoTechnology の COO である Peter Neubauer 氏に,今回の Neo4J リリースの詳細と,開発者に提供される内容について話を聞いた。
Neo4j カーネル JAR ファイル のサイズは約440kである。オープンソース AGPLv3 ライセンスと商用ライセンス付バージョンがどちらも使用できるが,クローズドソースソフトウェアで使用する場合 には商用ライセンスが必須となる。Neo4j の内部では,情報は3つの基本構造ブロックを使って表現されている。
- Node (別名 vertex) - 概念的にはオブジェクトのインスタンスと類似したもので,ユニークな ID を持っている。
- Relationship (別名 edge) - 2つの
Node
を結合するリンクであり,方向と RelationshipType を持つ。 - Property (別名 attribute) - Node と Relationship 両方に設定可能な,文字列キー/オブジェクト値のペアである。
グラフデータベースはリレーショナルデータベースと比較して,複雑に相互接続され,頻繁に更新・検索される大量の非構造的データをうまく扱うことができる,という特徴がある。リレーショナルモデルでは,このようなクエリには大量の Table Join が必要になり,パフォーマンス上の問題を起こしやすい。Neubauer 氏はさらに詳しく説明する。
Neo4j は,通常の RDBMS では多量の Join を引き起こすような,オーバークエリによるパフォーマンス低下の問題に対処します。データをグラフでモデリングしているため,グラフを構成するデータ量に関係なく,同じ速度で Node や Edge を走査することができるのです。これによって通常の RDBMS セットアップでは実現不可能な,高速グラフアルゴリズムや推薦システム(recommender system),OLAP 分析などを可能にします。
Neo4j はデータベースなので,各グラフ構造体へのアクセス - 読み込み,書き込み,トラバーサル - は ACID トランザクションシステムが管理している。グラフのトラバーサルは Traverser API を通じて処理される。また,Lucene との統合による インデックス処理もサポート されている。さらに Solr との統合についても 開発中 である。NeoTechnology の CEO である Emil Eifrem 氏が Neo4j をさらに詳細に紹介した プレゼンテーション や,Peter Naubauer 氏の インタビュー も公開されている。
NoSQL 運動における自身の立場について聞かれたとき,Neubauer 氏は次のように返答している。
RDBMS ではうまく扱えない問題に取り組んでいる,という意味では,確かに私たちは NoSQL 運動の一員であるとは思います。ですが私たちの第1の目標はデータの複雑性,深いクエリと分析 - RDBMS ではたくさんの join と空きの多いテーブルが必要になります- であり,そして2番目がスケーラビリティと sharding type,すなわち多くの NoSQL プロジェクトが目指している問題を共有することなのです。
Neubauer 氏によれば,Neo4j は 1.0 のリリースこそ最近だが,いくつかの分野では7年間にわたって製品開発に使用されていて,今回のリリースにはコードの安定よりも API が固定されたことを示す意図があるということだ。Neo4j のパフォーマンスについても説明があった。Neo4j はコードの最適化なしで数十億のオブジェクトからなるグラフを取り扱う能力がある。さらに通常で毎秒約200万の relationship の読み込みと最短パス計算が可能であり,MySQL のようなリレーショナルデータベースよりもよくスケールする,ということだ (ただし他のすべてのパフォーマンスベンチマークと同じように,使用するハードウェアやデータセットなどの要素によって結果は大きく異なる)。
Neo4j には,その中心である Neo4j コードベース以外にも,コントリビュータとユーザによる コミュニティ があり,巨大なエコシステムが形成されている。そこには次のようなものがある。
- エクステンション - jo4neo (Java Object for Neo),Gremlin (グラフを操作するプログラム言語),REST/JSON インターフェース
- フレームワークとの統合 - Grails,Griffon,Django,Spring など
- 言語バインディング - JRuby,Python,Scala,PHP,Clojure など
Neo4j の将来計画に対する期待のため,資金調達状況 は良好だ。これが今後の開発作業,例えば既存のマスタ/スレーブレプリケーションの拡張開発,シームレスな高可用性に加え,結果整合性(eventual consistency) と write-master re-election を実現するオンラインバックアップサポート,全般的な操作性の向上,完全な REST サポート (動的 JavaScript ベースのトラバーサルとデータ公開時の read-only モードを含む),などを進める上で力になっている。長期計画には sharding のサポートが含まれている。これは Neo4j コードベースにとって新たな挑戦となるものだ。また Emil Eifrem 氏は,数百に及ぶ Neo4J プロジェクトを生み出したユーザや開発者たちと,彼らの形成するコミュニティの急速な成長が重要である,と指摘している。