技術要素を選定する際の指針となる Solution stack (a.k.a. Software stack) のうち、Graph Database である Neo4j を用いたものに、GRANDstack が提唱されています。
この記事では、GRANDstack について簡単な紹介を行います。
そもそも Solution stack とは、お互い相性の良い複数のミドルウェアや技術要素を組み合わせたものです。新しいアプリケーションを設計する際の技術選定の指針の一つとして利用されます。また、マーケティング要素も含む場合もあるでしょう。
有名な Solution stack として、以下について聞いたことがある方もいることでしょう。
GRANDstack も Solution stack のうちの一つとして提唱されたものです。
技術要素としては、以下で構成されています。
GRANDstack の特長としては、バックエンドとクエリ言語がグラフベースのデータモデリングに適している という点に尽きるでしょう。
言い換えると、グラフベースのデータモデリングが適したアプリケーション、例えば SNS やナレッジグラフ、マスターデータ管理やヘルスケア、レコメンデーションシステムを実装する場合に高い開発効率とパフォーマンスを発揮することができます。
まず、グラフベースでデータモデリングをしているという点において、開発者のデータモデルに対する認知負荷を減らすことができます。Impedance mismatch と呼ばれるものです。
本来グラフで表現すると自然に理解することのできるデータを、実装の都合上無理やりリレーショナル・データベースの世界で考えようとする時、余分な認知コストがかかり、バグが生まれやすくなり、ソフトウェアの品質が下がる傾向にあります。
フロント側からバックエンドサーバーにクエリをする際には GraphQL を、ディスクにデータを保存するときにはグラフネイティブな Neo4j Graph Database を用いることによって、一貫したデータモデリングを利用することができます。
また、グラフアルゴリズムを適用した問い合わせロジックも、往々にして高いパフォーマンスを発揮することでしょう。
GraphQL サーバーを書いているとき、複数のバックエンドシステムやマイクロサービスから並列でデータを問い合わせる場合、N+1 問題 をいかに避けるか、というのは典型的なハードルです。
N+1 問題を効率的に解決するためのライブラリや実装手法も発展してきていますが、データベースがそもそもリレーショナル・データベースであった場合、BFS/DFS などのグラフアルゴリズムを適用した問い合わせクエリは、往々にして複雑になり、処理速度も頭打ちになることが多いでしょう。
GRANDstack を実現するためのキラーコンテンツが、@neo4j/graphql です。
@neo4j/graphql は、Neo4j によって開発されている JavaScript ライブラリです。GraphQL 実装に対しては agnostic なので、Apollo 以外のフレームワークでも利用できます。
特長は、GraphQL の型定義を Neo4j のプロパティに、GraphQL の Query と Mutation を Neo4j のクエリ言語である Cypher に変換 してくれる点です。
言い換えると、開発者は GraphQL のリゾルバー関数を一つ一つ自分でかく必要がありません。これは大きな開発効率の向上につながるはずです。
最近の開発状況としては、2021/04 に最初の安定版 v1.0.0 がリリース されました。その後、2021/08 には v2.0.0 がリリース されました。今後の開発アップデートからも目が離せません。
以上、GRANDstack の概要について紹介しました。GRANDstack の特長、および GRANDstack を支える技術としての @neo4j/graphql についても紹介しました。