マッピング・スクリプト

マッピング・スクリプトの本文について説明します。

選択されたファイル形式にかかわらず、マッピング・スクリプトの本文は同じです。構成を設定し、データ入力ソースを追加すると、マッピング・コマンドが指定されます。

手順

  • 頂点がauthorInputから読み込まれ、頂点ラベルはauthorで、プロパティ・キーnamekeyについてリストされた頂点を一意に識別します。この例では、キーにgenderが選択された場合、データ・ファイルから各レコードを読み込むのに十分な一意性がないことに注意してください。構成設定load_new: trueを使用すると、読み込みプロセスの速度が大幅に向上しますが、レコードが既に存在する場合、重複する頂点が作成されます。他のすべてのプロパティ・キーが読み込まれますが、読み込みスクリプトで識別する必要はありません。author頂点の場合、genderも読み込まれます。
    load(authorInput).asVertices {
    label "author"
    key "name"
    }

    1つ以上の頂点に対して同じファイルを再使用する場合でも、頂点が読み込まれるたびに1つの読み込みステートメントが作成される必要があります。複数の頂点に同じ入力ファイルを使用すると、特定の頂点については無視する必要があるフィールドが入力ファイルに存在する場合があります。フィールドの無視に関する手順を参照してください。authorsreviewersなどの異なる頂点ラベルに読み込む必要がある複数の行のタイプが入力ファイルに含まれる場合は、labelFieldの手順を参照してください。

  • 本の頂点の読み込みは、似たようなパターンに従います。authorおよびbookの頂点ラベルは両方とも、頂点を識別するための一意のキーとしてnameを使用します。これによって、読み込みプロセスの開始時に頂点レコードがグラフにまだ存在しないことが宣言されます。
    load(bookInput).asVertices {
    label "book"
    key "name"
    }
  • 頂点が読み込まれた後、辺が読み込まれます。頂点のマッピングと同様に、辺のラベルが指定されます。また、辺の外向きの頂点と(outV)内向きの頂点(inV)を識別する必要があります。outVまたはinVの頂点ごとに、頂点ラベルはlabelで指定され、一意のキーがkeyで指定されます。
    load(authorBookInput).asEdges {
    label "authored"
    outV "aname", {
    label "author"
    key "name"
        }
    inV "bname", {
    label "book"
    key "name"
        }
    }
    outVおよびinVの指定に使用される命名規則に注意してください。外向きの頂点と内向きの頂点の名前がnameとしてリストされるため、著者名と書名を区別するために指定子anameおよびbnameが使用されます。
  • 前述の定義に代わる手段として、変数でマッピング・ロジックを指定し、個別に読み込みステートメントをリストします。
    authorMapper = {
    label "author"
    key "name"}
    bookMapper = {
    label "book"
    key "name"
    }
    authorBookMapper = {
    label "authored"
    outV "aname", {
    label "author"
    key "name"
        }
    inV "bname", {
    label "book"
    key "name"
        }
    }
    
    load(authorInput).asVertices(authorMapper)
    load(bookInput).asVertices(bookMapper)
    load(authorBookInput).asEdges(authorBookMapper)

入力時にフィールドを無視する

  • 特定の頂点の読み込みについて無視する必要があるフィールドを入力ファイルに含める場合は、ignoreを使用します。
    // authorInputにはname、gender、およびrestaurantが含まれます
    // ただし、restaurantは読み込まれません
    
    load(authorInput).asVertices {
    label "author"
    key "name"
    ignore "restaurant"
    }
  • 追加の例で、ignoreの使用方法を示します。同じ入力ファイルを使用して、bookおよびauthorという2つの異なるタイプの頂点が作成されます。
    // 入力ファイルからのサンプル行
    // Julia Child|F|The French Chef Cookbook
    Simone Beck|F|The Art of French Cooking, Vol. 1
    
    //inputfiledir = '/tmp/TEXT/'
    authorInput = File.text("author.dat").delimiter("|").header('name', 'gender','bname')
    
    //(定義済みインラインとして)いずれかのマッパーを使用して読み込むデータ・ソースを指定します
      
    load(authorInput).asVertices {
    label "book"
    key "bname"
    ignore "name"
    ignore "gender"
    }
    
    load(authorInput).asVertices {
    label "author"
    key "name"
    outV "book", "authored", {
    label "book"
    key "bname"
       }
    }

