数据库管理-第188期 23ai:怎么用PGQL创建图(20240511)

数据库管理-第188期 23ai:怎么用PGQL创建图(20240511)

作者:胖头鱼的鱼缸(尹海文)
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。
除授权转载并标明出处外,均为“非法”抄袭

苦逼的周六补班,还是得吐槽一下这个调休调班策略。
PGQL,可不是Postgres Query Language,PGQL的全称为Property Graph Query Language,属性图查询语言,其介绍可以查阅网页:https://pgql-lang.org/。

1 PGQL创建属性图

CREATE PROPERTY GRAPH语句使用PGQL方式会创建一个包含图元数据的类似于视图的对象。这个图可以使用PGQL查询。
PGQL属性图直接在存在于关系型表中数据上创建。这些图存储在数据库表中,他们有自己的SCHEMA。
PGQL属性图的一个主要的好处就是所有数据库表的更新会立即在图中展示。

1.1 PGQL属性图的元数据表

当通过CREATE PROPERTY GRAPH创建PGQL属性图时,元数据表会在本SCHEMA下创建。对应的元数据表信息参考下图(这里就不翻译了):
image.png

1.2 创建一个PGQL属性图

CREATE PROPERTY GRAPH语句的OPTIONS子句可以指定创建属性图的执行模式。

  • 可以使用RDBMS Java API或通过SQLcl(就是之前说过的sql)来创建PGQL属性图
  • 可以通过图可视化工具或SQLcl来查询PGQL属性图
CREATE PROPERTY GRAPH students_network
  VERTEX TABLES (
    persons KEY (person_id)
      LABEL person
        PROPERTIES (person_id, name, birthdate AS dob),
    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)
  ) OPTIONS (PG_PGQL);

毕竟PGQL和SQL不同,这个创建语句无法在sqlplus下执行:
image.png
而23ai Free版本不包含SQLcl工具,所以这时候前面部署的PGX就发挥作用了:
image.png
这时候就可以查询这个图的元数据表了:

SELECT * FROM STUDENTS_NETWORK_ELEM_TABLE$;
SELECT * FROM STUDENTS_NETWORK_LABEL$;
SELECT * FROM STUDENTS_NETWORK_PROPERTY$;
SELECT * FROM STUDENTS_NETWORK_KEY$;
SELECT * FROM STUDENTS_NETWORK_SRC_DST_KEY$;

image.png

1.3 获取PGQL属性图的元数据

可以使用PGQL查询从一个名为PROPERTY_GRAPH_METADATA的内建图中查询PGQL属性图的元数据,图的结构如下:
image.png
查询这个图:
image.png
以下描述了上面元数据图的设计:

PROPERTY_GRAPH -[:HAS_VERTEX_TABLE]-> VERTEX_TABLE
               -[:HAS_EDGE_TABLE]-> EDGE_TABLE
 
VERTEX_TABLE -[:HAS_KEY_COLUMN]-> KEY_COLUMN
             -[:HAS_LABEL]-> LABEL
 
EDGE_TABLE -[:HAS_KEY_COLUMN]-> KEY_COLUMN
           -[:HAS_LABEL]-> LABEL
           -[:HAS_SOURCE_TABLE]-> VERTEX_TABLE
           -[:HAS_DESTINATION_TABLE]-> VERTEX_TABLE
 
LABEL -[:HAS_PROPERTY]-> PROPERTY

在PGQL查询中使用PROPERTY_GRAPH_METADATA时,请注意以下几点,这非常重要:

  • 首次尝试在PGQL查询中访问PROPERTYGRAPH_METADATA图时,会自动创建并更新该图
  • PROPERTYGRAPH_METADATA图类似于PGQL属性图,并且有自己的一组元数据表来描述其结构。PROPERTYGRAPH_METADATA的图形数据也存储在下表中列出的数据库对象中(请不要变更删除这些表和数据):
    image.png
  • 当使用Java API运行PGQL查询时,必须禁用JDBC连接上的自动提交(conn.setAutoCommit(false))。这样可以确保自动创建PROPERTYGRAPH_METADATA图。

2 PGQL属性图

由于没有SQLcl,这里操作只能用PGX来实现:

SELECT e
FROM MATCH ()-[e]->() ON STUDENTS_NETWORK
LIMIT 100

image.png
image.png
这里可以以表或图的方式展示数据,也可以拖动任意点。对底层表任意修改可以即时展示:

INSERT INTO persons (name, height, birthdate, hr_data)
       VALUES ('Scott', 1.75, to_date('20/05/1985', 'DD/MM/YYYY'), '{"department":"HR","role":"HR Assistant"}');

INSERT INTO friends (person_a, person_b, meeting_date) VALUES (2, 22, to_date('10/06/2001', 'DD/MM/YYYY'));

