5.9.7 頂点およびエッジのCSVファイルからOracle定義のプロパティ・グラフ・フラット・ファイルへの変換

アプリケーションによってはCSV (カンマ区切り値)形式を使用してグラフの頂点およびエッジをエンコードするものがあります。この形式では、CSVファイルの各レコードが、そのすべてのプロパティを含む、1つの頂点またはエッジを表します。グラフの頂点を表すCSVファイルを、Oracle定義のフラット・ファイル形式の定義(頂点の場合.opv、エッジの場合.ope)に変換できます

変換されるCSVファイルには、列名と、列を表す属性のタイプを指定するヘッダーが含まれることがあります。ヘッダーに属性名のみが含まれる場合、コンバータは、値のデータ型が文字列だと見なします。

CSVからOPVまたはOPEに変換するJava APIは、頂点またはエッジを読み取る(CSVから)元の、InputStreamを受信し、それを.opvまたは.ope形式でOutputStreamに書き込みます。コンバータAPIは変換プロセスをカスタマイズすることもできます。

次のサブトピックで、頂点およびエッジの変換手順を示します。

  • 頂点: CSVファイルのOracle定義フラット・ファイル形式(.opv)への変換

  • エッジ: CSVファイルのOracle定義フラット・ファイル形式(.ope)への変換

どちらの手順も非常に似ていますが、頂点に固有、およびエッジに固有という違いがあります。

頂点: CSVファイルのOracle定義フラット・ファイル形式(.opv)への変換

CSVファイルにヘッダーが含まれていない場合、すべての属性名(その値のデータ型にマップされる)を記述しているColumnToAttrMapping配列を、CSVファイルに現れるのと同じ順番で、指定する必要があります。さらに、頂点のIDなどの特別な列を含む、CSVファイルからの列はすべて、配列で記述される必要があります。同じCSVファイルの最初の行に列のヘッダーを指定する場合、このパラメータはnullに設定する必要があります。

列を表しているCSVファイルを変換するには、いずれかのconvertCSV2OPV APIを使用することができます。これらのAPIのうち最も単純なものには次が必要です。

  • CSVファイルから頂点を読み取るためのInputStream

  • 頂点IDを表している列の名前(この列はCSVファイルにある必要があります)

  • VIDに追加する整数オフセット(オフセットはグラフ要素のID値の衝突を避けるのに有用です)

  • ColumnToAttrMapping配列(ヘッダーがファイルで指定されている場合、これはnullである必要があります)

  • 並列度(DOP)

  • 変換の前にオフセットを示す整数(スキップする頂点のレコード数)

  • 頂点フラット・ファイル(.opv)が書き込まれるOutputStream

  • オプションで、変換の進捗をトラッキングし、エラーの発生時に何を実行するかを決定するのに使用できるDataConverterListener

