数据库管理-第187期 23ai:怎么用SQL创建图(20240510)
作者:胖头鱼的鱼缸(尹海文) Oracle ACE Associate: Database(Oracle与MySQL) PostgreSQL ACE Partner 10年数据库行业经验,现主要从事数据库服务工作 拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证 墨天轮MVP、认证技术专家、年度墨力之星,ITPUB认证专家、专家百人团成员,OCM讲师,PolarDB开源社区技术顾问,OceanBase观察团成员 圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著 名社恐(社交恐怖分子) 公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。 除授权转载并标明出处外,均为“非法”抄袭
1 安装PGX
安装Graph Server,PGX,本次部署版本为24.2.0,需要到这个网址去下载:
https://edelivery.oracle.com/
这里下载最新的Oracle Graph Server and Client 24.2.0(全部加起来有点大):
重命名一下并解压看看:
还需要单独部署一台OracleLinux 8的主机,本次操作的两台机器如下:
| 主机名 | IP地址 | 操作系统 | 角色 |
|---|---|---|---|
| 23ai-free | 10.10.10.230 | OracleLinux 9.3 | DB 23ai Free |
| pgx | 10.10.10.80 | OracleLinux 8.9 | PGX App |
1.1 数据库配置对应用户
这里继续使用之前用于JSON关系二元性视图实验的用户ec,密码为ec,已授予connect和resource权限:
--这两个role权限是23ai新增,之前版本需要手工创建:https://docs.oracle.com/en/database/oracle/property-graph/24.2/spgdg/user-authentication-and-authorization.htmlGRANT GRAPH_DEVELOPER TO ec;GRANT GRAPH_ADMINISTRATOR to ec;
为了偷懒把两个权限都赋予了。
1.2 使用RPM包安装Graph Server
dnf -y install libgfortran# install Oracle JDK 11rpm -i jdk-11.0.23_linux-x64_bin.rpm# install graphrpm -i oracle-graph-24.2.0.x86_64.rpm# add operating system users allowed to use the server installation to the operating system group oraclegraph# usermod -a -G oraclegraph <graphuser>useradd graph
usermod -a -G oraclegraph graph
passwd graph# As <graphuser>, configure the server by modifying the files /etc/oracle/graph/pgx.confvim /etc/oracle/graph/pgx.conf# ...# "pgx_realm": {# "implementation": "oracle.pg.identity.DatabaseRealm",# "options": {# "jdbc_url": "jdbc:oracle:thin:@myhost:1521/myservice",# "token_expiration_seconds": 3600,# ......"pgx_realm": { "implementation": "oracle.pg.identity.DatabaseRealm", "options": { "jdbc_url": "jdbc:oracle:thin:@10.10.10.230:1521/freepdb1", "token_expiration_seconds": 3600,
...# disable tlsvim /etc/oracle/graph/server.conf
{ "port": 7007, "enable_tls": false, "enable_client_authentication": false, "working_dir": "/opt/oracle/graph/pgx/tmp_data"}
systemctl start pgx
1.3 安装Oracle Graph Client
su - graph unzip Oracle\ Graph\ Client\ 24.2.0.zip unzip oracle-graph-client-24.2.0.zip
用过下面的命令可以连接到PGX:
cd oracle-graph-client-24.2.0/bin/ ./opg4j --base_url https://10.10.10.80:7007 --username ec
也可以通过PGX安装包含的client进行连接:
/opt/oracle/graph/bin/opg4j --base_url http://10.10.10.80:7007 --username e

