ローカルにある CSV で Graph をロードする

環境

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/sample.vertices.csv

1,VL,0.1,1,1,true,2020-04-20,23:59:59.000000059,2020-04-20T16:46:40.000000300,2020-11-11T01:01:01.000000001+09:00,23:30:30.000000030+09:00,0.1,"hoge",2,4
2,VL,-2.0,2,100000000000000000,false,2020-04-20,23:59:59.000000059,2020-04-20T16:46:40.000000300,2020-11-11T01:01:01.000000001+09:00,23:30:30.000000030+09:00,0.2,"hage",3,1
3,VL,0.3,-3,-2222222222222222,false,2020-04-20,23:59:59.000000059,2020-04-20T16:46:40.000000300,2020-11-11T01:01:01.000000001+09:00,23:30:30.000000030+09:00,0.3,"hige",4,4
4,VL,4.56789,3,-3333333333333,true,2020-04-20,23:59:59.000000059,2020-04-20T16:46:40.000000300,2020-11-11T01:01:01.000000001+09:00,23:30:30.000000030+09:00,0.4,"huga",1,2

/opt/oracle/oradata/sample.edges.csv

1,2,EL,0.1,1,1,true,2020-04-20,23:59:59.000000059,2020-04-20T16:46:40.000000300,2020-11-11T01:01:01.000000001+09:00,23:30:30.000000030+09:00,0.1,"hoge",2,4
2,1,EL,-2.0,2,100000000000000000,false,2020-04-20,23:59:59.000000059,2020-04-20T16:46:40.000000300,2020-11-11T01:01:01.000000001+09:00,23:30:30.000000030+09:00,0.2,"hage",3,1
2,3,EL,0.3,-3,-2222222222222222,false,2020-04-20,23:59:59.000000059,2020-04-20T16:46:40.000000300,2020-11-11T01:01:01.000000001+09:00,23:30:30.000000030+09:00,0.3,"hige",4,4
4,2,EL,4.56789,3,-3333333333333,true,2020-04-20,23:59:59.000000059,2020-04-20T16:46:40.000000300,2020-11-11T01:01:01.000000001+09:00,23:30:30.000000030+09:00,0.4,"huga",1,2

CSV ファイルをロードする

var gcb = GraphConfigBuilder.forFileFormat(Format.CSV).
                addVertexUri("/opt/oracle/oradata/sample.vertices.csv").
                addEdgeUri("/opt/oracle/oradata/sample.edges.csv").
                setVertexIdType(IdType.INTEGER).
                setTimeFormat(Arrays.asList("HH:mm:ss.SSSSSSSSS")).
                setTimeWithTimezoneFormat(Arrays.asList("HH:mm:ss.SSSSSSSSSXXX")).
                setTimestampFormat(Arrays.asList("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS")).
                setTimestampWithTimezoneFormat(Arrays.asList("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSXXX"))

// Vertex Properties
gcb.addVertexProperty("vp_double",    PropertyType.DOUBLE)
gcb.addVertexProperty("vp_integer",   PropertyType.INTEGER)
gcb.addVertexProperty("vp_long",      PropertyType.LONG)
gcb.addVertexProperty("vp_boolean",   PropertyType.BOOLEAN)
gcb.addVertexProperty("vp_local_date",PropertyType.LOCAL_DATE)
gcb.addVertexProperty("vp_time",      PropertyType.TIME)
gcb.addVertexProperty("vp_timestamp", PropertyType.TIMESTAMP)
gcb.addVertexProperty("vp_timestamp_with_timezone", PropertyType.TIMESTAMP_WITH_TIMEZONE)
gcb.addVertexProperty("vp_time_with_timezone", PropertyType.TIME_WITH_TIMEZONE)
gcb.addVertexProperty("vp_float",     PropertyType.FLOAT)
gcb.addVertexProperty("vp_string",    PropertyType.STRING)
gcb.addVertexProperty("vp_vertex",    PropertyType.VERTEX)
gcb.addVertexProperty("vp_edge",      PropertyType.EDGE)

