頂点ラベル・スキーマの作成

頂点ラベル・データベース・スキーマの作成

データモデル」で説明されているように、頂点ラベルには、作成される頂点のタイプごとの頂点IDおよび関連するプロパティ・キーを定義します。プロパティ・キーは、頂点ラベルの作成で使用する前に作成する必要がありますcreate()を使用して頂点ラベル・スキーマを作成するか、add()を使用してプロパティ・キーを既存のスキーマに追加することができます。特定の存続時間(TTL)値を使用して頂点ラベルを作成するか、ifNotExists()を使用して頂点ラベルが以前に存在していたかどうかをチェックすることができます。

頂点ラベルの重要なコンポーネントは、特定の頂点ラベルをもつ頂点が保存されるデータの局所性を識別する頂点IDです。ユーザー定義の頂点ID(UDV ID)は、RDBMSのプライマリ・キーに類似しており、Apache CassandraTMのDataStaxのディストリビューション内のグラフの基になるデータ表現に直接マップされます。UDV IDは、頂点ラベルのpartitionKeyclusteringKeyを定義する一意のプロパティ・キーを識別します。UDV IDに関連付けられた値は、頂点がパーティション分割されるDSEクラスター内のノード(partitionKey)、および関連付けられたテーブルにデータが格納される順序(clusteringKey)を定義します。

UDV IDは、頂点IDの3つの異なる配置を使用して定義できます。
単一キー:partitionKey内の1つのプロパティで構成されます
頂点ラベルのすべてのインスタンスを個別のDSEパーティションにマップし、DSE分散手法に基づいてDSEクラスター全体にデータを分散します。
複数キー:partitionKey内の複数のプロパティで構成されます
特定の頂点ラベルおよび関連するプロパティを個別のDSEパーティションにマップしますが、一意性を識別するために複数のプロパティ・キーが含まれています。
複合キー:partitionKeyclusteringKeyで構成されます
パーティション内のデータをグループ化するために、特定の頂点のラベルを個別のDSEパーティションにマップするpartitionKeyと、1つまたは複数のclusteringKeysの両方が含まれています。
注意: UDV IDは、グラフ内でグローバルに一意でなければならないことに注意してください。
自動生成される頂点IDも存在しますが、推奨されません。partitionKeyまたはclusteringKeyが指定されていない場合、2つの内部プロパティに値(partitionKeyにcommunity_id、clusteringKeyにmember_id)を割り当てる自動生成の頂点IDが作成されます。すべての頂点に一意のIDが作成されるため、誤ってプロパティ値が同じ要素が重複して作成され、混乱を招く可能性があります。
注: DSE 6.0では、自動生成される頂点IDは廃止されました。

キャッシングはクエリー・パフォーマンスを向上させることができ、構成が可能です。DSE Graphのキャッシュには、隣接リスト・キャッシュとインデックス/プロパティ・キャッシュの2種類があります。エッジまたはプロパティのどちらかをキャッシングするには、cache()オプションをvertexLabel()と一緒に使用します。キャッシングはすべてのエッジ、すべてのプロパティ、またはエッジのフィルター済みセットに対して構成できます。頂点は直接キャッシングできません。ただし、頂点間の関係を定義するキャッシング・プロパティおよびエッジが、実質的に同じ操作を実行します。キャッシングは、静的な値に使用するのが最適です。

インデックスが存在し、クエリーの過程で使用されている場合、プロパティ・キャッシングは有効です。フル・グラフ・スキャン・クエリーはキャッシングされません。インデックスが存在しない場合、キャッシングは発生しません。エッジについてキャッシングが構成されている場合、隣接リスト・キャッシングは有効です。

キャッシュはノードにローカルであり、データはクエリーで読み取られたときにキャッシュに読み込まれます。両方のキャッシュはデフォルト・サイズの128 MBにdse.yaml ファイルで設定されています。設定はadjacency_cache_size_in_mbおよびindex_cache_size_in_mbです。両方のキャッシュは、Least Recently Used(LRU)キャッシュとして実装されているオフヒープ・メモリーを利用します。

グラフ・キャッシュはクラスターの各ノード内でのみ使用されるため、キャッシュされたデータはノード間で異なる場合があります。このため、クエリーでは、あるノードではキャッシュを使用できても、別のノードでは使用できないことがあります。キャッシュはデータが見つからない場合にのみ更新されます。グラフ・キャッシングには、破棄の方法がありません。フラッシュは発生しません。さらに、要素が削除または変更されても、キャッシュは更新されません。キャッシュは、要素についてキャッシュが構成されたときに設定されるTime To Live(TTL)値のみに基づいてデータを排除します。データが古くなることを回避するために、頻繁に変化する要素(プロパティ・キー頂点ラベルエッジ・ラベル)には低いTTL値を設定します。

キャッシングは、同じ情報が後のクエリーで必要となった場合に、より効率的にクエリーを実行するためのものです。たとえば、meal_item頂点のcaloriesプロパティのキャッシングを行うと、all meal items with a calorie count less than 850 caloriesを要求するクエリーの取得が改善されます。ただし、グラフ・データはほとんど変更されず、クエリーは同じソート順序で実行されます。上記のクエリーのcaloriesをキャッシングしても、クエリーがall recipes with a calorie count greater than 850 caloriesを要求した場合、クエリーのレイテンシーは短縮されません。

