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

プロパティ・キー・スキーマの作成または追加

データモデル」で説明されているように、プロパティ・キーを使用すると、属性値を頂点またはエッジに割り当てることができます。properties()を使用してプロパティ・キーにプロパティキーをメタプロパティとして割り当てることもできます。プロパティ・キーは頂点またはエッジ・ラベルに割り当てる前に定義され、プロパティ・キーに基づいてインデックスを作成することができます。

プロパティは、グラフの選択的サブセットを取得し、格納された値を取得するために使用されます。プロパティの性質はグローバルであり、探索で使用するプロパティは、頂点ラベルとプロパティのペアによって一意に識別されます。エッジ・プロパティを更新することは不経済です。理由は、エッジ・プロパティを更新するためにエッジ全体とそのすべてのプロパティを削除し、再作成しなければならないからです。エッジ・プロパティは、それを使用する正当な理由がある場合にしか使用しないでください。

プロパティ・キーのカーディナリティは、デフォルトでは単一のカーディナリティですが、複数のカーディナリティを割り当てることができます。さらに、特定のTime-To-Live(TTL)値を使用してプロパティ・キーを作成できます。プロパティ・キーを作成する場合、キーが以前に存在していたかどうかをifNotExists()でチェックすることができます。

プロパティ・キーには、少なくともキー名とデータ型が割り当てられている必要があります。柔軟な形式のデータ・ストレージに対応するために、いくつかのデータ型が存在します。地理空間やCartesianなど、特別に注意が必要なものもあります。地理空間形状を使用して検索できるデータは、pointlinestringpolygonという、3つの地理空間データ型に格納されます。円またはポリゴン内の地理空間ポイント、ポイント、またはラインストリングを検索する大半の地理空間クエリーでは、DSE Searchインデックスも作成する必要があります。Cartesianデータ型の場合も同じです。