圧縮ファイルを使用した辺プロパティの読み込み

  • DSE Graph Loaderを使用して圧縮ファイルを読み込み、頂点と辺の両方を読み込むことができます。この例では、gzippedファイルを使用して、頂点と辺および辺のプロパティを読み込みます。
    /* SAMPLE INPUT
    reviewer:John Doe
    recipe:Beef Bourguignon
    reviewerRating:
    rev_name|recipe_name|timestamp|stars|comment
    John Doe|Beef Bourguignon|2014-01-01|5|comment
     */
    
    // CONFIGURATION
    // スキーマを作成するようにデータ・ローダーを構成します
    config create_schema:false, load_new:false
    
    // DATA INPUT
    // データ入力ソース(コマンドライン引数で指定可能なファイル)を定義します
    // inputfiledirはコマンドラインで指定された入力ファイルのディレクトリーです
    // as the "-filename" option
    inputfiledir = '/tmp/CSV/'
    // レビューアーが既に存在する場合、この次のファイルは不要です
    reviewerInput = File.csv(inputfiledir + "reviewers.csv.gz").gzip().delimiter('|')
    // レシピが既に存在する場合、この次のファイルは不要です
    recipeInput = File.csv(inputfiledir +"recipes.csv.gz").gzip().delimiter('|')
    // これは、辺プロパティを使用して辺を作成するときに使用されるファイルです
    reviewerRatingInput = File.csv(inputfiledir + "reviewerRatings.csv.gz").gzip().delimiter('|')
    
    //(定義済みインラインとして)いずれかのマッパーを使用して読み込むデータ・ソースを指定します
    
    load(reviewerInput).asVertices {
    label "reviewer"
    key "name"
    }
    
    load(recipeInput).asVertices {
    label "recipe"
    key "name"
    }
    
    load(reviewerRatingInput).asEdges {
    label "rated"
    outV "rev_name", {
    label "reviewer"
    key "name"
        }
    inV "recipe_name", {
    label "recipe"
    key "name"
        }
    // プロパティは、ヘッダー行をプロパティ・キーとして使用して、ファイルから自動的に追加されます
    // from previously created schema
    }
    

    圧縮ファイルは.gzファイルとして指定され、その後のgzip()手順によって処理されます。辺プロパティは、CSVファイルの各行にリストされた値に使用するプロパティ・キーを識別して、ヘッダーに基づいて入力ファイルのいずれかから読み込まれます。辺プロパティによって、プロパティtimestampstars、およびcommentreviewer頂点とrecipe頂点間のrated辺が指定されます。

labelFieldを使用した異なる頂点ラベルへの入力の解析

  • 読み込まれた頂点の異なる頂点ラベルを区別するために使用する必要のあるフィールドが入力ファイルに含まれる場合、labelFieldを使用します。
    // personInputには、person、name、genderのタイプが含まれます
    // タイプはauthorまたはreviewerになります
    // ファイルpeople.datのサンプル・データ: 
    // author::Julia Child::F
    // reviewer::Jane Doe::F
    
    personInput = File.text('people.dat').delimiter("::").header('type','name','gender')
    
    
    load(personInput).asVertices{
    labelField "type"
    key "name"
    }
    サンプル・データを使用してこのマッピング・スクリプトを実行すると、それぞれについて1つのレコードを持つ2つの異なる頂点ラベルが生成されます。
    gremlin> g.V().hasLabel('author').valueMap()
    ==>{gender=[F], name=[Julia Child]}
    gremlin> g.V().hasLabel('reviewer').valueMap()
    ==>{gender=[F], name=[Jane Doe]}

メタプロパティの挿入

  • 入力ファイルにメタプロパティ(プロパティを持つプロパティ)が含まれている場合は、vertexPropertyを使用します。
    このデータ読み込みのスキーマは、graphloaderを実行する前に作成する必要があります
    schema.propertyKey('name').Text().single().create()
    schema.propertyKey('gender').Text().single().create()
    schema.propertyKey('badge').Text().multiple().create()
    schema.propertyKey('since').Int().single().create()
    schema.propertyKey('badge').properties('since').add()   // Create the meta-property since on the property badge
    schema.vertexLabel('reviewer').properties('name','gender','badge').create()
    schema.vertexLabel('reviewer').index('byname').materialized().by('name').add()

    マッピング・スクリプトでは、vertexPropertyを使用して、badgeを頂点プロパティとして識別します。JSONファイルのbadgeについてネストされたフィールドの構造に注意してください。

    // personInputにはname、gender、badgeタイプが含まれ、日付badgeが発行されます
    // reviewer.json:
    // { "name":"Jane Doe", "gender":"M", "badge" :{ "value":"Gold Badge", "since" : 2012 } }
    
    inputfile = File.json('reviewer.json')
    
    load(inputfile).asVertices {
    label "reviewer"
    key "name"
    vertexProperty "badge", {
    "value" "value"
       }
    }
    サンプル・データを使用してこのマッピング・スクリプトを実行すると、プロパティbadgeがメタプロパティsinceを持つreviewer頂点が生成されます。
    gremlin> g.V().valueMap()
    ==>{badge=[Gold Badge], gender=[M], name=[Jane Doe]}
    gremlin> g.V().properties('badge').valueMap()
    ==>{since=2012}