commit;

image.png
image.png

3 官方示例演示

3.1 插入数据

CREATE TABLE bank_accounts(id NUMBER, name VARCHAR2(10));
CREATE TABLE bank_txns(from_acct_id NUMBER, to_acct_id NUMBER, description VARCHAR2(10), amount NUMBER);

使用sqlldr通过csv文件导入数据,将对应文件拷贝到数据库服务器
csv文件位置为pgx服务器/opt/oracle/graph/data/bank_graph/
image.png

scp -r /opt/oracle/graph/data/bank_graph/ oracle@10.10.10.230:~

cd ~/bank_graph
vim bank_nodes.ctl
load data
infile '/home/oracle/bank_graph/bank_nodes.csv'
into table bank_accounts
fields terminated by "," optionally enclosed by '"'
( id, name )

sqlldr ec/ec@freepdb1 CONTROL=bank_nodes.ctl

vim bank_edges_amt.ctl
load data
infile '/home/oracle/bank_graph/bank_edges_amt.csv'
into table bank_txns
fields terminated by "," optionally enclosed by '"'
(from_acct_id,to_acct_id,description,amount)

sqlldr ec/ec@freepdb1 CONTROL=bank_edges_amt.ctl

image.png

ALTER TABLE bank_accounts ADD PRIMARY KEY (id);
ALTER TABLE bank_txns ADD txn_id NUMBER;
UPDATE bank_txns SET txn_id = ROWNUM;
COMMIT;
ALTER TABLE bank_txns ADD PRIMARY KEY (txn_id);
ALTER TABLE bank_txns MODIFY from_acct_id REFERENCES bank_accounts(id);
ALTER TABLE bank_txns MODIFY to_acct_id REFERENCES bank_accounts(id);

3.2 创建PGQL属性图

CREATE PROPERTY GRAPH bank_graph 
VERTEX TABLES (
 BANK_ACCOUNTS AS ACCOUNTS KEY (ID)
  LABEL ACCOUNTS
   PROPERTIES (ID, NAME)
)
EDGE TABLES (
 BANK_TXNS AS TRANSFERS
 KEY (FROM_ACCT_ID, TO_ACCT_ID, AMOUNT)
  SOURCE KEY (FROM_ACCT_ID) REFERENCES ACCOUNTS (ID)
  DESTINATION KEY (TO_ACCT_ID) REFERENCES ACCOUNTS (ID)
   LABEL TRANSFERS
    PROPERTIES (FROM_ACCT_ID, TO_ACCT_ID, AMOUNT, DESCRIPTION)
) OPTIONS (PG_PGQL);

image.png

3.3 通过PGQL属性图查询图数据

SELECT e
FROM MATCH ()-[e]->() ON BANK_GRAPH
LIMIT 100

image.png

3.4 通过PGQL属性图修改数据

先查询需要修改的内容:

SELECT e
FROM MATCH (v1 IS ACCOUNTS)-[e IS TRANSFERS]->(v2 IS ACCOUNTS)
ON BANK_GRAPH
WHERE v1.id=178 and v2.id=268

image.png

select * from bank_txns where from_acct_id=178 and to_acct_id=268;

image.png
然后使用PGQL修改数据:

UPDATE e
SET (e.AMOUNT=30000)
FROM MATCH (v1 IS ACCOUNTS)-[e IS TRANSFERS]->(v2 IS ACCOUNTS)
ON BANK_GRAPH
WHERE v1.id=178 and v2.id=268

image.png
这里看到底层数据已经变更了:
image.png
对应的图数据也变化了:
image.png

3.5 通过PGQL属性图删除数据

删除操作和上面修改操作类似:

SELECT e
FROM MATCH (v1)-[e]->(v2)
ON BANK_GRAPH
WHERE v1.id=1000

image.png

select * from bank_txns where from_acct_id=1000;

image.png

DELETE e FROM
MATCH (v1)-[e]->(v2)
ON BANK_GRAPH
WHERE v1.id=1000

image.png
查看底层数据和图输出,对应数据已被删除:
image.png
image.png

其余的PGX操作则可以参考https://docs.oracle.com/en/database/oracle/property-graph/24.2/spgdg/using-graph-visualization-application.html
这里还需要注意PGX会话token有超时时间如果使用过程中无响应或报错,则就需要重新登录或者调整PGX配置
在虚拟机中使用PGX,使用挂起功能恢复后可能导致PGX无法将DML正常推送到底层数据库,需要重启PGX应用

总结

本期展示了PGQL属性图,其实和SQL属性图在语法层面大差不差,可以通过PGX进行展示操作。
老规矩,知道写了些啥。

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖头鱼的鱼缸(尹海文)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值