追加のパラメータは、CSVファイルの別の形式を指定するのに使用できます。

  • レコードのトークンを区切るのに使用する区切り文字。デフォルトはカンマ文字','です。

  • 文字列値を引用するのに使用され、カンマなどの特殊文字を含めることができる、引用符。文字列値そのものに引用符が表れた場合、重複か、またはバックスラッシュ文字'\'をその前に配置することのいずれかで、エスケープする必要があります。次に例を示します。

    • """Hello, world"", the screen showed…"

    • "But Vader replied: \"No, I am your father.\""

  • 日付値を解析するのに使用する日付書式。CSVの変換の場合、このパラメータはnullにすることができますが、CSVに特定の日付書式がある場合には指定することをお薦めします。特定の日付書式を指定すると、日付値を解析しようとするときに、その書式が最初のオプションとして使用されるので、パフォーマンス上役立ちます。日付書式の例は、次のとおりです。

    • "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"

    • "MM/dd/yyyy HH:mm:ss"

    • "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'"

    • "dddd, dd MMMM yyyy hh:mm:ss"

    • "yyyy-MM-dd"

    • "MM/dd/yyyy"

  • CSVファイルに文字列値と改行文字が含まれることを示すフラグ。このパラメータがtrueに設定されていると、改行文字または引用符が値として含まれているファイル内のすべての文字列は、引用符で囲まれる必要があります。

    • "The first lines of Don Quixote are:""In a village of La Mancha, the name of which I have no desire to call to mind""."

次のコード・フラグメントは、ColumnToAttrMapping配列を作成する方法と、APIを使用して、CSVファイルを.opvファイルに変換する方法を示します。

    String inputCSV             = "/path/mygraph-vertices.csv";
    String outputOPV            = "/path/mygraph.opv"; 
    ColumnToAttrMapping[] ctams = new ColumnToAttrMapping[4];
    ctams[0]                    = ColumnToAttrMapping.getInstance("VID",   Long.class);
    ctams[1]                    = ColumnToAttrMapping.getInstance("name",  String.class);
    ctams[2]                    = ColumnToAttrMapping.getInstance("score", Double.class);
    ctams[3]                    = ColumnToAttrMapping.getInstance("age",   Integer.class);
    String vidColumn            = "VID";

    isCSV = new FileInputStream(inputCSV);
    osOPV = new FileOutputStream(new File(outputOPV));
      
    // Convert Vertices
    OraclePropertyGraphUtilsBase.convertCSV2OPV(isCSV, vidColumn, 0, ctams, 1, 0, osOPV, null);
    isOPV.close();
    osOPV.close();

この例では、変換されるCSVファイルには、ヘッダーが含まれず、4つの列(列ID、名前、スコア、および年齢)が含まれる必要があります。次にCVSの例を示します。

1,John,4.2,30
2,Mary,4.3,32
3,"Skywalker, Anakin",5.0,46
4,"Darth Vader",5.0,46
5,"Skywalker, Luke",5.0,53

結果の.opvファイルは次のようになります。

1,name,1,John,,
1,score,4,,4.2,
1,age,2,,30,
2,name,1,Mary,,
2,score,4,,4.3,
2,age,2,,32,
3,name,1,Skywalker%2C%20Anakin,,
3,score,4,,5.0,
3,age,2,,46,
4,name,1,Darth%20Vader,,
4,score,4,,5.0,
4,age,2,,46,
5,name,1,Skywalker%2C%20Luke,,
5,score,4,,5.0,
5,age,2,,53,

エッジ: CSVファイルのOracle定義フラット・ファイル形式(.ope)への変換

CSVファイルにヘッダーが含まれていない場合、すべての属性名(その値のデータ型にマップされる)を記述しているColumnToAttrMapping配列を、CSVファイルに現れるのと同じ順番で、指定する必要があります。さらに、適用される場合はエッジのID、必要なSTART_ID、END_ID、TYPEなどの特別な列を含む、CSVファイルからの列はすべて、配列で記述される必要があります。同じCSVファイルの最初の行に列のヘッダーを指定する場合、このパラメータはnullに設定する必要があります。

列を表しているCSVファイルを変換するには、いずれかのconvertCSV2OPE APIを使用することができます。これらのAPIのうち最も単純なものには次が必要です。

  • CSVファイルから頂点を読み取るためのInputStream

  • エッジIDを表している列の名前(これはCSVファイルではオプションで、存在しない場合は行番号がIDとして使用されます)

  • EIDに追加する整数オフセット(オフセットはグラフ要素のID値の衝突を避けるのに有用です)

  • 出力頂点IDを表している列の名前(この列はCSVファイルにある必要があります)

  • 入力頂点IDを表している列の名前(この列はCSVファイルにある必要があります)

  • VIDへのオフセット(lOffsetVID)。このオフセットは元のSVIDおよびDVID値の先頭に追加されます。(このAPIのバリエーションは2つの引数(lOffsetSVIDおよびlOffsetDVID)をとります。1つはSVID用のオフセット、もう1つはDVID用オフセットです)

  • エッジ・ラベル列がCSVファイルにあるかどうかを示すブール・フラグ。

  • エッジ・ラベルを表している列の名前(この列がCSVファイルにない場合は、このパラメータはすべてのエッジ・ラベルの定数として使用されます)

  • ColumnToAttrMapping配列(ヘッダーがファイルで指定されている場合、これはnullである必要があります)

  • 並列度(DOP)

  • 変換の前にオフセットを示す整数(スキップするエッジのレコード数)

  • エッジ・フラット・ファイル(.ope)が書き込まれるOutputStream

  • オプションで、変換の進捗をトラッキングし、エラーの発生時に何を実行するかを決定するのに使用できるDataConverterListener

追加のパラメータは、CSVファイルの別の形式を指定するのに使用できます。

  • レコードのトークンを区切るのに使用する区切り文字。デフォルトはカンマ文字','です。

  • 文字列値を引用するのに使用され、カンマなどの特殊文字を含めることができる、引用符。文字列値そのものに引用符が表れた場合、重複か、またはバックスラッシュ文字'\'をその前に配置することのいずれかで、エスケープする必要があります。次に例を示します。

    • """Hello, world"", the screen showed…"

    • "But Vader replied: \"No, I am your father.\""

  • 日付値を解析するのに使用する日付書式。CSVの変換の場合、このパラメータはnullにすることができますが、CSVに特定の日付書式がある場合には指定することをお薦めします。特定の日付書式を指定すると、日付値を解析しようとするときに、その書式が最初のオプションとして使用されるので、パフォーマンス上役立ちます。日付書式の例は、次のとおりです。

    • "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"

    • "MM/dd/yyyy HH:mm:ss"

    • "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'"

    • "dddd, dd MMMM yyyy hh:mm:ss"

    • "yyyy-MM-dd"

    • "MM/dd/yyyy"

  • CSVファイルに文字列値と改行文字が含まれることを示すフラグ。このパラメータがtrueに設定されていると、改行文字または引用符が値として含まれているファイル内のすべての文字列は、引用符で囲まれる必要があります。

    • "The first lines of Don Quixote are:""In a village of La Mancha, the name of which I have no desire to call to mind""."

