Studioを使用したグラフ・スキーマの作成

DataStax StudioおよびGroovyを使用したグラフ・データベース・スキーマの作成。

グラフ・データベースのデータ・モデルの作成は、スキーマを作成するための重要な最初のステップです。データ・モデルを設計し、グラフを作成した後、グラフ・データベースの作成における次のステップは、頂点および辺ならびにそのプロパティのスキーマの定義です。Gremlin-Groovyを使用し、DataStax Studioのセルにスクリプトを入力します。

始める前に

Studioを使用し、グラフを作成します。

手順

  1. 任意。以前作成したグラフを再利用する場合は、グラフ・スキーマおよびデータを削除します。
  2. 大きなスクリプトを実行する場合は、timeout値をmaxに設定します。スクリプト処理を必ず完了するには、この設定を使用します。このステップは、Studioで完了できません。
    gremlin> :remote config timeout max
  3. 下の「例」に表示されている「レシピ・スキーマ」を、DataStax Studioの1つのセルにコピー&ペーストします。すべてのスクリプトを入力した後、セルを実行します。Studioは、Gremlin Serverにコマンドを送信します。
    注:各コマンドはセルごとに1つのセッションで送信されるため、Gremlin Serverは、前の行に設定された変数については認識しません。「レシピ・スキーマ」の行がセルに個別に入力される場合は、辺作成コマンドでエラーが発生します。
  4. 以下の各ステップでは、スクリプト全体をセクションごとに分けて詳細を説明します。
  5. 頂点および辺のプロパティを定義します。キー名に加えて、プロパティのデータ型を指定します。この例で作成するすべてのプロパティは、Text、Integers、またはTimestampsです。その他のデータ型も使用できます。プロパティは、グラフの選択的サブセットの取得または格納値の取得に使用します。プロパティは本来グローバルであり、頂点ラベルおよびプロパティのペアは、探索で使用するプロパティを一意に識別します。辺プロパティを更新するときに辺全体がすべてのプロパティとともに削除および再利用されるため、辺プロパティは、更新の負荷が高くなります。辺プロパティは、その使用が必要な場合にのみ使用してください。
    // プロパティ・キー 
    // ifNotExists()を使用して、作成済みのプロパティ・キーがあるかどうかを確認します。 
    schema.propertyKey('name').Text().ifNotExists().create() 
    schema.propertyKey('gender').Text().create()
    schema.propertyKey('instructions').Text().create()
    schema.propertyKey('category').Text().create()
    schema.propertyKey('year').Int().create()
    schema.propertyKey('timestamp').Timestamp().create()
    schema.propertyKey('ISBN').Text().create()
    schema.propertyKey('calories').Int().create()
    schema.propertyKey('amount').Text().create()
    schema.propertyKey('stars').Int().create()
    schema.propertyKey('comment').Text().single().create() // single()はオプション(デフォルト)です
    // 複数プロパティの例
    // schema.propertyKey('nickname').Text().multiple().create();
    // プロパティに追加されるメタプロパティの例: 
    // schema.propertyKey('livedIn').Text().create()
    // schema.propertyKey('country').Text().multiple().properties('livedIn').create()

    ifNotExists()を使用して、プロパティ・キーがすでに存在しているかどうかをチェックできます。プロパティ・キーは、single()またはmultiple()により、1つまたは複数のカーディナリティを使用して作成できます。デフォルトは、1つのカーディナリティで、指定は省略できます。しかし、例に示したように明示的にも指定できます。

    メタプロパティ、またはプロパティのプロパティは、propertyKey()properties()の順に使用して作成できます。メタプロパティを作成するには、プロパティ・キーが存在していることが必要です。メタプロパティをネストすることはできません。すなわち、メタプロパティにメタプロパティを含めることはできません。この例で、countryは、メタプロパティlivedInを含むプロパティです。このプロパティおよびメタプロパティは、author(作成者)が生涯のさまざまな期間に住んでいた国を表すために使用されます。
    {
    "name":"Julia Child",
    "gender":"F",
    [ {"country":"United States", "livedIn":"1929-1949" }, {"country":"France", "livedIn":"1949-1952" } ], 
    "authored":[{
    "book":{
    "label":"book",
    "bookTitle":"Art of French Cooking Volume One",
    "publishDate":1968
        },
    "book":{
    "label":"book",
    "bookTitle":"The French Chef Cookbook",
    "publishDate":1968,
    "ISBN":"0-394-40135-2"
        }     
      }],
    "created": [{
        
    "type":"recipe",
    "recipeTitle" :"BeefBourguignon",
    "instructions" :"Braise the beef.",
    "createDate":1967
        },
        { 
    "type":"recipe",
    "recipeTitle" :"Salade Nicoise",
    "instructions" :"Break the lettuce into pieces.",
    "createDate": 1970
        }
      ]
    }
  6. 頂点ラベルを定義します。頂点ラベルは、作成できる頂点の型を識別します。
    // 頂点ラベル
    schema.vertexLabel('author').ifNotExists().create()
    schema.vertexLabel('recipe').create()
    // プロパティを含む頂点ラベルの作成例
    // schema.vertexLabel('recipe').properties('name','instructions').create()
    schema.vertexLabel('ingredient').create()
    schema.vertexLabel('book').create()
    schema.vertexLabel('meal').create()
    schema.vertexLabel('reviewer').create()
    // カスタム頂点IDの例:
    // schema.propertyKey('city_id').Int().create()
    // schema.propertyKey('sensor_id').Uuid().create()
    // schema().vertexLabel('FridgeSensor').partitionKey('city_id').clusteringKey('sensor_id').create()

    ifNotExists()を使用すると、頂点ラベルが前に存在しているかをチェックできます。頂点ラベルは、プロパティとともに作成できます。頂点ラベルは、標準の頂点IDではなく、カスタム頂点IDとともに作成できます。

  7. 辺ラベルを定義します。辺ラベルは、作成できる辺のタイプを識別します。
    // 辺ラベル
    schema.edgeLabel('authored').ifNotExists().create()
    schema.edgeLabel('created').create()
    schema.edgeLabel('includes').create()
    schema.edgeLabel('includedIn').create()
    schema.edgeLabel('rated').connection('reviewer','recipe').create()

    ifNotExists()を使用すると、辺ラベルが前に存在しているかをチェックできます。辺ラベルは、connection()を使用して識別される隣接頂点ラベルとともに作成できます。

  8. クエリー処理を高速化できるインデックスを定義します。ここでは、インデックスのすべての型を示します。詳細については、グラフ・データのインデックス作成グラフ・データのインデックス作成を参照してください。
    // 頂点インデックス
    // 二次インデックス
    schema.vertexLabel('author').index('byName').secondary().by('name').add()
    // マテリアライズド・インデックス	  		
    schema.vertexLabel('recipe').index('byRecipe').materialized().by('name').add()
    schema.vertexLabel('meal').index('byMeal').materialized().by('name').add()
    schema.vertexLabel('ingredient').index('byIngredient').materialized().by('name').add()
    schema.vertexLabel('reviewer').index('byReviewer').materialized().by('name').add()
    // サーチ
    // schema.vertexLabel('recipe').index('search').search().by('instructions').asText().add()
    // schema.vertexLabel('recipe').index('search').search().by('instructions').asString().add()
    // 複数のプロパティ・キーにサーチ・インデックスが付いている場合
    // schema.vertexLabel('recipe').index('search').search().by('instructions').asText().by('category').asString().add()
    
    // 辺インデックス
    schema.vertexLabel('reviewer').index('ratedByStars').outE('rated').by('stars').add()
    
    // メタプロパティ'livedIn'を使用したプロパティ・インデックスの例: 
    // schema.vertexLabel('author').index('byLocation').property('country').by('livedIn').add()

    これらのインデックスは、食べ物の例のスキーマのデータ読み込みを効率化するために使用されています。

    注: create()add()との差異はごくわずかですが重要です。実体(頂点ラベルまたは辺ラベル)が作成されて既に存在するとき、インデックスまたはプロパティ・キーがその実体に関連付けられているのであれば、add()コマンドを使用します。たとえば、頂点ラベルおよびプロパティ・キーを作成(create)し、その後プロパティ・キーを頂点ラベルに追加(add)できます。
  9. グラフ・スキーマを作成した後、確認のためにそのスキーマを検証します。出力の一部を次に示します。
     schema.describe()

