5.9.2 エッジ・ファイル

エッジ・ファイルの各行は、プロパティ・グラフの1つのエッジを記述する1つのレコードです。1つのレコードはエッジの1つのキー値プロパティを記述できるので、複数のプロパティを含むエッジを記述する場合は複数のレコードが使用されます。

レコードには、カンマで区切られた9つのフィールドが含まれています。各レコードには、値があるかどうかに関係なく、すべてのフィールドを区切るために8つのカンマが含まれている必要があります。

edge_ID, source_vertex_ID, destination_vertex_ID, edge_label, key_name, value_type, value, value, value

次の表では、エッジ・ファイルのレコードを構成するフィールドについて説明します。

表5-1 エッジ・ファイルのレコードの形式

フィールド番号 名前 説明

1

edge_ID

エッジを一意に識別する整数。

2

source_vertex_ID

エッジの出力始点のvertex_ID

3

destination_vertex_ID

エッジの入力終点のvertex_ID

4

edge_label

2つの頂点間の関係を記述する、エッジのエンコードされたラベル。

5

key_name

キー値ペアのキーのエンコードされた名前。

エッジにプロパティが指定されていない場合は、空白(%20)を入力します。この例は、プロパティが指定されていないエッジ100を示してします。

100,1,2,likes,%20,,,,

6

value_type

キー値ペアの値のデータ型を表す整数。

  • 1 String
  • 2 Integer
  • 3 Float
  • 4 Double
  • 5 Timestamp (date)
  • 6 Boolean
  • 7 Long integer
  • 8 Short integer
  • 9 Byte
  • 10 Char
  • 20 Spatial
  • 101 シリアライズ可能Javaオブジェクト

7

value

数値でもタイムスタンプ(日付)でもない場合のkey_nameのエンコードされたnullでない値

8

value

数値の場合のkey_nameのエンコードされたnullではない値

9

value

タイムスタンプ(日付)の場合のkey_nameのエンコードされたnullではない値

日付の形式を識別するには、Java SimpleDateFormatクラスを使用します。この例は、2015-03-26Th00:00:00.000-05:00という日付形式について説明しています。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); encode(sdf.format((java.util.Date) value));

エッジの必須グループ化: 1つのエッジには複数のプロパティを指定でき、エッジ・ファイルには、エッジIDとそのエッジの1つのプロパティの組み合わせごとに1つのレコード(フラット・ファイル内の単一テキスト行によって表現される)が含まれます。エッジ・ファイルでは、各エッジのすべてのレコードがまとめてグループ化されている(つまり、他のエッジのレコードが間に入っていない)必要があります。これは任意の方法で行えますが、便利な方法は、エッジ・ファイルのレコードをエッジID別に昇順(または降順)にソートすることです。(ただし、エッジ・ファイルのすべてのレコードをエッジID別にソートする必要があるわけではありません。これはグループ化要件を満たすための単なる1つの方法です)。

Oracleフラット・ファイル形式でエッジ・ファイルを構築する場合、エッジ・プロパティ名と値フィールドが適切にエンコードされていることを確認することが重要です(特に特殊文字のエンコーディングを参照)。エンコーディングを簡素化するには、OraclePropertyGraphUtils.escape Java APIを使用できます。

OraclePropertyGraphUtils.outputEdgeRecord(os, eid, svid, dvid, label, key, value)ユーティリティ・メソッドを使用して、エッジ・レコードをOracleフラット・ファイル形式で直接直列化できます。このメソッドでは、特殊文字のエンコーディングについて心配する必要はありません。このメソッドは、eidによって識別される特定のエッジのキー/値プロパティを記述する新しいテキスト行を特定の出力ストリーム内に書き込みます。

例5-24 OraclePropertyGraphUtils.outputEdgeRecordの使用

この例では、OraclePropertyGraphUtils.outputEdgeRecordを使用して、ラベルfriendOfを使用して頂点1と2の間にエッジ100の新しい行を2本書き込んでいます。

OutputStream os = new FileOutputStream("./example.ope");
int sinceYear = 2009;
long eid = 100;
long svid = 1;
long dvid = 2;
OraclePropertyGraphUtils.outputEdgeRecord(os, eid, svid, dvid, "friendOf", "since (year)", sinceYear);
OraclePropertyGraphUtils.outputEdgeRecord(os, eid, svid, dvid, "friendOf", "weight", 1);
os.flush();
os.close();

生成される出力ファイルの1行目では、プロパティ「since (year)」が値2009を使用して記述され、2行目および次の行でエッジの重みが1に設定されています。

% cat example.ope
100,1,2,friendOf,since%20(year),2,,2009,
100,1,2,friendOf,weight,2,,1,