プロパティ・キー・スキーマは、create()で作成されます。DataStax Studio、またはDataStax EnterpriseとともにインストールされるGremlin Console(dse gremlin-console

を使用してプロパティ・キーを作成または変更できます。

始める前に

グラフを作成します

手順

単一および複数のカーディナリティ・プロパティ・キー
  1. 単一のカーディナリティ・プロパティ・キーを定義します。
    propertyKeyの名前はpersonIdです。Int()を使用してInteger型として定義し、単一のカーディナリティはsingle()を使用して明示的に指定します。
    schema.propertyKey('personId').Int().single().create()
    単一のカーディナリティがデフォルトであるため、single()は省略できます。
    schema.propertyKey('personId').Int().create()
    作成する前にプロパティ・キーが既に存在するかどうかを確認するには、ifNotExists()を使用します。
    schema.propertyKey('createDate').Date().single().ifNotExists().create()
  2. 複数のカーディナリティ・プロパティ・キーを定義します。
    propertyKeyの名前はnicknameです。Text()を使用して複数のカーディナリティを持つText型として定義します。
    schema.propertyKey('nickname').Text().multiple().create()
    複数のカーディナリティはデフォルトではないため、multiple()を含める必要があります。
メタプロパティ
  1. 単一のカーディナリティ・メタプロパティを複数のカーディナリティ・プロパティ・キーに定義します。最初にメタプロパティのプロパティ・キーを作成し、次にメタプロパティを持つプロパティ・キーを作成します。
    メタプロパティpropertyKeyの名前はsinceです。Int()を使用して単一のカーディナリティを持つInteger型として定義します。このメタプロパティを使用するpropertyKeyの名前はbadgeです。Text()を使用して複数のカーディナリティを持つText型として定義します。メタプロパティは、propertiesで定義します。
    // MULTIPLE CARDINALITY PROPERTY KEY WITH SINGLE CARDINALITY META-PROPERTY
    schema.propertyKey('since').Int().single().create() // meta-property
    schema.propertyKey('badge').Text().multiple().properties('since').create()
  2. 複数のカーディナリティでは、プロパティとメタプロパティの両方を定義できます。複数のカーディナリティ・メタプロパティを複数のカーディナリティ・プロパティ・キーに定義します。最初にメタプロパティのプロパティ・キーを作成し、次にメタプロパティを持つプロパティ・キーを作成します。
    メタプロパティpropertyKeyの名前はstartYearです。Int()を使用して複数のカーディナリティを持つInteger型として定義します。このメタプロパティを使用するpropertyKeyの名前はcountryです。Text()を使用して複数のカーディナリティを持つText型として定義します。メタプロパティは、propertiesで定義します。
    // MULTIPLE CARDINALITY PROPERTY KEY WITH MULTIPLE CARDINALITY META-PROPERTY
    schema.propertyKey('startYear').Int().multiple().create()   // meta-property
    schema.propertyKey('endYear').Int().multiple().create()   // meta-property
    schema.propertyKey('country').Text().multiple().properties('startYear','endYear').create()
    この例には、startYearendYearという2つのメタプロパティが含まれています。
Time-To-Live(TTL)を持つプロパティ・キー
  1. プロパティ・キーはTime-To-Live(TTL)値で定義できます。指定した時間に達すると、値はグラフから削除されます。TTLを持つ単一のカーディナリティ・プロパティ・キーを定義します。
    propertyKeyの名前はbookDiscountです。Text()Text型、単一のカーディナリティ(デフォルト)、およびttl()で604,800秒のTTLとして定義します。
    // PROPERTY KEY WITH TTL
    schema.propertyKey('bookDiscount').Text().ttl(604800).create()
地理空間プロパティ・キー
  1. pointプロパティ・キーのスキーマを作成します。
    schema.propertyKey('point').Point().withGeoBounds().create()
    注: 地理空間要素では、withGeoBounds()メソッドによって緯度が-90度から+90度まで(南極から北極まで)のデフォルトの有効範囲と経度が-180度から+180度まで(グリニッジ子午線の東から西まで)の有効範囲に検索が制限されます。ポイントの指定にはGeo.point(longitude, latitude)が使用され、ポイントを追加するときにWellKnownText(WKT)形式で行われます。経度緯度の順に指定されることに注意してください。
  2. linestringプロパティ・キーのスキーマを作成します。
    schema.propertyKey('line').Linestring().withGeoBounds().create()
    ポイントに適用されたのと同じ範囲制限がラインストリングにも適用されます。
  3. polygonプロパティ・キーのスキーマを作成します。
    schema.propertyKey('polygon').Polygon().withGeoBounds().create()
    ポイントに適用されたのと同じ範囲制限がポリゴンにも適用されます。
Cartesianプロパティ・キー
  1. pointプロパティ・キーのスキーマを作成します。
    schema.propertyKey('point').Point().withBounds(-3, -3, 3, 3).create()
    注: Cartesian空間型では、withBounds(x1, y1, x2, y2)メソッドによって、検索はx-yグリッド内のデフォルトの有効な値範囲に制限されます。
  2. linestringプロパティ・キーのスキーマを作成します。
    schema.propertyKey('line').Linestring().withBounds(-3, -3, 3, 3).create()
    ポイントに適用されたのと同じ範囲制限がラインストリングにも適用されます。
  3. polygonプロパティ・キーのスキーマを作成します。
    schema.propertyKey('polygon').Polygon().withBounds(-3, -3, 3, 3).create()
    ポイントに適用されたのと同じ範囲制限がポリゴンにも適用されます。
  4. 頂点とエッジのプロパティを定義します。キー名の他にプロパティのデータ型を指定します。この例で作成されるプロパティは、テキスト、整数、タイムスタンプのいずれかです。他のデータ型が利用可能です。プロパティは、グラフの選択的サブセットを取得し、格納された値を取得するために使用されます。プロパティの性質はグローバルであり、探索で使用するプロパティは、頂点ラベルとプロパティのペアによって一意に識別されます。エッジ・プロパティを更新することは不経済です。なぜならば、エッジ・プロパティを更新するためにエッジ全体とそのすべてのプロパティを削除し、再作成しなければならないからです。エッジ・プロパティは、それを使用する正当な理由がある場合にしか使用しないでください。
    // ********
    // PROPERTY KEYS
    // ********
    // SYNTAX:
    // propertyKey('name').
    //    type().
    //    [ single() | multiple() ].
    //    [ ttl ].
    //    [ properties(metadata_property) ].
    //    [ ifNotExists() ].
    //    [ create() | add() | describe() | exists() ]
    // DEFAULT IS SINGLE CARDINALITY
    // ********
    
    // SINGLE CARDINALITY PROPERTY KEY
    schema.propertyKey('personId').Int().single().create()
    schema.propertyKey('mealId').Int().single().create()
    schema.propertyKey('itemId').Int().single().create()
    schema.propertyKey('recipeId').Int().single().create()
    schema.propertyKey('bookId').Int().single().create()
    schema.propertyKey('ingredId').Int().single().create()
    schema.propertyKey('homeId').Int().single().create()
    schema.propertyKey('storeId').Int().single().create()
    schema.propertyKey('locId').Text().single().create()
    schema.propertyKey('stateId').Int().single().create()
    schema.propertyKey('cityId').Int().single().create()
    schema.propertyKey('sensorId').Int().single().create()
    schema.propertyKey('name').Text().single().create()
    schema.propertyKey('gender').Text().single().create()
    schema.propertyKey('calGoal').Int().single().create()
    schema.propertyKey('macroGoal').Text().single().create()
    schema.propertyKey('publishYear').Int().single().create()
    schema.propertyKey('ISBN').Text().single().create()
    // PROPERTY KEY WITH TTL
    schema.propertyKey('bookDiscount').Text().ttl(604800).create()
    schema.propertyKey('instructions').Text().single().create()
    schema.propertyKey('notes').Text().single().create()
    schema.propertyKey('type').Text().single().create()
    schema.propertyKey('servAmt').Text().single().create()
    schema.propertyKey('macro').Text().single().create()
    schema.propertyKey('calories').Int().single().create()
    schema.propertyKey('geoPoint').Point().withGeoBounds().create()
    schema.propertyKey('address').Text().single().create()
    schema.propertyKey('amount').Text().single().create()
    // MULTIPLE CARDINALITY PROPERTY KEY
    schema.propertyKey('nickname').Text().multiple().create()
    schema.propertyKey('cuisine').Text().multiple().create()
    // MULTIPLE CARDINALITY PROPERTY KEY WITH SINGLE CARDINALITY META-PROPERTY
    schema.propertyKey('since').Int().single().create() // meta-property
    schema.propertyKey('badge').Text().multiple().properties('since').create()
    // MULTIPLE CARDINALITY PROPERTY KEY WITH MULTIPLE CARDINALITY META-PROPERTY
    schema.propertyKey('startYear').Int().multiple().create()   // meta-property
    schema.propertyKey('endYear').Int().multiple().create()   // meta-property
    schema.propertyKey('country').Text().multiple().properties('startYear','endYear').create()
    
    // EDGE PROPERTIES
    schema.propertyKey('numServ').Int().single().create()
    schema.propertyKey('mealDate').Date().single().create()
    schema.propertyKey('useDate').Date().single().create()
    schema.propertyKey('createDate').Date().single().create()
    schema.propertyKey('expireDate').Date().single().create()
    schema.propertyKey('stars').Int().single().create()
    schema.propertyKey('time').Time().single().create()
    schema.propertyKey('year').Date().single().create()
    schema.propertyKey('comment').Text().single().create()
    // Property Keys 
    // Check for previous creation of property key with 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() is optional - default
    // Example of multiple property
    // schema.propertyKey('nickname').Text().multiple().create();
    // Example meta-property added to property: 
    // schema.propertyKey('livedIn').Text().create()
    // schema.propertyKey('country').Text().multiple().properties('livedIn').create()

    プロパティ・キーが以前に存在していたかどうかをチェックするには、ifNotExists()を使用します。プロパティ・キーを作成するには、single()またはmultiple()を指定して、単一または複数のカーディナリティを使用します。デフォルトは単一のカーディナリティです。これを指定する必要はありませんが、例に示すように明示的に記述することもできます。

    メタプロパティ、つまりプロパティのプロパティを作成するには、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
        }
      ]
    }

