A.3 2表スキーマを使用したプロパティ・グラフからのデータの読取り
2表スキーマを使用して頂点表から頂点のサブセットを読み取るには、API OraclePropertyGraphUtils.readTwoTablesGraphVertexAndProperties
を使用できます。この操作は、頂点表の対応する分割で検出されたすべての行を含む、ResultSet
オブジェクトの配列を返します。配列の各ResultSet
オブジェクトは、頂点行を対応する分割からフェッチするために提供された接続のうちいずれかを使用します。分割は、指定した分割の合計数によって決定されます。
整数ID([0, N - 1]の範囲)がN分割された頂点表の分割に割り当てられます。この方法では、問合せされた分割のサブセットは、開始分割IDと開始分割IDに接続配列のサイズを足したものの間の範囲のID値を持つこれらの分割から構成されます。合計が分割の合計数よりも大きい場合、問合せされた分割のサブセットは、[開始分割ID, N - 1]の範囲のIDを持つ分割から構成されます。
次のコードは、合計で1分割を利用し、2表スキーマを使用して、頂点表からすべての頂点を読み取ります。OraclePropertyGraph
でAPIを実行することで、Blueprints Vertex Iterableの配列を容易に作成できることに注意してください。取得された頂点には、頂点表スキーマで定義されたすべてのプロパティが含まれます。
ResultSet[] rsAr = readTwoTablesGraphVertexAndProperties(conns,
"pg" /* table owner */,
"employeeNodes /* vertex table
name */,
1 /* Total Splits*/,
0 /* Start Split);
Iterable<Vertex>[] vertices = getVerticesPartitioned(rsAr /* ResultSet array */,
true /* skip store to cache */,
null /* vertex filter
callback */,
null /* optimization flag */);
読取りのパフォーマンスを最適化するために、表から読み取られる各頂点に対し取得するプロパティ名のリストを指定できます。
次のコードは、OraclePropertyGraph
APIを使用して、プロパティ・グラフemployeesGraphDAL
を作成し、2つの頂点と1つのエッジをロードします。次に、2表スキーマを使用して、頂点表employeNodes
を作成し、それにemployeesGraphDAL
の頂点からのデータを移入します。最後に、名前プロパティだけを使用して、頂点表から頂点を読み取ります。
// Create employeesGraphDAL
import oracle.pg.rdbms.*;
Oracle oracle = new Oracle(jdbcURL, username, password);
OraclePropertyGraph opgEmployees
= OraclePropertyGraph.getInstance(oracle, "employeesGraphDAL");
// Create vertex v1 and assign it properties as key-value pairs
Vertex v1 = opgEmployees.addVertex(1l);
v1.setProperty("age", Integer.valueOf(31));
v1.setProperty("name", "Alice");
v1.setProperty("address", "Main Street 12");
v1.setProperty("email", "alice@mymail.com");
v1.setProperty("SSN", "123456789");
Vertex v2 = opgEmployees.addVertex(2l);
v2.setProperty("age", Integer.valueOf(27));
v2.setProperty("name", "Bob");
v2.setProperty("adress", "Sesame Street 334");
// Add edge e1
Edge e1 = opgEmployees.addEdge(1l, v1, v2, "managerOf");
e1.setProperty("weight", 0.5d);
opgEmployees.commit();
// Prepare the vertex table using a Two Tables schema
import oracle.pgx.common.types.PropertyType;
List<String> propertyNames = new ArrayList<String>();
propertyNames.addAll(new String[4]{ "name", "age", "address", "SSN" });
List<PropertyType> = new ArrayList<PropertyType>();
propertyType.add(PropertyType.STRING);
propertyType.add(PropertyType.INTEGER);
propertyType.add(PropertyType.STRING);
propertyType.add(PropertyType.STRING);
Connection conn
= opgEmployees.getOracle().clone().getConnection(); /* Clone the connection
from the property graph
instance */
OraclePropertyGraphUtils.prepareTwoTablesGraphVertexTab(conn /* Connection object */,
pg /* table owner */,
"employeesNodes" /* vertex table name */,
propertyNames /* property names */,
propertyTypes /* property data types */,
"pgts" /* table space */,
null /* storage options */,
true /* no logging */);
// Get the vertices from the employeesDAL graph
Iterable<Vertex> vertices = opgEmployees.getVertices();
// Load the vertices into the vertex table using a Two Tables schema
Connection[] conns = new Connection[1]; /* the connection array size defines the
Degree of parallelism (multithreading)
*/
conns[1] = conn;
OraclePropertyGraphUtils.writeTwoTablesGraphVertexAndProperties(conn /* Connection
object */,
pg /* table owner */,
"employeesNodes" /* vertex table name */,
1000 /* batch size*/,
new Iterable[] {vertices} /* array of
vertex iterables */);
// Read the vertices (using only name property)
List<String> vPropertyNames = new ArrayList<String>();
vPropertyNames.add("name");
ResultSet[] rsAr = readTwoTablesGraphVertexAndProperties(conns,
"pg" /* table owner */,
"employeeNodes /* vertex table
name */,
vPropertyNames /* list of property
names */,
1 /* Total Splits*/,
0 /* Start Split);
Iterable<Vertex>[] vertices = getVerticesPartitioned(rsAr /* ResultSet array */,
true /* skip store to cache */,
null /* vertex filter
callback */,
null /* optimization flag */);
for (int idx = 0; vertices.length; idx++) {
Iterator<Vertex> it = vertices[idx].iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
前述の例では、次のような出力が生成されます。
Vertex ID 1 {name:str:Alice} Vertex ID 2 {name:str:Bob}
2表スキーマを使用してエッジ表からエッジのサブセットを読み取るには、API OraclePropertyGraphUtils.readTwoTablesGraphEdgeAndProperties
を使用できます。この操作は、頂点表の対応する分割で検出されたすべての行を含む、ResultSet
オブジェクトの配列を返します。配列の各ResultSet
オブジェクトは、頂点行を対応する分割からフェッチするために提供された接続のうちいずれかを使用します。分割は、指定した分割の合計数によって決定されます。
頂点の読取りで行われることと同様に、整数ID([0, N - 1]の範囲)がN分割された頂点表のすべての分割に割り当てられます。問合せされた分割のサブセットは、開始分割IDと開始分割IDに接続配列のサイズを足したものの間の範囲のID値を持つこれらの分割から構成されます。
次のコードは、OraclePropertyGraph
APIを使用して、プロパティ・グラフemployeesGraphDAL
を作成し、2つの頂点と1つのエッジをロードします。次に、2表スキーマを使用して、エッジ表organizationEdges
を作成し、それにemployeesGraphDAL
のエッジからのデータを移入します。最後に、名前の重みだけを使用して、表からエッジを読み取ります。
// Create employeesGraphDAL
import oracle.pg.rdbms.*;
Oracle oracle = new Oracle(jdbcURL, username, password);
OraclePropertyGraph opgEmployees
= OraclePropertyGraph.getInstance(oracle, "employeesGraphDAL");
// Create vertex v1 and assign it properties as key-value pairs
Vertex v1 = opgEmployees.addVertex(1l);
v1.setProperty("age", Integer.valueOf(31));
v1.setProperty("name", "Alice");
v1.setProperty("address", "Main Street 12");
v1.setProperty("email", "alice@mymail.com");
v1.setProperty("SSN", "123456789");
Vertex v2 = opgEmployees.addVertex(2l);
v2.setProperty("age", Integer.valueOf(27));
v2.setProperty("name", "Bob");
v2.setProperty("adress", "Sesame Street 334");
// Add edge e1
Edge e1 = opgEmployees.addEdge(1l, v1, v2, "managerOf");
e1.setProperty("weight", 0.5d);
opgEmployees.commit();
// Prepare the edge table using a Two Tables schema
import oracle.pgx.common.types.PropertyType;
List<String> propertyNames = new ArrayList<String>();
propertyNames.addAll(new String[4]{ "weight" });
List<PropertyType> = new ArrayList<PropertyType>();
propertyType.add(PropertyType.DOUBLE);
Connection conn
= opgEmployees.getOracle().clone().getConnection(); /* Clone the connection
from the property graph
instance */
OraclePropertyGraphUtils.prepareTwoTablesGraphEdgeTab(conn /* Connection object */,
pg /* table owner */,
"organizationEdges" /* edge table
name */,
propertyNames /* property names */,
propertyTypes /* property data types */,
"pgts" /* table space */,
null /* storage options */,
true /* no logging */);
// Get the edges from the employeesDAL graph
Iterable<Edge> edges = opgEmployees.getVertices();
// Load the vertices into the vertex table using a Two Tables schema
Connection[] conns = new Connection[1]; /* the connection array size defines the
Degree of parallelism (multithreading)
*/
conns[1] = conn;
OraclePropertyGraphUtils.writeTwoTablesGraphEdgeAndProperties(conn /* Connection
object */,
pg /* table owner */,
organizationEdges" /* edge table name */,
1000 /* batch size*/,
new Iterable[] {edges} /* array of
edge iterables */);
// Read the edges (using only weight property)
List<String> ePropertyNames = new ArrayList<String>();
ePropertyNames.add("weight");
ResultSet[] rsAr = readTwoTablesGraphVertexAndProperties(conns,
"pg" /* table owner */,
"organizationEdges /* edge table
name */,
ePropertyNames /* list of property
names */,
1 /* Total Splits*/,
0 /* Start Split);
Iterable<Edge>[] edges = getEdgesPartitioned(rsAr /* ResultSet array */,
true /* skip store to cache */,
null /* edge filter
callback */,
null /* optimization flag */);
for (int idx = 0; edges.length; idx++) {
Iterator<Edge> it = edges[idx].iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
前述の例では、次のような出力が生成されます。
Edge ID 1 from Vertex ID 1 {} =[references]=> Vertex ID 2 {} edgeKV[{weight:dbl:0.5}]
親トピック: 2表スキーマを使用したプロパティ・グラフの処理