Azure Cosmos DB for Apache Gremlin とは

適用対象: Gremlin

Azure Cosmos DB は、最新のアプリ開発に対応するフル マネージドの NoSQL とリレーショナル データベースです。

Azure Cosmos DB for Apache Gremlin は、何十億もの頂点と辺のある大規模なグラフを格納するために使用できるグラフ データベース サービスです。 ミリ秒の待機時間でグラフを照会したり、グラフ構造を簡単に改善したりできます。 Gremlin 用 API は、Gremlin クエリ言語を使用するグラフ コンピューティング フレームワークである Apache TinkerPop に基づいて構築されています。

重要

Azure Cosmos DB グラフ エンジンは、Apache TinkerPop の仕様に厳密に従っています。 ただし、Azure Cosmos DB に固有の実装の詳細には、いくつかの相違点があります。 Apache TinkerPop によってサポートされている機能の中に Azure Cosmos DB で使用できないものがあります。サポートされない機能の詳細については、Apache TinkerPop との互換性に関する記事を参照してください。

Gremlin 用 API では、グラフ データベース アルゴリズムの機能を非常にスケーラブルなマネージド インフラストラクチャと結合します。 このアプローチによって、柔軟性のない制約やリレーショナル制約に関連した一般的なデータの問題に対する、一意で柔軟な解決策が提供されます。

ヒント

コミットメントなしで Gremlin 用 API をお試しいただけます。 無料で Azure Cosmos DB を試すを使用して Azure Cosmos DB アカウントを作成します。

Gremlin 用 API の利点

Gremlin 用 API には、次のような、Azure Cosmos DB がベースになっていることの付加価値があります。

  • 弾力的にスケール可能なスループットとストレージ: 実際のグラフは、1 つのサーバーの容量を超えてスケールする必要があります。 Azure Cosmos DB では、ストレージとプロビジョニングされたスループットの観点で無制限のサイズを持つことができる、水平方向にスケーラブルなグラフ データベースがサポートされています。 グラフ データベースのスケールが大きくなるにつれて、データはグラフのパーティション分割を使用して自動的に分散されます。

  • 複数リージョンのレプリケーション: Azure Cosmos DB では、世界中の任意の Azure リージョンにグラフ データを自動的にレプリケートできます。 グローバル レプリケーションを使用すると、データへのグローバル アクセスを必要とするアプリケーションの開発を簡素化できます。 Azure Cosmos DB は、世界中の任意の場所で読み取りと書き込みの待機時間を最小化するだけでなく、サービスマネージドのリージョン内フェールオーバー メカニズムを提供します。 このメカニズムにより、リージョンでサービスが中断するまれなケースにおいて、アプリケーションの継続性を確保できます。

  • 最も広く採用されているグラフ クエリ標準を使用した高速なクエリとトラバーサル: 異種の頂点と辺を格納し、使い慣れた Gremlin 構文を使用してこれらのクエリを実行します。 Gremlin は、一般的なグラフ アルゴリズムを実装するために豊富なインターフェイスを提供する命令型で関数型のクエリ言語です。 Gremlin 用 API では、スキーマのヒント、セカンダリ インデックス、またはビューを指定しなくても、豊富なリアルタイム クエリとトラバーサルが可能です。 詳細については、Gremlin を使用してグラフに対してクエリを実行する方法に関するページを参照してください。

  • フル マネージドのグラフ データベース: Azure Cosmos DB を使用すると、データベースやコンピューター リソースを管理する手間がかかりません。 ほとんどの既存のグラフ データベース プラットフォームは、そのインフラストラクチャの制限事項に縛られ、多くの場合、その運用を確実に行うために高度なメンテナンスが必要になります。 フル マネージド サービスとして、Cosmos DB では、仮想マシンの管理、ランタイム ソフトウェアの更新、シャーディングやレプリケーションの管理、複雑なデータ層のアップグレードの操作を行う必要がなくなります。 すべてのグラフが自動的にバックアップされ、リージョンの障害から保護されます。 この管理により、開発者はグラフ データベースの運用と管理ではなく、アプリケーションの価値を実現することに専念できます。

  • インデックスの自動作成: Gremlin 用 API では、グラフのノード (頂点とも呼ばれます) や辺内のすべてのプロパティのインデックスが既定で自動的に作成されるため、スキーマや、セカンダリ インデックスの作成は不要です。 詳細については、Azure Cosmos DB のインデックス作成に関するページを参照してください。

  • Apache TinkerPop との互換性: Gremlin 用 API では、オープン ソースの Apache TinkerPop 標準がサポートされています。 Apache TinkerPop 標準には、API と簡単に統合できるアプリケーションおよびライブラリの豊富なエコシステムがあります。

  • 調整可能な整合性レベル: Azure Cosmos DB では、ご利用のアプリケーションに対する整合性とパフォーマンスの間の最適なトレードオフを実現するために、適切に定義された 5 つの整合性レベルが提供されます。 Azure Cosmos DB では、クエリと読み取り操作に関して、強固、有界整合性制約、セッション、一貫性のあるプレフィックス、最終的の 5 種類の整合性レベルを提供します。 明確に定義されたきめ細かな整合性レベルにより、整合性、可用性、待機時間の適切なトレードオフを行うことができます。 詳細については、「Azure Cosmos DB の調整可能なデータの一貫性レベル」をご覧ください。

