Amazon Web Services ブログ

Cloud Directory の更新 – Typed Links のサポート

今年始めに公開したブログ「Cloud Directory – 階層データの AWS クラウドネイティブディレクトリ (Cloud Directory, our cloud-native directory for hierarchical data)」では、厳密に型指定された入力の階層データを大量保存できるように設計された方法について説明しました。Cloud Directory は何百万というオブジェクトを保存するようにスケールできるので、様々なクラウドアプリケーションやモバイルアプリケーションに最適です。最初のブログ投稿では、どのようにして各ディレクトリに 1 つ以上のスキーマがあるか、そしてそれにより 1 つまたはそれ以上のファセットがあるかについて説明しました。各ファセットは、オブジェクトの必須の属性および許容される属性の一連を定義します。

Typed Links の概要
本日より、Typed Links のサポートを追加することで Cloud Directory モデルの表記枠を拡大しました。次のリンクを使用して複数の階層に渡りオブジェクトとオブジェクトの関係を作成できます。ディレクトリにある複数のタイプのリンクをそれぞれ定義することができます (各リンクの種類はディレクトリと関連付けているスキーマ 1 つの個別ファセットです)。タイプの他に、各リンクには一連の属性を与えることができます。Typed Links は、他のオブジェクトと関係する既存のオブジェクトを不注意に削除しないようにすることで、参照データの整合性を維持する上で役立ちます。たとえばロケーション、ファクトリー、フロア番号、ルーム、マシン、センサーなどのディレクトリがあるとします。こうした情報はそれぞれ階層内で豊富なメタデータ情報を含む Cloud Directory のディメンションとして表示することが可能です。Typed Links を定義し使用することで、様々な方法でオブジェクトを連携させたり、メンテナンス要件に繋がる Typed Links の作成、サービス記録、保証、安全情報などをリンクの属性を使用してソースオブジェクトと対象オブジェクト間の関係の追加情報を保存できます。そしてリンクタイプや属性の値をベースにクエリを実行することができます。たとえば、過去 45 日以内に消去されていないすべてのセンサーや、保証期間が過ぎたモーターをすべて探すことができます。指定されたフロアにあるすべてのセンサーを探したり、指定されたタイプのセンサーがあるフロアすべてを探すことができます。

Typed Links を使用する
Typed Links を使用するには、1 つ以上の Typed Link ファセットをスキーマに追加します。追加するには CreateTypedLinkFacet関数を呼び出します。次に AttachTypedLink を呼び出し、ソースオブジェクトと対象オブジェクト、Typed Link ファセット、そのリンクの属性を受け渡します。その他の便利な機能として GetTypedLinkFacetInformationListIncomingTypedLinks、および ListOutgoingTypedLinks があります。詳細や機能一覧を確認するには「Cloud Directory API リファレンス (Cloud Directory API Reference)」をご覧ください。オブジェクトと同様に、属性ルールを使用して属性値を制御できます。文字列の長さやバイト配列を制御したり、特定の一連の値への文字列を制限、特定範囲の数字に上限を指定することもできます。私の同僚が Typed Links の使用法を表したいくつかのサンプルコードを共有してくれました。ARN とファセット名はこちらです。

String appliedSchemaArn   = "arn:aws:clouddirectory:eu-west-2:XXXXXXXXXXXX:directory/AbF4qXxa80WSsLRiYhDB-Jo/schema/demo_organization/1.0";
String directoryArn       = "arn:aws:clouddirectory:eu-west-2:XXXXXXXXXXXX:directory/AbF4qXxa80WSsLRiYhDB-Jo";
String typedLinkFacetName = "FloorSensorAssociation";

最初のスニペットが Typed Link ファセットを作成します。 FloorSensorAssociation LABEL=[NAME] によって sensor_typemaintenance_date 属性、といった順番になります (属性名と値はリンクのアイデンティティの一部なので順番を無視することはできません)。

client.createTypedLinkFacet(new CreateTypedLinkFacetRequest()
                                .withSchemaArn(appliedSchemaArn)
                                .withFacet(
                                      new TypedLinkFacet()
                                          .withName(typedLinkFacetName)
                                          .withAttributes(toTypedLinkAttributeDefinition("sensor_type"),
                                                          toTypedLinkAttributeDefinition("maintenance_date"))
                                          .withIdentityAttributeOrder("sensor_type", "maintenance_date")));

private TypedLinkAttributeDefinition toTypedLinkAttributeDefinition(String attributeName) {
 return new TypedLinkAttributeDefinition().withName(attributeName)
 .withRequiredBehavior(RequiredAttributeBehavior.REQUIRED_ALWAYS)
 .withType(FacetAttributeType.STRING);
}

次のスニペットは 2 つのオブジェクト間にリンクを作成します (sourceFloortargetSensor)、 sensor_type watermaintenance_date 2017-05-24:

AttachTypedLinkResult result = 
    client.attachTypedLink(new AttachTypedLinkRequest()
                               .withDirectoryArn(directoryArn)
                               .withTypedLinkFacet(
                                   toTypedLinkFacet(appliedSchemaArn, typedLinkFacetName))
                                   .withAttributes(
                                        attributeNameAndStringValue("sensor_type", "water"),
                                        attributeNameAndStringValue("maintenance_date", "2017-05-24"))
                                   .withSourceObjectReference(sourceFloor)
                                   .withTargetObjectReference(targetSensor));

private TypedLinkSchemaAndFacetName toTypedLinkFacet(String appliedSchemaArn, String typedLinkFacetName) {
   return new TypedLinkSchemaAndFacetName()
              .withTypedLinkName(typedLinkFacetName)
              .withSchemaArn(appliedSchemaArn);
}

最後のスニペットは sensor_type watermaintenance_date2017-05-20 から 2017-05-24 の範囲で受信した Typed Link すべてを列挙します。

client.listIncomingTypedLinks(
    new ListIncomingTypedLinksRequest()
        .withFilterTypedLink(toTypedLinkFacet(appliedSchemaArn, typedLinkFacetName))
        .withDirectoryArn(directoryArn)
        .withObjectReference(targetSensor)
        .withMaxResults(10)
        .withFilterAttributeRanges(attributeRange("sensor_type", exactRange("water")),
                                   attributeRange("maintenance_date", 
                                                  range("2017-05-20", "2017-05-24"))));

private TypedLinkAttributeRange attributeRange(String attributeName, TypedAttributeValueRange range) {
   return new TypedLinkAttributeRange().withAttributeName(attributeName).withRange(range);
}

private TypedAttributeValueRange exactRange(String value) {
   return range(value, value);
}

詳細については「オブジェクトとリンク (Objects and Links)」を「Cloud Directory 管理ガイド (Cloud Directory Administration Guide)」でご覧ください。

今すぐ利用可能
Typed Links は今すぐご利用いただけます。

Jeff;