// Edge Properties
gcb.addEdgeProperty("ep_double",    PropertyType.DOUBLE)
gcb.addEdgeProperty("ep_integer",   PropertyType.INTEGER)
gcb.addEdgeProperty("ep_long",      PropertyType.LONG)
gcb.addEdgeProperty("ep_boolean",   PropertyType.BOOLEAN)
gcb.addEdgeProperty("ep_local_date",PropertyType.LOCAL_DATE)
gcb.addEdgeProperty("ep_time",      PropertyType.TIME)
gcb.addEdgeProperty("ep_timestamp", PropertyType.TIMESTAMP)
gcb.addEdgeProperty("ep_timestamp_with_timezone", PropertyType.TIMESTAMP_WITH_TIMEZONE)
gcb.addEdgeProperty("ep_time_with_timezone", PropertyType.TIME_WITH_TIMEZONE)
gcb.addEdgeProperty("ep_float",      PropertyType.FLOAT)
gcb.addEdgeProperty("ep_string",      PropertyType.STRING)
gcb.addEdgeProperty("ep_vertex",      PropertyType.VERTEX)
gcb.addEdgeProperty("ep_edge",      PropertyType.EDGE)

// Label
gcb.setLoadVertexLabels(true)
gcb.setLoadEdgeLabel(true)

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

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

  • クライアント側に以下の JSON ファイルを用意する (/tmp/sample_csv.json)
{
    "attributes": {},
    "error_handling": {},
    "timestamp_with_timezone_format": ["yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSXXX"],
    "vertex_props": [{
        "type": "double",
        "dimension": 0,
        "name": "vp_double"
    }, {
        "type": "integer",
        "dimension": 0,
        "name": "vp_integer"
    }, {
        "type": "long",
        "dimension": 0,
        "name": "vp_long"
    }, {
        "type": "boolean",
        "dimension": 0,
        "name": "vp_boolean"
    }, {
        "type": "local_date",
        "dimension": 0,
        "name": "vp_local_date"
    }, {
        "type": "time",
        "dimension": 0,
        "name": "vp_time"
    }, {
        "type": "timestamp",
        "dimension": 0,
        "name": "vp_timestamp"
    }, {
        "type": "timestamp_with_timezone",
        "dimension": 0,
        "name": "vp_timestamp_with_timezone"
    }, {
        "type": "time_with_timezone",
        "dimension": 0,
        "name": "vp_time_with_timezone"
    }, {
        "type": "float",
        "dimension": 0,
        "name": "vp_float"
    }, {
        "type": "string",
        "dimension": 0,
        "name": "vp_string"
    }, {
        "type": "vertex",
        "dimension": 0,
        "name": "vp_vertex"
    }, {
        "type": "edge",
        "dimension": 0,
        "name": "vp_edge"
    }],
    "format": "csv",
    "timestamp_format": ["yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS"],
    "time_format": ["HH:mm:ss.SSSSSSSSS"],
    "vertex_id_type": "integer",
    "loading": {
        "load_vertex_labels": true,
        "load_edge_label": true
    },
    "vertex_uris": ["/opt/oracle/oradata/sample.vertices.csv"],
    "edge_props": [{
        "type": "double",
        "dimension": 0,
        "name": "ep_double"
    }, {
        "type": "integer",
        "dimension": 0,
        "name": "ep_integer"
    }, {
        "type": "long",
        "dimension": 0,
        "name": "ep_long"
    }, {
        "type": "boolean",
        "dimension": 0,
        "name": "ep_boolean"
    }, {
        "type": "local_date",
        "dimension": 0,
        "name": "ep_local_date"
    }, {
        "type": "time",
        "dimension": 0,
        "name": "ep_time"
    }, {
        "type": "timestamp",
        "dimension": 0,
        "name": "ep_timestamp"
    }, {
        "type": "timestamp_with_timezone",
        "dimension": 0,
        "name": "ep_timestamp_with_timezone"
    }, {
        "type": "time_with_timezone",
        "dimension": 0,
        "name": "ep_time_with_timezone"
    }, {
        "type": "float",
        "dimension": 0,
        "name": "ep_float"
    }, {
        "type": "string",
        "dimension": 0,
        "name": "ep_string"
    }, {
        "type": "vertex",
        "dimension": 0,
        "name": "ep_vertex"
    }, {
        "type": "edge",
        "dimension": 0,
        "name": "ep_edge"
    }],
    "edge_uris": ["/opt/oracle/oradata/sample.edges.csv"],
    "time_with_timezone_format": ["HH:mm:ss.SSSSSSSSSXXX"]
}
  • PGX Client を起動して、Graph をロードする
// Graph Config Json ファイルは PGX Client 側に配置されているものを読みにいく
var g = session.readGraphWithProperties("/tmp/sample_csv.json")