CSVデータの読み込み
DSE Graph Loaderを使用してCSVデータを読み込む方法。
グラフ・データの読み込みによく使用されるファイル形式は、CSV(コンマ区切りデータ)です。一般的に、入力CSVファイルは、ファイルの最初の行のプロパティ・キーをヘッダー行で識別します。ただし、マッピング・スクリプトでは、データ入力行でheader()
を使用して読み込むプロパティ・キーを識別することもできます。labelFieldを使用して頂点ラベルを操作するなどの柔軟性が必要な場合は、TEXTデータの読み込みを使用します。
複数の異なるCSVファイルのマッピング
DSE Graph Loaderによる複数の異なるCSVファイルのマッピング。
SAMPLE INPUT
// For the author.csv file:
name|gender
Julia Child|F
// For the book.csv file:
name|year|ISBN
Simca's Cuisine: 100 Classic French Recipes for Every Occasion|1972|0-394-40152-2
// For the authorBook.csv file:
bname|aname
Simca's Cuisine: 100 Classic French Recipes for Every Occasion|Simone Beck
頂点ラベルauthor
とbook
の両方にプロパティ・キーname
が使用されるため、authorBook
ファイルでは、著者名と本の名前に変数aname
とbname
がそれぞれ使用されます。これらの変数は、author
頂点とbook
頂点の間にエッジを作成するために使用されるマッピング・ロジックで使用されます。手順
- 必要に応じて、マッピング・スクリプトに構成を追加します。
-
データ入力ファイルを指定します。変数
inputfiledir
は、入力ファイルのディレクトリーを指定します。識別された各ファイルは、読み込みで使用されます。// DATA INPUT // Define the data input source (a file which can be specified via command line arguments) // inputfiledir is the directory for the input files inputfiledir = '/tmp/CSV/' authorInput = File.csv(inputfiledir + 'author.csv').delimiter('|') bookInput = File.csv(inputfiledir + 'book.csv').delimiter('|') authorBookInput = File.csv(inputfiledir + 'authorBook.csv').delimiter('|')
特に、CSVファイルには、フィールド名を示すヘッダー行を含めることができます。たとえば、
authorInput
ファイルの最初の行は次のようになります。name|gender
header()
がマッピング・スクリプトで使用され、ヘッダー行がデータ・ファイルで使用されている場合は、両方が一致する必要があります。データ・ファイルのヘッダー行またはheader()
のいずれかが必要です。 -
各行で、ファイルを
csv
ファイルとして指定し、ファイル名を指定して、区切り文字を設定します。データの処理に使用されるマップ、authorInput
が作成されます。マップは変換を使用することで、読み込み前に操作することができます。authorInput = File.csv(inputfiledir + 'author.csv').delimiter('|')
ヒント: データから余分な空白文字を取り除く必要がある場合は、File.csv()
文でtrimWhitespace(true)
を使用します。 - マッピング・スクリプトの本文を作成します。マッピング・スクリプトのこの部分は、ファイル形式に関係なく同じです。
-
CSVの読み込みに、DSE Graph Loaderをdry runとして実行するには、次のコマンドを使用します。
$ graphloader authorBookMappingCSV.groovy -graph testCSV -address localhost -dryrun true
テスト目的の場合、
graphloader
の実行前に、指定されたグラフが存在する必要はありません。ただし、実稼働アプリケーションの場合は、グラフとスキーマを作成してから、graphloader
を使用する必要があります。
例
/* SAMPLE INPUT
author: Julia Child|F
book: Simca's Cuisine: 100 Classic French Recipes for Every Occasion|1972|0-394-40152-2
authorBook: Simca's Cuisine: 100 Classic French Recipes for Every Occasion|Simone Beck
*/
// CONFIGURATION
// Configures the data loader to create the schema
config create_schema: true, load_new: true, load_vertex_threads: 3
// DATA INPUT
// Define the data input source (a file which can be specified via command line arguments)
// inputfiledir is the directory for the input files
inputfiledir = '/tmp/CSV/'
authorInput = File.csv(inputfiledir + "author.csv").delimiter('|')
bookInput = File.csv(inputfiledir + "book.csv").delimiter('|')
authorBookInput = File.csv(inputfiledir + "authorBook.csv").delimiter('|')
//Specifies what data source to load using which mapper (as defined inline)
load(authorInput).asVertices {
label "author"
key "name"
}
load(bookInput).asVertices {
label "book"
key "name"
}
load(authorBookInput).asEdges {
label "authored"
outV "aname", {
label "author"
key "name"
}
inV "bname", {
label "book"
key "name"
}
}
形式が同じ複数のファイルのディレクトリーからのマッピング
形式が同じ複数のCSVファイルのDSE Graph Loaderでのマッピング。
SAMPLE INPUT
// For the author.csv file:
name|gender
Julia Child|F
Simone Beck|F
// For the knows.csv file:
aname|bname
Julia Child|James Beard
同じ形式の多数のファイルがディレクトリーに存在します。ファイルが異なる場合、graphloaderはエラーを出して停止します。java.lang.IllegalArgumentException: /tmp/dirSource/data has more than 1 input type.
手順
- 必要に応じて、マッピング・スクリプトに構成を追加します。
-
データ入力ディレクトリーを指定します。変数
inputfiledir
は、入力ファイルのディレクトリーを指定します。識別された各ファイルは、読み込みで使用されます。// DATA INPUT // Define the data input source (a file which can be specified via command line arguments) // inputfiledir is the directory for the input files inputfiledir = '/tmp/dirSource/data' personInput = File.directory(inputfiledir).delimiter('|').header('name','gender') //Specifies what data source to load using which mapper (as defined inline) load(personInput).asVertices { label "author" key "name" }
重要な要素は
File.directory()
です。これによって、ファイルを格納するディレクトリーが定義されます。CSVファイルには、フィールド名を示すヘッダー行が必要であることに注意することが重要です。たとえば、
authorInput
ファイルの最初の行は次のようになります。name|gender
-
2つのディレクトリーを使用して、頂点とエッジを読み込むことができます。
// DATA INPUT // Define the data input source (a file which can be specified via command line arguments) // inputfiledir is the directory for the input files inputfiledir = '/tmp/dirSource/data' vertexfiledir = inputfiledir+'/vertices' edgefiledir = inputfiledir+'/edges' personInput = File.directory(vertexfiledir).delimiter('|').header('name','gender') personEdgeInput = File.directory(edgefiledir).delimiter('|').header('aname','bname') //Specifies what data source to load using which mapper (as defined inline) load(personInput).asVertices { label "author" key "name" } load(personEdgeInput).asEdges { label "knows" outV "aname", { label "author" key "name" } inV "bname", { label "book" key "name" } }
-
CSVの読み込みに、DSE Graph Loaderをディレクトリーから実行するには、次のコマンドを使用します。
$ graphloader dirSourceMapping.groovy -graph testdirSource -address localhost
テスト目的の場合、
graphloader
の実行前に、指定されたグラフが存在する必要はありません。ただし、実稼働アプリケーションの場合は、グラフとスキーマを作成してから、graphloader
を使用する必要があります。
ファイル・パターンを使用したディレクトリーからのファイルのマッピング
形式が同じ複数のCSVファイルのDSE Graph Loaderでのマッピング。
$ ls data badOne.csv person1.csv person2.csv同じ形式の多数のファイルがディレクトリーに存在します。ファイルが異なる場合、DSE Graph Loaderはマップ・スクリプト内のパターンと一致するファイルのみを読み込みます。
パターン | 説明 | 例 |
---|---|---|
* | ゼロ以上の文字と一致します。マッチング中は、ディレクトリー境界を超えません。 | *.csvの場合、csvで終わるすべてのCSVファイルと一致します。 |
** | *と同じですが、ディレクトリー境界を超えます。 | 複数のディレクトリー内のCSVファイル。 |
? | 1つの文字だけ一致します。 | person?.csvの場合、person1.csvまたはpersonA.csvの名前が付いたすべてのCSVファイルに一致しますが、person11.csvは一致しません。 |
\ | 特殊文字として解釈される文字を回避します。例:\\ to get a single \。 | |
[ ] | 指定された文字のセットに一致しますが、単一の文字が一致する場合に限ります。 | [efg]は、「e」、「f」、または「g」に一致するため、person[efg]は、persone、personf、またはpersongに一致します。[1-9]は任意の1つの数字に一致します。person[1-9]では、person1.csvからperson9.csvまでのファイルを取得します。 |
{ } | サブパターンのグループに一致します。 | {csv,json}では、ディレクトリー内のすべてのCSVファイルとJSONファイルに一致します。 |
手順
- 必要に応じて、マッピング・スクリプトに構成を追加します。
-
サンプル入力ファイル:
/* SAMPLE CSV INPUT: id|name|gender 001|Julia Child|F */
-
データ入力ディレクトリーを指定します。変数
inputfiledir
は、入力ファイルのディレクトリーを指定します。識別された各ファイルは、読み込みで使用されます。// DATA INPUT // Define the data input source (a file which can be specified via command line arguments) // inputfiledir is the directory for the input files inputfiledir = '/tmp/filePattern' inputfileCSV = inputfiledir+'/data' personInput = File.directory(inputfileCSV).fileMatches("person*.csv").delimiter('|').header('id','name','gender') //Specifies what data source to load using which mapper (as defined inline) load(personInput).asVertices { label "person" key "name" } /* RESULT: person1.csv and person2.csv will be loaded, but not badOne.csv */
重要な要素は
fileMatches("person*.csv")
です。これは、読み込まれるファイルに一致するパターンを定義します。ファイルbadOne.csvは、パターンが一致しないため読み込まれません。ファイルpersonExtra.csvも、パターンが一致するため読み込まれることに注意してください。person*.csvをperson*.jsonに置き換え、JSON入力ファイル・パラメーターを使用することで、JSON入力ファイルにも同じパターン・マッチングを使用できます。
-
CSVの読み込みに、DSE Graph Loaderをディレクトリーから実行するには、次のコマンドを使用します。
$ graphloader filePatternCSV.groovy -graph testPattCSV -address localhost
テスト目的の場合、
graphloader
の実行前に、指定されたグラフが存在する必要はありません。ただし、実稼働アプリケーションの場合は、グラフとスキーマを作成してから、graphloader
を使用する必要があります。
- 必要に応じて、マッピング・スクリプトに構成を追加します。
-
サンプル入力ファイル:
/* SAMPLE CSV INPUT: id|name|gender 001|Julia Child|F */
-
データ入力ディレクトリーを指定します。変数
inputfiledir
は、入力ファイルのディレクトリーを指定します。識別された各ファイルは、読み込みで使用されます。// DATA INPUT // Define the data input source (a file which can be specified via command line arguments) // inputfiledir is the directory for the input files inputfiledir = '/tmp/filePattern' inputfileCSV = inputfiledir+'/data' personInput = File.directory(inputfileCSV).fileMatches("person[1-9].csv").delimiter('|').header('id','name','gender') //Specifies what data source to load using which mapper (as defined inline) load(personInput).asVertices { label "person" key "name" } /* RESULT: person1.csv and person2.csv will be loaded, but not badOne.csv */
重要な要素は
fileMatches("person[1-9].csv")
です。これは、読み込まれるファイルに一致するパターンを定義します。person1.csvからperson9.csvまでのすべてのファイルが読み込まれますが、person15.csvはパターンと一致しないため、badOne.csvと同様に読み込まれません。fileMatches("person?.csv")
でも同じ結果になります。person[1-9].csvをperson[1-9].jsonに置き換え、JSON入力ファイル・パラメーターを使用することで、JSON入力ファイルにも同じパターン・マッチングを使用できます。
-
この例でDSE Graph Loaderを実行するには、次のコマンドを使用します。
$ graphloader filePatternRANGE.groovy -graph testPattRANGE -address localhost
テスト目的の場合、
graphloader
の実行前に、指定されたグラフが存在する必要はありません。ただし、実稼働アプリケーションの場合は、グラフとスキーマを作成してから、graphloader
を使用する必要があります。
- 必要に応じて、マッピング・スクリプトに構成を追加します。
-
サンプル入力ファイル:
/* SAMPLE CSV INPUT: id|name|gender 001|Julia Child|F */
-
データ入力ディレクトリーを指定します。変数
inputfiledir
は、入力ファイルのディレクトリーを指定します。識別された各ファイルは、読み込みで使用されます。// DATA INPUT // Define the data input source (a file which can be specified via command line arguments) // inputfiledir is the directory for the input files inputfiledir = '/tmp/filePattern/data' personInput = File.directory(inputfiledir).fileMatches("{person*,badOne}.csv").delimiter('|').header('id','name','gender') //Specifies what data source to load using which mapper (as defined inline) load(personInput).asVertices { label "person" key "name" } /* RESULT: person1.csv, person2.csv and badOne.csv will all be loaded */
重要な要素は
fileMatches("{person*,badOne}.csv")
です。これは、読み込まれるファイルに一致するパターンを定義します。ファイルperson1.csv、person1.csv、およびbadOne.csvは、パターンが3つのファイルすべてで一致するため読み込まれます。person*.csvをperson*.jsonに置き換え、JSON入力ファイル・パラメーターを使用することで、JSON入力ファイルにも同じパターン・マッチングを使用できます。 -
次のコマンドを使用して、この例についてDSE Graph Loaderを実行します。
$ graphloader filePatternMULT.groovy -graph testPattMULT -address localhost
テスト目的の場合、
graphloader
の実行前に、指定されたグラフが存在する必要はありません。ただし、実稼働アプリケーションの場合は、グラフとスキーマを作成してから、graphloader
を使用する必要があります。