複合プライマリ・キーでのデータの挿入

  • 複合プライマリ・キーを使用して頂点のデータを挿入するには、2つ以上のキーを宣言する必要があります。
    /* SAMPLE INPUT
    city_id|sensor_id|fridgeItem
    santaCruz|93c4ec9b-68ff-455e-8668-1056ebc3689f|asparagus
     */
      
    load(fridgeItemInput).asVertices {
    label "FridgeSensor"
    // FridgeSensorのvertexLabelスキーマには、次の2つのキーが含まれます。
    // パーティション・キーcity_idおよびクラスター化キーsensor_id 
    key city_id:"city_id", sensor_id:"sensor_id"
    }
    最初にスキーマ・キーを識別してから、次にCSVファイル内のキー識別子を識別して、keyエントリー内の各キーを識別します。頂点IDを確認すると、idsによってプライマリ・キーの正確な定義が使用されます。
    gremlin> g.V().hasLabel('FridgeSensor').id()
    ==>{~label=FridgeSensor, sensor_id=93c4ec9b-68ff-455e-8668-1056ebc3689f, city_id=santaCruz}
    ==>{~label=FridgeSensor, sensor_id=9c23b683-1de2-4c97-a26a-277b3733732a, city_id=sacramento}
    ==>{~label=FridgeSensor, sensor_id=eff4a8af-2b0d-4ba9-a063-c170130e2d84, city_id=sacramento}
    結果の頂点にはデータとしてfridgeItemが格納されます。
    gremlin> g.V().valueMap()
    ==>{fridgeItem=[asparagus]}
    ==>{fridgeItem=[ham]}
    ==>{fridgeItem=[eggs]}
  • 同じ複合キーに基づいて辺を読み込むには、変換が必要です。
    /* SAMPLE EDGE DATA
    city_id|sensor_id|name
    santaCruz|93c4ec9b-68ff-455e-8668-1056ebc3689f|asparagus
    */
    the_edges = File.csv(inputfiledir + "fridgeItemEdges.csv").delimiter('|')
    
    the_edges = the_edges.transform {
    it['FridgeSensor'] = [
    'city_id' :it['city_id'],
    'sensor_id' :it['sensor_id'] ];
    it['ingredient'] = [
    'name' :it['name'] ];
    it
    }
    load(the_edges).asEdges  {
    label "linked"
    outV "ingredient", {
    label "ingredient"
    key "name"
        }
    inV "FridgeSensor", {
    label "FridgeSensor"
    key city_id:"city_id", sensor_id:"sensor_id"
        }
    }
    

    辺ファイルによって、パーティション・キーとクラスタリング・キーがcity_idおよびsensor_idのマップに変換されます。このマップは、辺が読み込まれると、FridgeSensor頂点のキーを指定するために使用できるようになります。

    結果のマップは、構成要素の頂点とFridgeSensorの頂点間で作成された辺を示します。

TinkerGraphによって生成されたGryoバイナリー・データの読み込み

  • Gryoバイナリー・データを挿入するには、わずかに変更されたマッピング・スクリプトが必要です。Gryoデータを読み込むには、DSE Graph Loaderによるスキーマの作成と新しいデータの読み込みを許可します。読み込み時に、グラフschema_modeがDevelopmentに設定される必要があります。
    //(定義済みインラインとして)いずれかのマッパーを使用して読み込むデータ・ソースを指定します
      
    load(recipeInput.vertices()).asVertices {
    labelField "~label"
    key "~id", "id"
    }
    
    load(recipeInput.edges()).asEdges {
    labelField "~label"
    outV "outV", {
    labelField "~label"
    key "~id", "id"
        }
    inV "inV", {
    labelField "~label"
    key "~id", "id"
        }
    }
    Gryoデータ形式には、読み込まれるレコードごとにラベルとキーを作成するために使用する必要がある~labelフィールド値と~idフィールド値が含まれます。たとえば、著者であるレコードにはauthor~labelが含まれます。~idも同様に、レコードで他のデータとの違いが設定されます。違いについては、マッピング・スクリプトの各key設定の第2項目に基づいて、レコードを参照し、idフィールドの存在に留意することで、確認できます。
    gremlin> g.V().hasLabel('author').valueMap()
    ==>{gender=[F], name=[Julia Child], id=[0]}
    ==>{gender=[F], name=[Simone Beck], id=[3]}

