CSVデータの読み込み

DSE Graph Loaderを使用してCSVデータを読み込む方法。

グラフ・データの読み込みによく使用されるファイル形式は、CSV(コンマ区切りデータ)です。一般的に、入力CSVファイルは、ファイルの最初の行のプロパティ・キーをヘッダー行で識別します。ただし、マッピング・スクリプトでは、データ入力行でheader()を使用して読み込むプロパティ・キーを識別することもできます。labelFieldを使用して頂点ラベルを操作するなどの柔軟性が必要な場合は、TEXTデータの読み込みを使用します。

複数の異なるCSVファイルのマッピング

DSE Graph Loaderによる複数の異なる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
頂点ラベルauthorbookの両方にプロパティ・キーnameが使用されるため、authorBookファイルでは、著者名と本の名前に変数anamebnameがそれぞれ使用されます。これらの変数は、author頂点とbook頂点の間にエッジを作成するために使用されるマッピング・ロジックで使用されます。

手順

  1. 必要に応じて、マッピング・スクリプトに構成を追加します。
  2. データ入力ファイルを指定します。変数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()のいずれかが必要です。
  3. 各行で、ファイルをcsvファイルとして指定し、ファイル名を指定して、区切り文字を設定します。データの処理に使用されるマップ、authorInputが作成されます。マップは変換を使用することで、読み込み前に操作することができます。
    authorInput = File.csv(inputfiledir + 'author.csv').delimiter('|')
    ヒント: データから余分な空白文字を取り除く必要がある場合は、File.csv()文でtrimWhitespace(true)を使用します。
  4. マッピング・スクリプトの本文を作成します。マッピング・スクリプトのこの部分は、ファイル形式に関係なく同じです。
  5. 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でのマッピング。

DSE Graph Loaderでは、ディレクトリー内に存在する同じ形式の複数のCSVファイルを以下の手順で読み込むことができます。サンプル入力データ:
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.

手順

  1. 必要に応じて、マッピング・スクリプトに構成を追加します。
  2. データ入力ディレクトリーを指定します。変数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
  3. 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"
        }
    }
  4. CSVの読み込みに、DSE Graph Loaderをディレクトリーから実行するには、次のコマンドを使用します。
    $ graphloader dirSourceMapping.groovy -graph testdirSource -address localhost

    テスト目的の場合、graphloaderの実行前に、指定されたグラフが存在する必要はありません。ただし、実稼働アプリケーションの場合は、グラフとスキーマを作成してから、graphloaderを使用する必要があります。

ファイル・パターンを使用したディレクトリーからのファイルのマッピング

形式が同じ複数のCSVファイルのDSE Graph Loaderでのマッピング。

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*.csvperson*.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].csvperson[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.csvperson1.csv、およびbadOne.csvは、パターンが3つのファイルすべてで一致するため読み込まれます。person*.csvperson*.jsonに置き換え、JSON入力ファイル・パラメーターを使用することで、JSON入力ファイルにも同じパターン・マッチングを使用できます。

  • 次のコマンドを使用して、この例についてDSE Graph Loaderを実行します。
    $ graphloader filePatternMULT.groovy -graph testPattMULT -address localhost

    テスト目的の場合、graphloaderの実行前に、指定されたグラフが存在する必要はありません。ただし、実稼働アプリケーションの場合は、グラフとスキーマを作成してから、graphloaderを使用する必要があります。