// レシピ・スキーマ

// Studioで実行する場合は、すべての行をセルにコピー&ペーストしてから実行します。

// Gremlin Consoleで実行する場合は、次の2行を使用します
// script = new File('/tmp/RecipeSchema.groovy').text; []
// :> @script
    	
// プロパティ・キー 
// ifNotExists()を使用して、作成済みのプロパティ・キーがあるかどうかを確認します。 
schema.propertyKey('name').Text().ifNotExists().create() 
schema.propertyKey('gender').Text().create()
schema.propertyKey('instructions').Text().create()
schema.propertyKey('category').Text().create()
schema.propertyKey('year').Int().create()
schema.propertyKey('timestamp').Timestamp().create()
schema.propertyKey('ISBN').Text().create()
schema.propertyKey('calories').Int().create()
schema.propertyKey('amount').Text().create()
schema.propertyKey('stars').Int().create()
schema.propertyKey('comment').Text().single().create() // single()はオプション(デフォルト)です
// 複数プロパティの例
// schema.propertyKey('nickname').Text().multiple().create();
// プロパティに追加されるメタプロパティの例: 
// schema.propertyKey('livedIn').Text().create()
// schema.propertyKey('country').Text().properties('livedIn').create()
    		
// 頂点ラベル
schema.vertexLabel('author').ifNotExists().create()
schema.vertexLabel('recipe').create()
// プロパティを含む頂点ラベルの作成例
// schema.vertexLabel('recipe').properties('name','instructions').create()
schema.vertexLabel('ingredient').create()
schema.vertexLabel('book').create()
schema.vertexLabel('meal').create()
schema.vertexLabel('reviewer').create()
// カスタム頂点IDの例:
// schema.propertyKey('city_id').Int().create()
// schema.propertyKey('sensor_id').Uuid().create()
// schema().vertexLabel('FridgeSensor').partitionKey('city_id').clusteringKey('sensor_id').create()
                