次のコード・フラグメントは、APIを使用して、CSVファイルを.opeファイルとnullのColumnToAttrMapping配列に変換する方法を示します。

    String inputOPE    = "/path/mygraph-edges.csv";
    String outputOPE   = "/path/mygraph.ope"; 
    String eidColumn   = null;             // null implies that an integer sequence will be used
    String svidColumn  = "START_ID";
    String dvidColumn  = "END_ID";
    boolean hasLabel   = true;
    String labelColumn = "TYPE";

    isOPE = new FileInputStream(inputOPE);
    osOPE = new FileOutputStream(new File(outputOPE));
      
    // Convert Edges
    OraclePropertyGraphUtilsBase.convertCSV2OPE(isOPE, eidColumn, 0, svidColumn, dvidColumn, hasLabel, labelColumn, null, 1, 0, osOPE, null);

前述の例を使用して変換される入力CSVには、列名とその型を指定するヘッダーが含まれる必要があります。次にCSVファイルの例を示します。

START_ID:long,weight:float,END_ID:long,:TYPE
1,1.0,2,loves
1,1.0,5,admires
2,0.9,1,loves
1,0.5,3,likes
2,0.0,4,likes
4,1.0,5,is the dad of
3,1.0,4,turns to
5,1.0,3,saves from the dark side

結果の.opeファイルは次のようになります。

1,1,2,loves,weight,3,,1.0,
2,1,5,admires,weight,3,,1.0,
3,2,1,loves,weight,3,,0.9,
4,1,3,likes,weight,3,,0.5,
5,2,4,likes,weight,3,,0.0,
6,4,5,is%20the%20dad%20of,weight,3,,1.0,
7,3,4,turns%20to,weight,3,,1.0,
8,5,3,saves%20from%20the%20dark%20side,weight,3,,1.0,