JDBC互換データベースからのデータの読み込み

DSE Graph Loaderを使用してJDBC互換データベースからデータを読み込む方法。

JDBC互換データベースから読み込むためのデータ・マッピング・スクリプトを説明付きで示します。スクリプト全文は、ページの最後にあります。
注: DSE Graph Loaderを使用してJDBC互換データベースから直接読み込むのは便利ですが、大規模なデータベースでは非常に時間がかかります。最初に小さなデータセットをテストし、大規模なデータセットを移動するのに必要な時間を考慮して、この方法が効率的かどうかを確認します。

手順

  • 必要に応じて、マッピング・スクリプトに構成を追加します。
  • 読み込み対象のデータのサンプルは以下のようになります。
    SAMPLE INPUT
    // For the author data: 
    name:Julia Child	gender:F
    // For the book data:
    name:Simca's Cuisine: 100 Classic French Recipes for Every Occasion	year:1972	ISBN:0-394-40152-2
    // For the authorBook data: 
    bname:Simca's Cuisine: 100 Classic French Recipes for Every Occasion	aname:Simone Beck

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

  • 一部のデータベースでは、graphloaderスクリプトと同じディレクトリーにドライバーがインストールされている必要があります。MySQLを使用した次の例では、ドライバーをダウンロードできます。ファイルを解凍し、mysql-connector-java-5.1.44-bin.jarファイルを正しいディレクトリーにコピーします。他のデータベースでも同じようにダウンロードが必要です。
  • JDBC情報でデータ入力データベースを指定します。変数inputDatabaseによって、データ入力データベースが指定されます。この例ではMySQLデータベースを使用していますが、JDBC準拠データベース(H2、MySQL、Postgres、Oracle)であればどのデータベースでも使用できます。connectionlocalhost、およびMySQLデータベースsampleがすべて指定されます。さらに、userおよびpasswordが定義されます。MySQL()ステップでは、MySQLデータベースへのデータ接続を表します。接続によって、リモート・マシンのアドレスを定義することもできます。
    // DATA INPUT
    // Define the data input source (a database connection and SQL statements for data selection)
    // inputDatabase is the database name
    inputDatabase = 'localhost/sample'
    db = Database.connection('jdbc:mysql://' + inputDatabase).user('root').password('foo').MySQL()
    // Define multiple data inputs from the database source via SQL queries
    authorInput = db.query "select * from author";
    bookInput = db.query "select * from book";
    authorBookInput = db.query "select * from authorbook";
    注: H2からデータを読み込むには、接続ラインを以下のように定義できます。
    inputDatabase = '~/test'
    db = Database.connection("jdbc:h2:" + inputDatabase).H2().user("sa")
    Postgresの場合はPostgre()を使用し、Oracleの場合はOracle()を使用します。
  • 各行で、データを取得するために使用されるデータベース・クエリーが指定されます。データの処理に使用されるマップ、authorInputが作成されます。マップは変換を使用することで、読み込み前に操作することができます。
    authorInput = db.query "SELECT * FROM AUTHOR";
    重要: DSE Graph Loaderは、データベースからすべてのカラム名を小文字で取得します。読み取りエラーを防ぐために、対応する小文字の名前でグラフ・スキーマを作成します。
  • マッピング・スクリプトの本文を作成します。マッピング・スクリプトのこの部分は、ファイル形式に関係なく同じです。
  • テキストの読み込みに、DSE Graph Loaderをdry runとして実行するには、次のコマンドを使用します。
    graphloader authorBookMappingJDBC.groovy -graph testJDBC -address localhost -dryrun true

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

  • 読み込みスクリプトの全文は次のようになります。
    /* SAMPLE INPUT
    author:
    name:Julia Child	gender:F
    book: 
    name:Simca's Cuisine: 100 Classic French Recipes for Every Occasion	year:1972	ISBN:0-394-40152-2
    authorBook: 
    bname:Simca's Cuisine: 100 Classic French Recipes for Every Occasion	aname: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 database connection and SQL statements for data selection)
    inputDatabase = 'localhost/sample'
    db = Database.connection('jdbc:mysql://' + inputDatabase).user('root').password('foo').MySQL()
    
    // Define multiple data inputs from the database source via SQL queries
    authorInput = db.query "select * from author";
    bookInput = db.query "select * from book";
    authorBookInput = db.query "select * from authorbook";
    
    //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"
        }
    }