DSE Graphでは、グラフごとに入力できる頂点ラベル数は200までです。

dse.yaml

dse.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/dse.yaml
tarボール・インストール installation_location/resources/dse/conf/dse.yaml

始める前に

プロパティ・キー・スキーマの作成

手順

ユーザー定義の頂点ID
  1. 単一キー頂点IDがsensorIdの頂点ラベルを作成します。頂点ラベルの作成で使用する前に、プロパティ・キーsensorIdが存在することが必要で、複数のカーディナリティ・プロパティにすることはできません。
    schema.vertexLabel('FridgeSensor').partitionKey('sensorId').create()
    この頂点IDは、各FridgeSensorの一意のsensorIdの値に基づいてデータを格納し、DSEクラスター全体に分散します。
  2. 複合キー頂点IDがcityIdで、クラスター化キーがsensorIdの頂点ラベルを作成します。
    schema.vertexLabel('FridgeSensor').partitionKey('cityId').clusteringKey('sensorId').create()
    この例の頂点IDは、特定のcityIdを持つFridgeSensorsのすべてのデータを同じパーティションに格納しますが、データをsensorIdの順に並べます。市に多数のセンサーがある場合、これらの頂点を格納するテーブルのサイズが非常に大きくなる可能性があります。
  3. cityIdsensorIdをパーティション分割キーの一部として使用して、複数キー頂点IDを持つ頂点ラベルを作成します。
    schema.vertexLabel('FridgeSensor').partitionKey('cityId', 'sensorId').create()
    この頂点IDは、クラスター内のデータを分散する前に両方のプロパティ・キーをハッシュするため、各キーはより多くの情報に基づいて一意に格納されます。
自動生成される頂点ID
  1. partitionKeyまたはclusteringKeyが指定されていない場合、データの作成時に、自動生成される頂点IDが生成されます。
    schema.vertexLabel('anAutoId').create()
    
    頂点IDは、ラベルと2つの属性(community_idおよびmember_id)で構成されます。
    {~label=anAutoId, community_id=1270013568, member_id=0}
プロパティ・キーと頂点ラベルの関連付け
  1. プロパティは、create()またはadd()ステートメントで定義できます。
    schema.vertexLabel('book').partitionKey('bookId').create()
    schema.vertexLabel('book').properties('name','publishYear','ISBN','bookDiscount').add()
    または
    schema.vertexLabel('book').partitionKey('bookId').properties('publishYear', 'ISBN', 'name', 'bookDiscount').create()
キャッシング
  1. person頂点のすべてのプロパティを最大1時間(3600秒)キャッシュします。
    schema.vertexLabel('person').cache().properties().ttl(3600).add()

    プロパティ・キャッシュを有効にすると、インデックス・クエリーでは、指定された頂点ラベルのインデックス・キャッシュが使用されます。

  2. person頂点の内向きと外向きの両方のcreatedエッジを最大1分(60秒)間キャッシュします。
    schema.vertexLabel('person').cache().bothE('created').ttl(60).add()

ドキュメント全体で使用されるDSE QuickStartの例に使用される頂点ラベル:
// ********
// VERTEX LABELS
// ********
// SYNTAX:
// schema.vertexLabel('vertexLabel').
//    [ partitionKey(propertyKey, [ partitionKey(propertyKey) ]) ].
//    [ clusteringKey(propertyKey) ].
//    [ ttl ].
//    [ properties(property, property) ].
//    [ index ].
//    [ cache() ].
//    [ ifNotExists() ].
//    [ create() | add() | describe() | exists() ]
// ********

// SINGLE-KEY VERTEX ID
schema.vertexLabel('person').partitionKey('personId').create()
schema.vertexLabel('person').properties('name','nickname','gender','calGoal','macroGoal','country').add()
schema.vertexLabel('book').partitionKey('bookId').create()
schema.vertexLabel('book').properties('name','publishYear','ISBN','bookDiscount').add()
schema.vertexLabel('meal_item').partitionKey('itemId').create()
schema.vertexLabel('meal_item').properties('name','servAmt', 'macro', 'calories').add()
schema.vertexLabel('ingredient').partitionKey('ingredId').create()
schema.vertexLabel('ingredient').properties('name').add()
schema.vertexLabel('home').partitionKey('homeId').create()
schema.vertexLabel('home').properties('name','address').add()
schema.vertexLabel('store').partitionKey('storeId').create()
schema.vertexLabel('store').properties('name','address').add()
schema.vertexLabel('location').partitionKey('locId').create()
schema.vertexLabel('location').properties('name', 'geoPoint').add()
schema.vertexLabel('recipe').partitionKey('recipeId').create()
schema.vertexLabel('recipe').properties('name','cuisine', 'instructions','notes').add()
// MULTIPLE-KEY VERTEX ID
schema.vertexLabel('meal').partitionKey('type', 'mealId').create()
// COMPOSITE KEY VERTEX ID
schema.vertexLabel('fridgeSensor').partitionKey('stateId', 'cityId').clusteringKey('sensorId').create()
schema.vertexLabel('fridgeSensor').properties('name').add()