JSONデータの読み込み

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

グラフ・データの読み込みによく使用されるファイル形式はJSONです。入力JSONファイルには、すべてのキーと値に関する情報がネストされた構造で保持されます。

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

DSE Graph Loaderによる複数の異なるJSONファイルのマッピング。

DSE Graph Loaderは、以下のステップを使用して、ディレクトリーに存在する複数の異なるCSVファイルを読み込むことができます。サンプル入力データ:
SAMPLE INPUT
// For the author.json file: 
{"author_name":"Julia Child","gender":"F"}
// For the book.json file:
{"name":"The Art of French Cooking, Vol. 1","year":"1961","ISBN":"none"}
// For the authorBook.json file: 
{"name":"The Art of French Cooking, Vol. 1","author":"Julia Child"}
頂点ラベル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/JSON/'
    authorInput = File.json(inputfiledir + 'author.json')
    bookInput = File.json(inputfiledir + 'book.json')
    authorBookInput = File.json(inputfiledir + 'authorBook.json')
  3. 各行で、ファイルをjsonファイルとして指定し、ファイル名を指定します。File.jsonのJSON形式は、1行に1つのJSONオブジェクトです。データの処理に使用されるマップ、authorInputが作成されます。マップは変換を使用することで、読み込み前に操作することができます。
    authorInput = File.json(inputfiledir + 'author.json')
  4. マッピング・スクリプトの本文を作成します。マッピング・スクリプトのこの部分は、ファイル形式に関係なく同じです。
  5. JSONの読み込みに、DSE Graph Loaderをdry runとして実行するには、次のコマンドを使用します。
    $ graphloader authorBookMappingJSON.groovy -graph testJSON -address localhost -dryrun true

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

スクリプト全文は次のようになります。
/* SAMPLE INPUT
author: {"name":"Julia Child","gender":"F"}
book : {"name":"The Art of French Cooking, Vol. 1","year":"1961","ISBN":"none"}
authorBook: {"bname":"The Art of French Cooking, Vol. 1","aname":"Julia Child"}
 */

// 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 that is given in the commandline
// as the "-filename" option

inputfiledir = '/tmp/JSON/'
authorInput = File.json(inputfiledir + 'author.json')
bookInput = File.json(inputfiledir + 'book.json')
authorBookInput = File.json(inputfiledir + 'authorBook.json')

//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"
    }
}

形式が同じ複数のファイルのディレクトリーからのマッピング

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

DSE Graph Loaderでは、ディレクトリー内に存在する同じ形式の複数のJSONファイルを以下の手順で読み込むことができます。サンプル入力データ:
SAMPLE INPUT
// For the author.json file: 
{"author_name":"Julia Child","gender":"F"}
// For the book.json file:
{"name":"The Art of French Cooking, Vol. 1","year":"1961","ISBN":"none"}
// For the authorBook.json file: 
{"name":"The Art of French Cooking, Vol. 1","author":"Julia Child"}
同じ形式の多数のファイルがディレクトリーに存在します。ファイルが異なる場合、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)
    
    //Specifies what data source to load using which mapper (as defined inline)
    
    load(personInput).asVertices {
        label "author"
        key "name"
    }

    重要な要素はFile.directory()です。これによって、ファイルを格納するディレクトリーが定義されます。

  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)
    personEdgeInput = File.directory(edgefiledir)
    
    //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. JSONの読み込みにディレクトリーからDSE Graph Loaderを実行するには、以下のコマンドを使用します。
    $ graphloader dirSourceJSONMapping.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を使用する必要があります。