Gremlin 用 API の一般的なシナリオ

Azure Cosmos DB のグラフ サポートが役立つ場合があるいくつかのシナリオを以下に示します。

  • ソーシャル ネットワーク/Customer 365: 顧客に関するデータと顧客による他のユーザーとのやり取りに関するデータを組み合わせることで、パーソナライズされたエクスペリエンスを開発したり、顧客の行動を予測したりできます。また、ユーザーを同じような興味を持つ他のユーザーと結び付けることもできます。 Azure Cosmos DB を使用して、ソーシャル ネットワークを管理し、顧客の嗜好やデータを追跡できます。

  • レコメンデーション エンジン: このシナリオは、小売業界で一般的に使用されます。 製品、ユーザー、ユーザー インタラクション (商品の購入、閲覧、評価など) に関する情報を組み合わせることで、カスタマイズされたレコメンデーションを構築できます。 低待機時間、エラスティック スケール、グラフのネイティブ サポートを実現する Azure Cosmos DB は、これらのシナリオに最適です。

  • 地理空間: 通信、物流、旅行プランニングの各分野の多くのアプリケーションでは、エリア内で対象となる場所を見つけたり、2 つの場所間の最短ルートや最適ルートを見つけたりする必要があります。 Azure Cosmos DB はこれらの問題に自然に適合します。

  • モノのインターネット (IoT): ネットワークと、グラフとしてモデル化された IoT デバイス間の接続により、デバイスと資産の状態について理解を深めることができます。 さらに、ネットワークのある部分の変更が別の部分に及ぼす可能性のある影響についても学習できます。

グラフ データベースの概要

実世界で出現するデータは、自然に結び付けられています。 従来のデータ モデリングでは、エンティティを個別に定義して、実行時にそれらのリレーションシップを計算することに焦点が当てられています。 このモデルにはその利点がありますが、緊密に接続されたデータをその制約の下で管理するのは困難な場合があります。

グラフ データベース アプローチは、代わりに、ストレージ層でリレーションシップを持続することに依存します。これで、グラフ取得の操作が非常に効率的になります。 Gremlin 用 API は、プロパティ グラフ モデルをサポートしています。

プロパティ グラフのオブジェクト

