6.1 Loading a SQL Property Graph Using the readGraphByName API
You can load a SQL property graph into the graph server (PGX) by calling the
readGraphByName
API on a PgxSession
object.
When loading a SQL property graph into the graph server (PGX), the full graph schema will be determined and mapped to a graph configuration. The graphs will be loaded as partitioned graphs where each vertex or edge table will be mapped to the respective vertex or edge provider of the same name. Labels and properties will also be loaded as defined.
However, note that only one label per vertex or edge table is supported in order to load a SQL graph into the graph server (PGX).
For example, consider the following SQL property graph:
CREATE PROPERTY GRAPH student_network
VERTEX TABLES (
persons KEY (person_id)
LABEL person
PROPERTIES (person_id, name, birthdate AS dob)
)
EDGE TABLES (
friendships AS friends
KEY (friendship_id)
SOURCE KEY (person_a) REFERENCES persons(person_id)
DESTINATION KEY (person_b) REFERENCES persons(person_id)
PROPERTIES (friendship_id, meeting_date)
);
You can load this SQL graph into memory as shown:
opg4j> var graph = session.readGraphByName ("STUDENT_NETWORK",GraphSource.PG_SQL)
graph ==> PgxGraph[name=STUDENTS_NETWORK,N=4,E=4,created=1681007796946]
PgxGraph graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL);
>>> graph = session.read_graph_by_name("STUDENT_NETWORK", "pg_sql")
>>> graph
PgxGraph(name: STUDENTS_NETWORK, v: 4, e: 4, directed: True, memory(Mb): 0)
- Loading a SQL Property Graph from a Different Schema
You can specify the schema name when using thereadGraphByName
API for loading a SQL property graph. - Loading a SQL Property Graph Using Graph Optimization Options
You can optimize the read or update performance, when loading a SQL property graph using the graph optimization options. - Loading a SQL Property Graph Using OnMissingVertex Options
If either the source or destination vertex or both are missing for an edge, then you can use theOnMissingVertexOption
to specify the behavior for handling the edge with the missing vertex. - Loading a SQL Property Graph with Properties Mapped to CLOB Data Type Columns
You can load a SQL property graph from a database table having a CLOB data type column into the graph server (PGX).
Parent topic: Loading a SQL Property Graph into the Graph Server (PGX)
6.1.1 Loading a SQL Property Graph from a Different Schema
You can specify the schema name when using the
readGraphByName
API for loading a SQL property graph.
If you only provide the graph name when calling the
readGraphByName
API, it is assumed that the graph is owned by current
user. But if you want to load a graph owned by another user, then you must provide the
schema name as well. Also, ensure that you have SELECT
permission on the
SQL graph and all its underlying data tables.
The following example loads a SQL property graph
from the GRAPHUSER
schema:
opg4j> var graph = session.readGraphByName("GRAPHUSER", "STUDENT_NETWORK", GraphSource.PG_SQL)
graph ==> PgxGraph[name=STUDENT_NETWORK,N=4,E=4,created=1680769031393]
PgxGraph graph = session.readGraphByName("GRAPHUSER", "STUDENT_NETWORK", GraphSource.PG_SQL);
>>> graph = session.read_graph_by_name("STUDENT_NETWORK", "pg_sql", "GRAPHUSER")
>>> graph
PgxGraph(name: STUDENT_NETWORK_2, v: 4, e: 4, directed: True, memory(Mb): 0)
6.1.2 Loading a SQL Property Graph Using Graph Optimization Options
You can optimize the read or update performance, when loading a SQL property graph using the graph optimization options.
The following example shows loading a SQL property graph optimized for
READ
operation:
opg4j> var graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
...> ReadGraphOption.optimizeFor(GraphOptimizedFor.READ))
graph ==> PgxGraph[name=STUDENT_NETWORK,N=4,E=4,created=1681008951415]
PgxGraph graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
ReadGraphOption.optimizeFor(GraphOptimizedFor.READ);
>>> session.read_graph_by_name('STUDENT_NETWORK', 'pg_sql', options=['optimized_for_read'])
PgxGraph(name: STUDENT_NETWORK, v: 4, e: 4, directed: True, memory(Mb): 0)
The following example shows loading a SQL property graph optimized for
UPDATE
operation. Also, note that the READ
and
UPDATE
options cannot be used at the same time.
opg4j> var graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
...> ReadGraphOption.optimizeFor(GraphOptimizedFor.UPDATES))
graph ==> PgxGraph[name=STUDENT_NETWORK_2,N=4,E=4,created=1681009073501]
PgxGraph graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
ReadGraphOption.optimizeFor(GraphOptimizedFor.UPDATES));
>>> session.read_graph_by_name('STUDENT_NETWORK', 'pg_sql', options=['optimized_for_updates'])
PgxGraph(name: STUDENT_NETWORK, v: 4, e: 4, directed: True, memory(Mb): 0)
The following example shows loading a SQL property graph with the
SYNCHRONIZABLE
optimization option. This option can be used in
combination with the READ
and UPDATE
options.
opg4j> var graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
...> ReadGraphOption.SYNCHRONIZABLE)
graph ==> PgxGraph[name=STUDENT_NETWORK,N=4,E=4,created=1696341305374]
PgxGraph graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
ReadGraphOption.SYNCHRONIZABLE);
>>> session.read_graph_by_name('STUDENT_NETWORK', 'pg_sql', options=['synchronizable'])
PgxGraph(name: STUDENT_NETWORK_2, v: 4, e: 4, directed: True, memory(Mb): 0)
See Also:
Using the Graph Optimization Options for more information.6.1.3 Loading a SQL Property Graph Using
OnMissingVertex
Options
If either the source or destination vertex or both are missing for an edge,
then you can use the OnMissingVertexOption
to specify the behavior for handling
the edge with the missing vertex.
OnMissingVertex.ERROR
(default): Specifies that an error must be thrown for edges with missing source or destination vertex.OnMissingVertex.IGNORE_EDGE
: Specifies that the edge for a missing source or destination vertex must be ignored.OnMissingVertex.IGNORE_EDGE_LOG
: Specifies that the edge for a missing source or destination vertex must be ignored and all ignored edges must be logged.OnMissingVertex.IGNORE_EDGE_LOG_ONCE
: Specifies that the edge for a missing source or destination vertex must be ignored and only the first ignored edge must be logged.
The following example loads a SQL property graph by ignoring the edges with missing vertices and logging only the first ignored edge.
opg4j> session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
...> ReadGraphOption.onMissingVertex(OnMissingVertex.IGNORE_EDGE_LOG_ONCE))
$2 ==> PgxGraph[name=STUDENT_NETWORK_2,N=4,E=4,created=1697264084059]
PgxGraph graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
ReadGraphOption.onMissingVertex(OnMissingVertex.IGNORE_EDGE_LOG_ONCE));
>>> session.read_graph_by_name('STUDENT_NETWORK', 'pg_sql',
options=['on_missing_vertex_ignore_edge_log_once'])
PgxGraph(name: STUDENT_NETWORK, v: 4, e: 4, directed: True, memory(Mb): 0)
6.1.4 Loading a SQL Property Graph with Properties Mapped to CLOB Data Type Columns
You can load a SQL property graph from a database table having a CLOB data type column into the graph server (PGX).
The CLOB data type columns are processed as String
properties
in the graph server (PGX).
For example, consider the following sample data in the database:
CREATE TABLE depts (
dept_id NUMBER,
dept_name VARCHAR2 (10),
emp_details CLOB,
CONSTRAINT employees_pk PRIMARY KEY (dept_id)
);
INSERT INTO depts
VALUES (1, 'HR', '
<employees>
<employee empNo="1234" eName="SMITH" hireDate="17-DEC-1990"></employee>
<employee empNo="5678" ename="ALLEN" hireDate="02-JAN-1981"></employee>
</employees>
');
INSERT INTO depts
VALUES (2, 'IT', '
<employees>
<employee empNo="5628" ename="JONES" hireDate="13-MAR-1986"></employee>>
<employee empNo="5628" ename="TOM" hireDate="13-MAR-1986"></employee>>
</employees>
');
Create a SQL property graph created using the CREATE PROPERTY
GRAPH
DDL statement.
CREATE PROPERTY GRAPH dept
VERTEX TABLES (
DEPTS KEY (dept_id)
LABEL dept
PROPERTIES (dept_id, dept_name, emp_details)
)
Load the graph into the graph server (PGX) as shown:
opg4j> var g = session.readGraphByName("DEPT", GraphSource.PG_SQL)
g ==> PgxGraph[name=DEPT,N=2,E=0,created=1727242485228]
opg4j> g.queryPgql("SELECT n.* FROM MATCH (n:dept)").print()
+--------------------------------------------------------------------------------------------------
| DEPT_ID | DEPT_NAME | EMP_DETAILS
| 2.0 | IT | <employees>
<employee empNo="5628" ename="JONES" hireDate="13-MAR-1986"></employee>>
<employee empNo="5628" ename="TOM" hireDate="13-MAR-1986"></employee>>
</employees> |
| 1.0 | HR | <employees>
<employee empNo="1234" eName="SMITH" hireDate="17-DEC-1990"></employee>
<employee empNo="5678" ename="ALLEN" hireDate="02-JAN-1981"></employee>
</employees>
|
+--------------------------------------------------------------------------------------------------
PgxGraph g = session.readGraphByName("DEPT", GraphSource.PG_SQL);
PgqlResultSet rs = g.queryPgql("SELECT n.* FROM MATCH (n:dept)");
rs.print();
>>> g = session.read_graph_by_name("DEPT", "pg_sql")
>>> g.query_pgql("SELECT n.* FROM MATCH (n:dept)").print()
+--------------------------------------------------------------------------------------------------
| DEPT_ID | DEPT_NAME | EMP_DETAILS
| 2.0 | IT | <employees>
<employee empNo="5628" ename="JONES" hireDate="13-MAR-1986"></employee>>
<employee empNo="5628" ename="TOM" hireDate="13-MAR-1986"></employee>>
</employees> |
| 1.0 | HR | <employees>
<employee empNo="1234" eName="SMITH" hireDate="17-DEC-1990"></employee>
<employee empNo="5678" ename="ALLEN" hireDate="02-JAN-1981"></employee>
</employees>
|
+--------------------------------------------------------------------------------------------------
Related Topics