CSV で Vector プロパティをロードする

環境

Oracle Graph Server Shell 20.1.0
PGX server version: 19.4.0 type: SM
PGX server API version: 3.6.0
PGQL version: 1.2

前提

  • Pgx Server で allow_local_filesystem が true になっており、かつ datasource_dir_whitelist/opt/oracle/oradata ディレクトリが指定されている
$ cat /etc/oracle/graph/pgx.conf
{
  "allow_local_filesystem": true,
  "datasource_dir_whitelist": ["/opt/oracle/oradata"],
...
}
  • Pgx Server が稼働するサーバの /opt/oracle/oradata/opt/oracle/oradata/sample.vertices.csv/opt/oracle/oradata/sample.edges.csv が格納されている。

/opt/oracle/oradata/vector_props.vertices.csv

1,1;2;3,0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90;91;92;93;94;95;96;97;98;99,0.0;0.01;0.02;0.03;0.04;0.05;0.06;0.07;0.08;0.09;0.1;0.11;0.12;0.13;0.14;0.15;0.16;0.17;0.18;0.19;0.2;0.21;0.22;0.23;0.24;0.25;0.26;0.27;0.28;0.29;0.3;0.31;0.32;0.33;0.34;0.35;0.36;0.37;0.38;0.39;0.4;0.41;0.42;0.43;0.44;0.45;0.46;0.47;0.48;0.49;0.5;0.51;0.52;0.53;0.54;0.55;0.56;0.57;0.58;0.59;0.6;0.61;0.62;0.63;0.64;0.65;0.66;0.67;0.68;0.69;0.7;0.71;0.72;0.73;0.74;0.75;0.76;0.77;0.78;0.79;0.8;0.81;0.82;0.83;0.84;0.85;0.86;0.87;0.88;0.89;0.9;0.91;0.92;0.93;0.94;0.95;0.96;0.97;0.98;0.99,"hoge0;hoge1;hoge2;hoge3;hoge4;hoge5;hoge6;hoge7;hoge8;hoge9;hoge10;hoge11;hoge12;hoge13;hoge14;hoge15;hoge16;hoge17;hoge18;hoge19;hoge20;hoge21;hoge22;hoge23;hoge24;hoge25;hoge26;hoge27;hoge28;hoge29;hoge30;hoge31;hoge32;hoge33;hoge34;hoge35;hoge36;hoge37;hoge38;hoge39;hoge40;hoge41;hoge42;hoge43;hoge44;hoge45;hoge46;hoge47;hoge48;hoge49;hoge50;hoge51;hoge52;hoge53;hoge54;hoge55;hoge56;hoge57;hoge58;hoge59;hoge60;hoge61;hoge62;hoge63;hoge64;hoge65;hoge66;hoge67;hoge68;hoge69;hoge70;hoge71;hoge72;hoge73;hoge74;hoge75;hoge76;hoge77;hoge78;hoge79;hoge80;hoge81;hoge82;hoge83;hoge84;hoge85;hoge86;hoge87;hoge88;hoge89;hoge90;hoge91;hoge92;hoge93;hoge94;hoge95;hoge96;hoge97;hoge98;hoge99"

/opt/oracle/oradata/vector_props.edges.csv

1,2,1;2;3

CSV ファイルをロードする

var gcb = GraphConfigBuilder.forFileFormat(Format.CSV).
            addVertexUri("/opt/oracle/oradata/vector_props.vertices.csv").
            addEdgeUri("/opt/oracle/oradata/vector_props.edges.csv")

// Vector タイプの PropertyType. 第三引数で次元を指定
gcb.addVertexVectorProperty("vp_vector_int", PropertyType.INTEGER, 3)
gcb.addVertexVectorProperty("vp_vector_long", PropertyType.LONG, 100)
gcb.addVertexVectorProperty("vp_vector_double", PropertyType.DOUBLE, 100)
gcb.addVertexVectorProperty("vp_vector_string", PropertyType.STRING, 100)
gcb.addEdgeVectorProperty("ep_vector_int", PropertyType.INTEGER, 3)