DSE Graphから生成されたGryoデータの読み込み

  • Gryoバイナリー・データを挿入するには、わずかに変更されたマッピング・スクリプトが必要です。Gryoデータを読み込むには、DSE Graph Loaderによるスキーマの作成と新しいデータの読み込みを許可します。読み込み時に、グラフschema_modeがDevelopmentに設定される必要があります。
    //頂点の識別方法を示すようにキーマップを指定する必要があります
    vertexKeyMap = VertexKeyMap.with('meal','name').with('ingredient','name').with('author','name').with('book','name')
    .with('recipe','name').build();
    
    
    inputfiledir = '/tmp/Gryo/'
    recipeInput = com.datastax.dsegraphloader.api.Graph.file(inputfiledir + 'recipesDSEG.gryo').gryo().setVertexUniqueKeys(vertexKeyMap)
      
    load(recipeInput.vertices()).asVertices {
    labelField "~label"
    key "name"
    }
    
    load(recipeInput.edges()).asEdges {
    labelField "~label"
    outV "outV", {
    labelField "~label"
    key "name"
        }
    inV "inV", {
    labelField "~label"
    key "name"
        }
    }
    

    Gryoデータ形式には、頂点と辺の作成に使用する必要がある~labelフィールド値とnameフィールド値が含まれます。たとえば、著者であるレコードには、author~labelとプロパティnameが含まれます。vertexKeyMapによって、一意のプロパティに対する各頂点ラベルのマップが作成されます。このマップは、バイナリー・ファイルから頂点を読み込む際に使用される一意のキーの作成に使用されます。

GraphSONバイナリー・データの読み込み

  • GraphSONバイナリー・データを挿入するには、わずかに変更されたマッピング・スクリプトが必要です。GraphSONデータを読み込むには、DSE Graph Loaderによるスキーマの作成と新しいデータの読み込みを許可します。読み込み時に、グラフschema_modeがDevelopmentに設定される必要があります。
    //(定義済みインラインとして)いずれかのマッパーを使用して読み込むデータ・ソースを指定します
      
    load(recipeInput.vertices().withVertexId()).asVertices {
    labelField "~label"
    key "~id", "id"
    }
    
    load(recipeInput.edges().withVertexId()).asEdges {
    labelField "~label"
    outV "outV", {
    labelField "~label"
    key "~id", "id"
        }
    inV "inV", {
    labelField "~label"
    key "~id", "id"
        }
    }
    GraphSONデータ形式には、読み込まれるレコードごとにラベルとキーを作成するために使用する必要がある~labelフィールド値と~idフィールド値が含まれます。たとえば、著者であるレコードにはauthor~labelが含まれます。~idも同様に、レコードで他のデータとの違いが設定されます。違いについては、マッピング・スクリプトの各key設定の第2項目に基づいて、レコードを参照し、idフィールドの存在に留意することで、確認できます。
    gremlin> g.V().hasLabel('author').valueMap()
    ==>{gender=[F], name=[Julia Child], id=[0]}
    ==>{gender=[F], name=[Simone Beck], id=[3]}

GraphMLバイナリー・データの読み込み

  • GraphMLバイナリー・データを挿入するには、わずかに変更されたマッピング・スクリプトが必要です。GraphMLデータを読み込むには、DSE Graph Loaderによるスキーマの作成と新しいデータの読み込みを許可します。読み込み時に、グラフschema_modeがDevelopmentに設定される必要があります。
    //(定義済みインラインとして)いずれかのマッパーを使用して読み込むデータ・ソースを指定します
      
    load(recipeInput.vertices().withVertexId()).asVertices {
    labelField "~label"
    key "~id", "id"
    }
    
    load(recipeInput.edges().withVertexId()).asEdges {
    labelField "~label"
    outV "outV", {
    labelField "~label"
    key "~id", "id"
        }
    inV "inV", {
    labelField "~label"
    key "~id", "id"
        }
    }
    GraphMLデータ形式には、読み込まれるレコードごとにラベルとキーを作成するために使用する必要がある~labelフィールド値と~idフィールド値が含まれます。たとえば、著者であるレコードにはauthor~labelが含まれます。~idも同様に、レコードで他のデータとの違いが設定されます。違いについては、マッピング・スクリプトの各key設定の第2項目に基づいて、レコードを参照し、idフィールドの存在に留意することで、確認できます。
    gremlin> g.V().hasLabel('author').valueMap()
    ==>{gender=[F], name=[Julia Child], id=[0]}
    ==>{gender=[F], name=[Simone Beck], id=[3]}