さて、ここからはNeo4jの実際の操作を見ていきましょう。
Neo4jはNeo Technologyが開発するグラフデータベースで、有償のエンタープライズ版の他に無償のコミュニティ版が用意されています。特徴はデータベースエンジンをグラフデータベースとしての用途に特化しているところです。トランザクションの一貫性を(即時ではありませんが)保証する点も、他のNoSQL(の一部)とは異なるところでしょう。Neo4jのクエリ言語は「Cypher」と呼ばれます。Cypherは、直接実行だけでなく、Neo4jのREST APIを介しても実行できるようになっています。一般的な開発言語や開発フレームワークにも対応しています。
前述の通り、グラフデータベースは「ノード」「リレーション」「プロパティ」の3要素によってノード間の「関係性」を表現するデータモデルを前提としています。こう聞くと仕組みが難しそうですが、実際にはどのような方法で操作するのでしょうか?
鈴木氏は「サッカーの試合」を例に、グラフデータベースでのデータの扱い方を説明してくれました。
ここでは下の図で示すようなデータモデルを前提にしています。
「試合(Match)」というデータノードから「マンチェスターユナイテッド(Man Utd)」と「アーセナル(Aesenal)」という二つのデータノードが伸びており、それぞれ関係性は「ホームチーム」と「アウェーチーム」として表せます。
○で囲んだオブジェクトが「ノード」です。試合(「Match」)から伸びる関係性としての「home_team」「away_team」があり、その先のノードが各チームになっています。ここでは、Matchの「プロパティ」に試合結果が含まれています。この図の場合、Matchのプロパティには、マンチェスターユナイテッドから見た場合のホームゲームとアウェーゲームの値が格納されています。
Neo4jのクエリ言語Cypherで「アーセナル」というチーム名を作成するときは、次のような構文を用います。
CREATE (arsenal:Team{name: "Arsenal"})
ノードの間を結ぶ「関連性」を作成するには下のような構文を用います。
CREATE (game)-[:away_team]->(arsenal)
こうして作成されたデータベースから「アーセナルがアウェーで行った試合」を抽出したいときは、以下のような構文で問い合わせを行います。
MATCH (team:Team)<-[:away_team]-(game) WHERE team.name = "Aesenal" RETUN game
ここでは、あくまでも参考例として簡単な操作方法を示しました。操作例を見ると分かるように、データモデルは複雑そうですが、クエリやノードの作成などの扱いが人間の思考に近く、素直に記述できます。慣れれば使いやすそうですね。
Cypherの扱い方については、Neo4jのドキュメントに詳細が示されていますので、興味がある方は深掘りして試してみるとよいでしょう。
グラフデータベースは、今後「エンジニア数が増えれば」あるいは「一般の開発者にとって扱いやすくなれば」一気に普及してくるかもしれません。今までデータモデルが複雑過ぎて処理できなかったシステムを一気に簡略化して構築できる可能性がありますから、期待が高まります。
Copyright © ITmedia, Inc. All Rights Reserved.