var g = session.readGraphWithProperties(gcb.build())

// Vector 型のプロパティの値の取り出し方
var vec_v_int_prop = g.getVertex(1).getProperty("vp_vector_int")
// => vec_v_int_prop ==> PgxVect[type=integer,dimension=3]

var vec_v_int = (oracle.pgx.common.util.vector.Vect<Integer>) (vec_v_int_prop)
/*
 * |  Warning:
 * |  unchecked cast
 * |    required: oracle.pgx.common.util.vector.Vect<java.lang.Integer>
 * |    found:    java.lang.Object
 * |  var vec_v_int = (oracle.pgx.common.util.vector.Vect<Integer>) (vec_v_int_prop);
 * |                                                                ^--------------^
 * vec_v_int ==> PgxVect[type=integer,dimension=3]
 */

vec_v_int.toArray()
// $231 ==> Integer[3] { 1, 2, 3 }

// String 型の vector は java.lang.NullPointerException が発生する
g.getVertex(1).getProperty("vp_vector_string")
/*
 *  Exception java.util.concurrent.ExecutionException: java.lang.NullPointerException
 *|        at CompletableFuture.reportGet (CompletableFuture.java:395)
 *|        at CompletableFuture.get (CompletableFuture.java:1999)
 *|        at PgxFuture.get (PgxFuture.java:99)
 *|        at PgxEntity.getProperty (PgxEntity.java:280)
 *|        at (#284:1)
 *|  Caused by: java.lang.NullPointerException
 *|        at PgxEntity.lambda$getPropertyAsync$1 (PgxEntity.java:191)
 *|        at CompletableFuture$UniCompose.tryFire (CompletableFuture.java:1072)
 *|        at CompletableFuture.postComplete (CompletableFuture.java:506)
 *|        at CompletableFuture.complete (CompletableFuture.java:2073)
 *|        at PgxFuture.completeWithResultOrException (PgxFuture.java:55)
 *|        at CompletableFuture.uniWhenComplete (CompletableFuture.java:859)
 *|        at CompletableFuture$UniWhenComplete.tryFire (CompletableFuture.java:837)
 *|        at CompletableFuture.postComplete (CompletableFuture.java:506)
 *|        at CompletableFuture.complete (CompletableFuture.java:2073)
 *|        at PgxRemoteFuture.executeRequest (PgxRemoteFuture.java:107)
 *|        at PgxRemoteFuture.lambda$fetchRemoteResultAsync$3 (PgxRemoteFuture.java:218)
 *|        at ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1128)
 *|        at ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:628)
 *|        at Thread.run (Thread.java:834)
 */

Graph Config Json からロードする方法

  • クライアント側に以下の JSON ファイルを用意する (/tmp/vector_prps_csv.json)
{
    "format": "csv",
    "edge_props": [{
        "type": "integer",
        "name": "ep_vector_int",
        "dimension": 3
    }],
    "error_handling": {},
    "vertex_id_type": "integer",
    "vertex_uris": ["/opt/oracle/oradata/vector_props.vertices.csv"],
    "attributes": {},
    "edge_uris": ["/opt/oracle/oradata/vector_props.edges.csv"],
    "loading": {},
    "vertex_props": [{
        "type": "integer",
        "name": "vp_vector_int",
        "dimension": 3
    }, {
        "type": "long",
        "name": "vp_vector_long",
        "dimension": 100
    }, {
        "type": "double",
        "name": "vp_vector_double",
        "dimension": 100
    }]
}
  • PGX Client を起動して、Graph をロードする
// Graph Config Json ファイルは PGX Client 側に配置されているものを読みにいく
var g = session.readGraphWithProperties("/tmp/vector_props_csv.json")