プロパティ グラフとは、頂点エッジで構成された構造です。 両方のオブジェクトで、プロパティとして任意の数のキーと値のペアを持つことができます。

  • 頂点/ノード: 頂点は、ユーザー、場所、イベントなどの個々のエンティティを表します。

  • 辺/関係: 辺は、頂点間の関係を表します。 たとえば、あるユーザーについて、別のユーザーと知り合いである、あるイベントに関わっている、ある場所に最近行ったことがある、などの可能性を表します。

  • プロパティ: プロパティは頂点と辺に関する情報 (またはメタデータ) を表します。 頂点または辺のいずれかに任意の数のプロパティが存在する可能性があり、それらをクエリ内のオブジェクトの記述やフィルター処理に使用できます。 プロパティの例には、名前と年齢を持つ頂点、タイムスタンプや重みを持つことができる辺などがあります。

  • ラベル - ラベルは、頂点や辺の名前 (識別子) です。 ラベルを使用すると、グループ内のすべての頂点または辺に特定のラベルを指定して、複数の頂点または辺をグループ化できます。 たとえば、グラフには "person" というラベルの複数の頂点が存在する可能性があります。

グラフ データベースは、スキーマまたは制約付きデータ モデルへの依存関係がないため、多くの場合、NoSQL または非リレーショナル データベース カテゴリ内に含まれています。 このようにスキーマが無いことにより、接続されている構造体を自然かつ効率的にモデリングして格納できます。

グラフ データベースの例

サンプル グラフを使用して、Gremlin でクエリを表現する方法を理解しましょう。 次の図は、ユーザー、関心事、デバイスに関するデータを管理するビジネス アプリケーションをグラフの形で示しています。

ユーザー、デバイス、関心事を示すサンプルのプロパティ グラフ。

このグラフには、次の頂点の種類が含まれています。 これらの種類は、Gremlin ではラベルとも呼ばれます。

  • People: グラフには、Robin、Thomas、Ben の 3 人のユーザーが含まれています。

  • Interests: 各ユーザーの関心事。この例では、フットボールの試合などです。

  • Devices: ユーザーが使用しているデバイスです。

  • Operating Systems: デバイスが実行されているオペレーティング システムです。

  • 場所: デバイスにアクセスする場所。

次の "" の種類によって、これらのエンティティの関係を表します。

  • Knows: 親しさを表します。 例: "Thomas は Robin を知っている"

  • Interested: このグラフの各ユーザーの関心事を表します。 例: "Ben はフットボールに関心がある"

  • RunsOS: デバイスでどの OS が実行されているかを表します。 例: "ノート PC では Windows OS を実行している"

  • Uses: ユーザーが使用しているデバイスを表します。 例: "Robin はシリアル番号が 77 の Motorola Phone を使用している"

  • Located: デバイスにアクセスする場所を表します。

Gremlin コンソールは Apache TinkerPop が提供する対話型ターミナルで、このターミナルを使用してグラフ データを操作します。 詳細については、Gremlin コンソールのクイックスタートを参照してください。 これらの操作は、任意のプラットフォーム (Java、Node.js、Python、または .NET) で Gremlin ドライバーを使用して実行することもできます。 次の例は、Gremlin コンソールを使用して、このグラフ データに対してクエリを実行する方法を示しています。

作成、読み取り、更新、削除 (CRUD) から見ていきましょう。 次の Gremlin ステートメントでは、Thomas という "頂点" をグラフに挿入し、いくつかのプロパティを指定します。

g.addV('person').
  property('id', 'thomas.1').
  property('firstName', 'Thomas').
  property('lastName', 'Andersen').
  property('age', 44)

ヒント

これらの例に基づいている場合は、グラフの作成時にこれらのプロパティ (agefirstNamelastName) のいずれかをパーティション キーとして使用できます。 id プロパティはグラフのパーティション キーとして使用できません。

次の Gremlin ステートメントでは、ThomasRobin の間に "knows" 辺を挿入します。

g.V('thomas.1').
  addE('knows').
  to(g.V('robin.1'))

次のクエリは、ユーザーの姓の降順で person の頂点を返します。

g.V().
  hasLabel('person').
  order().
  by('firstName', decr)

グラフが強調表示されている場合、"Thomas の友人が使用しているオペレーティング システムは何か" というような質問に答える必要があります。 次の Gremlin トラバーサルを実行することで、グラフからこの情報を取得できます。

g.V('thomas.1').
  out('knows').
  out('uses').
  out('runsos').
  group().
  by('name').
  by(count())

次のステップ