// 辺ラベル
schema.edgeLabel('authored').ifNotExists().create()
schema.edgeLabel('created').create()
schema.edgeLabel('includes').create()
schema.edgeLabel('includedIn').create()
schema.edgeLabel('rated').connection('reviewer','recipe').create()
                
// 頂点インデックス
// 二次インデックス
schema.vertexLabel('author').index('byName').secondary().by('name').add()
// マテリアライズド・インデックス	  		
schema.vertexLabel('recipe').index('byRecipe').materialized().by('name').add()
schema.vertexLabel('meal').index('byMeal').materialized().by('name').add()
schema.vertexLabel('ingredient').index('byIngredient').materialized().by('name').add()
schema.vertexLabel('reviewer').index('byReviewer').materialized().by('name').add()
// サーチ
// schema.vertexLabel('recipe').index('search').search().by('instructions').asText().add()
// schema.vertexLabel('recipe').index('search').search().by('instructions').asString().add()
// 複数のプロパティ・キーにサーチ・インデックスが付いている場合
// schema.vertexLabel('recipe').index('search').search().by('instructions').asText().by('category').asString().add()

// 辺インデックス
schema.vertexLabel('reviewer').index('ratedByStars').outE('rated').by('stars').add()

// メタプロパティ'livedIn'を使用したプロパティ・インデックスの例: 
// schema().vertexLabel('author').index('byLocation').property('country').by('livedIn').add()

// スキーマの説明
// スキーマが目的通りに構築されているかどうかをチェックするために使用します
schema.describe()