頂点ラベル・スキーマの作成
頂点ラベル・データベース・スキーマの作成
「データモデル」で説明されているように、頂点ラベルには、作成される頂点のタイプごとの頂点IDおよび関連するプロパティ・キーを定義します。プロパティ・キーは、頂点ラベルの作成で使用する前に作成する必要があります。create()
を使用して頂点ラベル・スキーマを作成するか、add()
を使用してプロパティ・キーを既存のスキーマに追加することができます。特定の存続時間(TTL)値を使用して頂点ラベルを作成するか、ifNotExists()
を使用して頂点ラベルが以前に存在していたかどうかをチェックすることができます。
頂点ラベルの重要なコンポーネントは、特定の頂点ラベルをもつ頂点が保存されるデータの局所性を識別する頂点IDです。ユーザー定義の頂点ID(UDV ID)は、RDBMSのプライマリ・キーに類似しており、Apache CassandraTMのDataStaxのディストリビューション内のグラフの基になるデータ表現に直接マップされます。UDV IDは、頂点ラベルのpartitionKey
とclusteringKey
を定義する一意のプロパティ・キーを識別します。UDV IDに関連付けられた値は、頂点がパーティション分割されるDSEクラスター内のノード(partitionKey
)、および関連付けられたテーブルにデータが格納される順序(clusteringKey
)を定義します。
- 単一キー:
partitionKey
内の1つのプロパティで構成されます - 頂点ラベルのすべてのインスタンスを個別のDSEパーティションにマップし、DSE分散手法に基づいてDSEクラスター全体にデータを分散します。
- 複数キー:
partitionKey
内の複数のプロパティで構成されます - 特定の頂点ラベルおよび関連するプロパティを個別のDSEパーティションにマップしますが、一意性を識別するために複数のプロパティ・キーが含まれています。
- 複合キー:
partitionKey
とclusteringKey
で構成されます - パーティション内のデータをグループ化するために、特定の頂点のラベルを個別のDSEパーティションにマップする
partitionKey
と、1つまたは複数のclusteringKeys
の両方が含まれています。
community_id
、clusteringKeyにmember_id
)を割り当てる自動生成の頂点IDが作成されます。すべての頂点に一意の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が
sensorId
の頂点ラベルを作成します。頂点ラベルの作成で使用する前に、プロパティ・キーsensorId
が存在することが必要で、複数のカーディナリティ・プロパティにすることはできません。
この頂点IDは、各schema.vertexLabel('FridgeSensor').partitionKey('sensorId').create()
FridgeSensor
の一意のsensorId
の値に基づいてデータを格納し、DSEクラスター全体に分散します。 -
複合キー頂点IDが
cityId
で、クラスター化キーがsensorId
の頂点ラベルを作成します。
この例の頂点IDは、特定のschema.vertexLabel('FridgeSensor').partitionKey('cityId').clusteringKey('sensorId').create()
cityId
を持つFridgeSensors
のすべてのデータを同じパーティションに格納しますが、データをsensorId
の順に並べます。市に多数のセンサーがある場合、これらの頂点を格納するテーブルのサイズが非常に大きくなる可能性があります。 -
cityId
とsensorId
をパーティション分割キーの一部として使用して、複数キー頂点IDを持つ頂点ラベルを作成します。
この頂点IDは、クラスター内のデータを分散する前に両方のプロパティ・キーをハッシュするため、各キーはより多くの情報に基づいて一意に格納されます。schema.vertexLabel('FridgeSensor').partitionKey('cityId', 'sensorId').create()
-
partitionKeyまたはclusteringKeyが指定されていない場合、データの作成時に、自動生成される頂点IDが生成されます。
schema.vertexLabel('anAutoId').create()
頂点IDは、ラベルと2つの属性(community_id
およびmember_id
)で構成されます。{~label=anAutoId, community_id=1270013568, member_id=0}
-
プロパティは、
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()
-
person
頂点のすべてのプロパティを最大1時間(3600秒)キャッシュします。schema.vertexLabel('person').cache().properties().ttl(3600).add()
プロパティ・キャッシュを有効にすると、インデックス・クエリーでは、指定された頂点ラベルのインデックス・キャッシュが使用されます。
-
person
頂点の内向きと外向きの両方のcreated
エッジを最大1分(60秒)間キャッシュします。schema.vertexLabel('person').cache().bothE('created').ttl(60).add()
例
// ********
// 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()