// RECIPE SCHEMA

// To run in Studio, copy and paste all lines to a cell and run.

// To run in Gremlin console, use the next two lines:
// script = new File('/tmp/RecipeSchema.groovy').text; []
// :> @script
    	
// Property Keys 
// Check for previous creation of property key with 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() is optional - default
// Example of multiple property
// schema.propertyKey('nickname').Text().multiple().create();
// Example meta-property added to property: 
// schema.propertyKey('livedIn').Text().create()
// schema.propertyKey('country').Text().properties('livedIn').create()
    		
// Vertex Labels
schema.vertexLabel('author').ifNotExists().create()
schema.vertexLabel('recipe').create()
// Example of creating vertex label with properties
// schema.vertexLabel('recipe').properties('name','instructions').create()
schema.vertexLabel('ingredient').create()
schema.vertexLabel('book').create()
schema.vertexLabel('meal').create()
schema.vertexLabel('reviewer').create()
// Example of custom vertex id:
// schema.propertyKey('city_id').Int().create()
// schema.propertyKey('sensor_id').Uuid().create()
// schema().vertexLabel('FridgeSensor').partitionKey('city_id').clusteringKey('sensor_id').create()
                
// Edge Labels
schema.edgeLabel('authored').ifNotExists().create()
schema.edgeLabel('created').create()
schema.edgeLabel('includes').create()
schema.edgeLabel('includedIn').create()
schema.edgeLabel('rated').properties('stars').connection('reviewer','recipe').create()
                
// Vertex Indexes
// Secondary
schema.vertexLabel('author').index('byName').secondary().by('name').add()
// Materialized	  		
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()
// Search
// schema.vertexLabel('recipe').index('search').search().by('instructions').asText().add()
// schema.vertexLabel('recipe').index('search').search().by('instructions').asString().add()
// If more than one property key is search indexed
// schema.vertexLabel('recipe').index('search').search().by('instructions').asText().by('category').asString().add()

// Edge Index
schema.vertexLabel('reviewer').index('ratedByStars').outE('rated').by('stars').add()

// Example of property index using meta-property 'livedIn': 
// schema().vertexLabel('author').index('byLocation').property('country').by('livedIn').add()

// Schema description
// Use to check that the schema is built as desired
schema.describe()