グラフ型データベースNeo4jの入門書執筆に参加しました

Neo4jロゴ

こんにちは、佐藤です。私事ですが、Neo4jというグラフ型データベースの入門書執筆にユーザグループの一員として参加しました。良い機会ですのでSendGridとの関連はありませんが、本記事ではneo4jについて紹介したいと思います。

Neo4jとは

Neo4jとはNeo Technology社が提供するグラフ型データベースです。リレーショナルデータベース(RDB)がこれまで考慮できていなかった問題への解として、近年、キーバリュー型、列指向型、ドキュメント型、グラフ型など様々なタイプのデータベースが開発・利用されています。Neo4jはこの中のグラフ型に分類される製品です。

グラフ型データベースとは

グラフ型データベースとは、データを「ノード」と「リレーションシップ」といった要素で構成されるグラフモデルで表現するデータベースのことを指します。Neo4jが採用するプロパティ付き有向グラフでは、次のようにデータを表現します。

E電グラフ

この例では、山手線と東京から中野までの中央線の各駅をデータ化しています。ノード(駅)は円、リレーションシップ(路線)は2ノード間を結ぶ線で表現します。リレーションシップには方向性があります。また、ノードとリレーションシップはそれぞれキーと値のペアから構成されるプロパティを持つことができます。

Neo4jの特徴

  • データ表現
    RDBではデータをテーブル、列、行などで表現しますが、Neo4jではグラフモデルで表現します。また、RDBでは多対多のレコード間の関連をテーブルで表現して、SQLのJOINを利用して関連するデータを取得しますが、Neo4jでは、データ間の関連をリレーションシップという形で表現してたどっていくことができます。このため、複雑なネットワーク構成を持つデータを直感的に表現したり、高速かつシンプルに取り扱うことができます。
  • サイファークエリ(Cypher Query)
    Neo4jはデータベースを操作するのに「サイファークエリ」という宣言型のクエリ言語をサポートしています。サイファークエリはSQLライクな形式となっており、強力かつ多彩なデータ表現を行うことができます。例えば、上述の例で東京から中野までの中央線の各駅と路線データを取得するサイファークエリは次の通りです。
    MATCH (ss:STATION {name:"東京"})-[r:中央線 *]->(sf:STATION {name:"中野"}) RETURN ss,r,sf
    
  • ACID特性
    Neo4jはRDBと同様のACID特性を持ちます。このため、トランザクションを利用してデータベースへの複数の変更をまとめて処理(コミット、ロールバック)することができます。
  • REST API
    Neo4jはREST APIをサポートしています。REST APIではトランザクション機能も利用できるため、アプリケーションの実行環境に依存せず様々な環境からデータベースを利用できます。
  • WebベースのDB管理ツール
    Neo4jはWebベースのDB管理ツールを標準で提供しています。サイファークエリの発行と実行結果および実行計画の確認などを行うことができます。

さいごに

いかがだったでしょうか?RDBとはだいぶ様相が異なりますが、テーブルで表現するのに違和感のあるデータに出くわしたり、JOINが多すぎるSQLが辛い、もしくはJOINの回数が不確定のクエリと戦わなくてはいけない場面で、選択肢の1つとして思い出していただけると幸いです。詳しくは書籍でもご紹介していますので是非ご覧ください。

参考