1.4 访问PGX页面
从Oracle Graph Server 23.3开始,使用RPM安装的PGX是包含了图形界面,可以不用部署Oracle Graph Webapps(相关部署可以参看对应官方文档:https://docs.oracle.com/en/database/oracle/property-graph/24.2/spgdg/deploying-oracle-graph-server-web-server.html),现在可以通过10.10.10.80:7007/ui来访问PGX:
输入数据库对应账户名/密码:ec/ec即可访问:

2 SQL Property Graph
以在任何基于SQL的接口(如SQLDeveloper、SQLPLUS或SQLcl)中使用SQL属性图,也可以从使用JDBC的Java程序中使用。
2.1 创建SQL属性图
使用CREATE PROPERTY GRAPH DDL语句,可以直接在Oracle数据库中创建属性图对象。 这里我们用一个官方文档的示例来演示创建SQL属性图,首先需要创建示例数据:
CREATE TABLE university ( id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), name VARCHAR2(10), CONSTRAINT u_pk PRIMARY KEY (id));INSERT INTO university (name) VALUES ('ABC');INSERT INTO university (name) VALUES ('XYZ');CREATE TABLE persons (
person_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT
BY 1), name VARCHAR2(10),
birthdate DATE,
height FLOAT DEFAULT ON NULL 0,
hr_data JSON, CONSTRAINT person_pk PRIMARY KEY (person_id)
);INSERT INTO persons (name, height, birthdate, hr_data) VALUES ('John', 1.80, to_date('13/06/1963', 'DD/MM/YYYY'), '{"department":"IT","role":"Software Developer"}');INSERT INTO persons (name, height, birthdate, hr_data) VALUES ('Mary', 1.65, to_date('25/09/1982', 'DD/MM/YYYY'), '{"department":"HR","role":"HR Manager"}');INSERT INTO persons (name, height, birthdate, hr_data) VALUES ('Bob', 1.75, to_date('11/03/1966', 'DD/MM/YYYY'), '{"department":"IT","role":"Technical Consultant"}');INSERT INTO persons (name, height, birthdate, hr_data) VALUES ('Alice', 1.70, to_date('01/02/1987', 'DD/MM/YYYY'), '{"department":"HR","role":"HR Assistant"}');CREATE TABLE student_of (
s_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
s_univ_id NUMBER,
s_person_id NUMBER,
subject VARCHAR2(10), CONSTRAINT stud_pk PRIMARY KEY (s_id), CONSTRAINT stud_fk_person FOREIGN KEY (s_person_id) REFERENCES persons(person_id), CONSTRAINT stud_fk_univ FOREIGN KEY (s_univ_id) REFERENCES university(id)
);INSERT INTO student_of(s_univ_id, s_person_id,subject) VALUES (1,1,'Arts');INSERT INTO student_of(s_univ_id, s_person_id,subject) VALUES (1,3,'Music');INSERT INTO student_of(s_univ_id, s_person_id,subject) VALUES (2,2,'Math');INSERT INTO student_of(s_univ_id, s_person_id,subject) VALUES (2,4,'Science');CREATE TABLE friends (
friendship_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
person_a NUMBER,
person_b NUMBER,
meeting_date DATE, CONSTRAINT fk_person_a_id FOREIGN KEY (person_a) REFERENCES persons(person_id), CONSTRAINT fk_person_b_id FOREIGN KEY (person_b) REFERENCES persons(person_id), CONSTRAINT fs_pk PRIMARY KEY (friendship_id)
);INSERT INTO friends (person_a, person_b, meeting_date) VALUES (1, 3, to_date('01/09/2000', 'DD/MM/YYYY'));INSERT INTO friends (person_a, person_b, meeting_date) VALUES (2, 4, to_date('19/09/2000', 'DD/MM/YYYY'));INSERT INTO friends (person_a, person_b, meeting_date) VALUES (2, 1, to_date('19/09/2000', 'DD/MM/YYYY'));INSERT INTO friends (person_a, person_b, meeting_date) VALUES (3, 2, to_date('10/07/2001', 'DD/MM/YYYY'));commit;
这里创建了四张表:university表存储大学名称信息,person表存储人员的信息,student_of表存储大学、人员以及专业关联的信息,friends表则存储包含第一次见面信息的人与人之间的关联信息。这里可以注意到每张表都有主键,后两张作为关联信息表的非主键列与前两张基础信息表的主键是有外键约束关系的。我们依托这四张表创建下面的SQL属性图:
语句如下:
CREATE PROPERTY GRAPH students_graph VERTEX TABLES ( persons KEY (person_id) LABEL person PROPERTIES (person_id, name, birthdate AS dob) LABEL person_ht PROPERTIES (height), university KEY (id) ) EDGE TABLES ( 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), student_of SOURCE KEY (s_person_id) REFERENCES persons(person_id) DESTINATION KEY (s_univ_id) REFERENCES university(id) PROPERTIES (subject) );
在执行时,前面的示例创建了一个SQL属性图对象,该对象使用schema中的表来定义其图元素表。请注意,创建新的SQL属性图对象只会存储属性图元数据,并且不会将数据从底层数据库对象复制到图元素表中。这意味着在查询SQL属性图时,所有的图查询都是对数据库中的当前图数据执行的。如果您有足够的权限,还可以指定另一个schema来包含SQL属性图。 示例中的图定义创建了一个图,该图包括:
2.2 关于点和边图元素表
从底层数据库对象定义的SQL属性图的点和边存储在图元素表中。图元素表可以试点表也可以是边表。 Vertex graph element table(点图元素表):
Edge graph element table(边图元素表):
2.3 关于点和边表建
在SQL属性图中的每个点表和边表都必须有一个键,用以标识SQL属性图中一个唯 一的点或一个边。键是由底层表中的一列或多列定义的。基于从底层表的一个现有主键或唯 一约束来隐式推断这个键、键是唯 一的。 然而需要注意的是,使用唯 一约束的键列需要用ENFORCED MODE来创建图,否则使用TRUSTED MODE来使用没有唯 一约束的键列。 点和边表的键可以使用下面任意的内建的数据类型列来定义:
注意,TIMESTAMP WITH TIME ZONE是不被支持的。 Vertex Table Key(点表键):
2.4 关于标签(LABEL)和属性(PROPERTY)
标签可以与一个或多个图元素表相关联,并且它们丰富了图定义。标签可以定义为具有或不具有属性。可以选择为图中的点表和边表定义LABEL和PROPERTIES。如果未指定,则会自动为图形元素表分配一个带有图元素表名称的标签,并且所有可见列都显示为属性,使用列名作为属性名称。 LABEL(标签):
Properties(属性):
2.5 使用Graph Option来创建SQL属性图
您可以使用图选项(Graph Option)来控制SQL属性图形在创建时的行为。 可以使用options子句在CREATE PROPERTY GRAPH DDL语句的末尾指定图选项。可以根据需要使用MODE或MIXED PROPERTY TYPES选项,也可以同时使用这两种选项。
2.5.1 使用OPTION来制定图的MODE
可以下面的图选项在创建SQL属性图的时候指定图的MODE:
2.5.2 使用OPTION来允许/禁止不同属性类型共享属性名称
可以使用下面的值来指定MIXED PROPERTY TYPES选项:
2.6 相关权限
这里直接贴出截图:

2.7 Revalidating and Drop
ALTER PROPERTY GRAPH graph_name COMPILE;DROP PROPERTY GRAPH graph_name;
2.8 JSON支持
SQL属性图是支持JSON数据类型的。
3 SQL Graph查询
这里是根据上一节创建SQL属性图,下面是一个范例:
SELECT * FROM GRAPH_TABLE (students_graph MATCH (a IS person) -[e IS friends]-> (b IS person WHERE b.name = 'Mary') WHERE a.name='Bob' COLUMNS (a.name AS person_a, b.name AS person_b) );
使用SELECT FROM GRAPH_TABLE语句和MATCH子句:
关于更多的pattern(模式),请查看官方文档https://docs.oracle.com/en/database/oracle/property-graph/24.2/spgdg/sql-graph-queries.html
总结
本期部署了PGX,并演示了SQL属性图的创建、重定义、查询等,这里需要说明的是PGX上SQL属性图是无法可视化展示的,那么用哪种方式可以可视化,下期继续分享。 老规矩,知道写了些啥。
