RDBの世界をぬりかえていく
モデルグラフデータベース
RDBの世界をぬりかえていく
モデルグラフデータベース
世界は「関係」でできています。世界は、バラバラな実体の寄せ集めではなく相互補完的な情報(モデル)とそれらのつながり(グラフ)で構成されているのです。
従来、社会で必要とされるシステムの多くがRDBを用いて実装されてきました。テーブル定義のためにER図を描いたり、モデル指向で開発するためにORマッパー(ORM)を使ったりしてきたことでしょう。
でも、それはもう過去の話です。
truncus graphとは
特徴
truncus graph はプロパティグラフの概念を拡張したグラフデータベースです。 ノードは、「ドメインモデル」という型を持った「 情報の束」として扱われます。 その情報の束が、やはり付加情報を持つリレーションによって有機的につながることで、「関係の網」による潜在的な情報を持つようになります。 潜在的情報としては、たとえばレコメンデーションや不正検知といった要件において求められる情報が挙げられます。 truncus graph はそのような価値ある情報をより素早く取り出すことを可能にします。
ドメインモデルとリレーション
ドメインモデルは、システムの扱う対象領域(ドメイン)において、 処理の対象となる物や事を「型」として表現した抽象的な構造のことです。 truncus graph では、グラフのノードがドメインモデルという構造を持ちます。 これにより、ノードは単なるプロパティの集合ではなく、実世界の構造を反映させたものにすることが可能となります。 また、ノード間に張られるリレーションにも同様に型(すなわち構造)を導入できます。 これらの構造を適切に定義することで、必要な情報に対してより簡単に、より速くアクセスできるようになります。
モデルとインスタンスのシームレスな接続
モデルとリレーションによって世界(対象領域)を表現し操作しようとすると、それらの実体(インスタンス)を扱う必要が生じます。 しかし、アプリケーション開発者は、インスタンスの永続化やモデルとの間のインピーダンスミスマッチといったことを意識したくはないでしょう。 truncus graph は、プロキシ機構を用いてモデルやリレーションとそのインスタンスをシームレスに接続し、実装上の細部を隠蔽しています。 モデルそのものを操作する感覚でアプリケーションを構築できる。そのような開発体験を truncus graph はサポートします。
クラスタ構成とデータ同期
truncus graph は、複数サーバのクラスタ構成で運用することにより負荷分散と可用性の向上を図ることができます。 クラスタは一つのマスタと複数のレプリカで構成され、あるサーバでデータストアに永続化されたオブジェクトは、マスタを介して他の全てのレプリカに同期されます。 頻繁に参照されるオブジェクトはメモリ上のキャッシュに乗りますが、ストアでのデータ同期が生じるとその変更内容は直ちにキャッシュにも反映されます。 また、オブジェクトを細かい単位に分割して管理する独自機構により、キャッシュ効率を向上させています。
truncus graphの主な機能
DomainModelインタフェース
ドメインモデルの中心となるのは、DomainModel.Entity
と DomainModel.Value
です。
これらは、truncus graph が提供する Java インタフェースです。
Entity
は、識別子によって個々のインスタンスが識別されるようなオブジェクトのためのインタフェースであり、
Value
は、内容が同じであれば同値とみなされるようなオブジェクトのためのインタフェースです。
@DomainModelMarker.Entity
public interface Supplier extends DomainModel.Entity {
@DomainModelMarker.Attribute(index = true)
DomainModel.Attribute<String> supplierNumber();
@DomainModelMarker.Attribute(index = true)
DomainModel.Attribute<String> name();
@DomainModelMarker.Relation
RelationHolder<Product> supplies();
}
利用者によるドメインモデル定義
実際のアプリケーションを構築するのに必要なドメインモデルは、 Entity
や Value
から派生したインタフェースとして利用者が定義します。
モデルが保有する属性は、その interface
内に @DomainModelMarker.Attribute
という アノテーションを付与した抽象アクセサとして記述します。
@DomainModelMarker.Entity
public interface Person extends Entity {
// @DomainModelMarker.Attributeによって、
// 属性として登録されるようになる
@DomainModelMarker.Attribute(required = true)
Attribute<String> name();
// ……
}
YAMLによるモデル定義
Java インタフェースによって定義されたモデルは、truncus graph の内部では 「スキーマ」という構造に変換されます。 このスキーマ(すなわちモデル)は YAML によって定義することもできます。 これと REST API によるモデル操作を組み合わせれば、TypeScript で記述したクライアント側だけでアプリケーションを作成することも可能です。
# Person のモデル定義
Person:
category: ENTITY
label: 人
attributes:
name: string
relations:
friend: Person
label: 友人
multiple: true
……
ライフタイム管理とプロキシによる透過アクセス
利用者が意識するのはドメインモデルインタフェースだけです。 モデルのインスタンスオブジェクトは、その生成や永続化、キャッシュといった ライフタイムが truncus graph によって管理されます。 また、インタフェースとインスタンスオブジェクトとの間には、それらを仲介するプロキシ機構が備わっており、 インタフェースに記述した抽象アクセサを呼び出すことで その属性値の取り出しが行えます。 この仕組みにより、truncus graph では、ドメインモデルと永続化された オブジェクトの間のインピーダンスミスマッチが生じません。
@DomainModelMarker.Entity
public interface Supplier extends DomainModel.Entity {
@DomainModelMarker.Attribute(index = true)
DomainModel.Attribute<String> supplierNumber();
@DomainModelMarker.Attribute(index = true)
DomainModel.Attribute<String> name();
@DomainModelMarker.Relation
RelationHolder<Product> supplies();
}
リレーション定義とプロパティグラフ
ドメインモデル間のリレーションは、Relation<EntityType>
というジェネリクス型で定義します。
EntityType
にはリレーションの終点側のエンティティの型を指定し、
リレーション自体は始点側のエンティティに記述します。 なお、リレーション自体にも属性を持たせることができます。
つまり、truncus graph は実質的にプロパティグラフをサポートしているわけです。
@DomainModelMarker.Entity
public interface Person extends Entity {
// ……
// @DomainModelMarker.Relationによって、
// 関連として登録されるようになる
@DomainModelMarker.Relation
Relation<Person> parent();
グラフ検索
エンティティオブジェクトが保持しているリレーションを直接たどって、 関連するオブジェクトを検索するAPIが用意されています。 検索条件には、エンティティやリレーションの属性を指定することもできます。
// GraphFinder の生成
var finder = StandardGraphFinder.of(…);
// 起点エンティティの取得
var start = _getEntity(…);
// 検索条件の構築
var condition = GraphQuery.Condition.of(…);
// 検索の実行
var target = finder.findEntityVertex(start, condition);
グラフインデックス
truncus graphは、 グラフ検索に特化した「グラフインデックス」も保持しています。 これはエンティティオブジェクトとそのリレーションから自動的に構築されます。 グラフインデックスを利用して、より柔軟な検索、たとえば関連先の オブジェクトから関連元オブジェクトを検索する「逆関連」の 検索を実行するAPIもあります。
// グラフインデックスを用いるグラフ操作オブジェクト
GraphDatabase graph = ……;
// 関連の更新:(src: SimpleSource) - [to] -> (target: SimpleTarget)
_update(graph, "to", "object:src", "object:target");
// 逆関連の検索 (target に対して "to" という関連の関連元を検索する)
var result = graph.findReverseRelations(
GraphId.of("to"),NodeId.of("object:taraget"));
Cypher対応
Cypher による基本的なクエリをサポートしています。これはREST APIとして公開することもできるので、 外部クライアントからのCypherクエリが簡単に行えるようになります。
MATCH(s:Supplier{supplierNumber:'S001'})-[:supplies]->[p:Product]
RETURN s.supplierName, p.productName
truncus graph の適用
グラフ概念で使うリレーショナルデータベースとグラフデータベース
グラフ概念で意味付けされている複雑な世界の情報の網は、その視点で リレーショナルデータベース や グラフデータベース に情報格納する必要があります。 ハードの成熟度に合わせ リレーショナルデータベース から グラフデータベース にシフトしていき、ハイブリッドなデータベース構成を実現していきます。
マスターデータマネジメント
企業の情報システムの多様化によりマスタデータの管理が複雑になっています。 一貫したマスタデータを管理するには名寄せ、統合、展開、追跡が必要です。 グラフデータを利用すると様々な繋がりから本来同一であるべきマスタデータを特定し、 一貫したマスタデータを維持できます。
様々な構成要素と追跡
グラフデータはツリー型やネットワーク型などの様々な構成を表現することができます。 複数の構成を組み合わせることで高度な追跡を行うことも可能です。 グラフデータはこのような用途で高いレスポンス性能を発揮します。
サプライチェーン強化
自社のビジネス活動とサプライヤーの情報をグラフデータとして接続することで、 複雑なサプライヤーネットワークをディープリンク分析によって適切に管理し、 サプライヤー需要、クレーム管理、BCP(Business Continuity Plan)などを リアルタイムに把握し、連携強化することができます。
不正利用検知
グラフデータを利用したディープリンク分析、リアルタイム分析による不正検知、 さらに機械学習により不正検知を強化することができます。 デジタルの広がりによって高まる不正行為のリスクに有効です。
エンタープライズレコメンデーション
グラフデータを利用したグラフ分析、ディープリンク分析と組み合わせることで パーソナライズされた精度の高いレコメンドが得られます。 これによって物流の経路提案、エンジニアリングの設計提案、調達の最適購買など活用の幅は広がっていきます。
検索強化
高速検索、データの可視化・分析によるシステム監視・セキュリティ対策を強化できるように Lucene基盤のElastic searchと容易に連携できるように設計されています。
CDC(Change Data Capture)
複数のデータベースやアプリケーションを最新データと常に同期させることにより、 企業が複数の目的にデータを活用できるようします。 そうすることで、組織がデータの整合性を維持しながらデータの価値を最大化することができます。
如何なるシステム規模にも対応
truncus graph の関係モデルからのCRUD機能を軸としたあらゆる特徴は、 システム規模の大小を問わず効力を発揮します。大小のシステムが、リーズナブルにつながり合い、 クラウドエコシステムを容易に実現させていくことが、truncusの責務です。