マッピング・スクリプト
マッピング・スクリプトの本文について説明します。
選択されたファイル形式にかかわらず、マッピング・スクリプトの本文は同じです。構成を設定し、データ入力ソースを追加すると、マッピング・コマンドが指定されます。
手順
-
頂点が
authorInput
から読み込まれ、頂点ラベルはauthor
で、プロパティ・キーname
はkey
についてリストされた頂点を一意に識別します。この例では、キーにgender
が選択された場合、データ・ファイルから各レコードを読み込むのに十分な一意性がないことに注意してください。構成設定load_new: true
を使用すると、読み込みプロセスの速度が大幅に向上しますが、レコードが既に存在する場合、重複する頂点が作成されます。他のすべてのプロパティ・キーが読み込まれますが、読み込みスクリプトで識別する必要はありません。author
頂点の場合、gender
も読み込まれます。load(authorInput).asVertices { label "author" key "name" }
1つ以上の頂点に対して同じファイルを再使用する場合でも、頂点が読み込まれるたびに1つの読み込みステートメントが作成される必要があります。複数の頂点に同じ入力ファイルを使用すると、特定の頂点については無視する必要があるフィールドが入力ファイルに存在する場合があります。フィールドの無視に関する手順を参照してください。
authors
やreviewers
などの異なる頂点ラベルに読み込む必要がある複数の行のタイプが入力ファイルに含まれる場合は、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ファイルの各行にリストされた値に使用するプロパティ・キーを識別して、ヘッダーに基づいて入力ファイルのいずれかから読み込まれます。辺プロパティによって、プロパティtimestamp
、stars
、およびcomment
でreviewer
頂点と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]}