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

数据库管理188期 2024-05-10

  • 数据库管理-第188期 23ai:怎么用PGQL创建图(20240511)
    • 1 PGQL创建属性图
      • 1.1 PGQL属性图的元数据表
      • 1.2 创建一个PGQL属性图
      • 1.3 获取PGQL属性图的元数据
    • 2 PGQL属性图
    • 3 官方示例演示
      • 3.1 插入数据
      • 3.2 创建PGQL属性图
      • 3.3 通过PGQL属性图查询图数据
      • 3.4 通过PGQL属性图修改数据
      • 3.5 通过PGQL属性图删除数据
    • 总结

数据库管理-第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进行展示操作。
老规矩,知道写了些啥。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/618596.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot:SpringBoot原理

SpringBoot高级 SpringBoot配置 配置文件优先级 按照yaml>yml>properties的顺序加载 存在相同配置项,后加载的会覆盖先加载的 加载顺序越靠后,优先级越高 SpringBoot存在其他的多种方式进行配置,如下所示,越靠下优先级越高 1. Default properties (specified by s…

vm虚拟机安装网络适配器驱动卡死/无响应/无限等待状态

大部分原因都是以前的vm没有卸载干净所导致的,只需要使用CCleaner清楚干净就好 使用控制面板里的卸载把VM卸载干净 使用CCleaner软件删除干净注册表,这个软件百度很容易找到,只有十兆左右 打开下载好的软件,不需要注册码&#xff…

长安汽车:基于云器 Lakehouse 的车联网大数据平台建设

近年来随着智能汽车行业的迅速发展,数据也在呈爆炸式增长。长安大数据平台承接了长安在生产上大部分流量应用及日常生产业务应用。本文将分享长安汽车在车联网场景下大数据平台建设面临的一些挑战和具体落地的实践。 主要内容如下: 1. 背景介绍 2. 长…

Java数组:三种初始化

一.静态初始化 代码演示: //静态初始化:创建 赋值int[] a {1,2,3,4,5,6};System.out.println(a[0]); 二.动态初始化 代码演示: //动态初始化:包含默认初始化int[] b new int[10];b[0] 10;System.out.println(b[0]); //10System.out.println(b[1])…

25计算机考研院校数据分析 | 中南大学

中南大学(Central South University),位于湖南省长沙市,是中华人民共和国教育部直属的全国重点大学 ,中央直管副部级建制,位列国家“双一流”、“985工程”、“211工程”,入选国家“2011计划”牵…

MySQL前缀索引、脏页和干净页、COUNT(*)讨论、表删除内存问题

文章目录 如何加索引如何给身份证号添加索引 SQL语句变慢脏页 (Dirty Pages)干净页 (Clean Pages)为何区分脏页和干净页处理脏页管理策略 flush如何控制 为什么删除表数据后表文件大小不变问题背景核心原因数据存储方式参数影响 解决方案1. 调整innodb_file_per_table设置2. 使…

vs2019 cpp20 规范的线程头文件 <thread> 注释并探讨两个问题

(1)学习线程,与学习其它容器一样,要多读 STL 库的源码。很多知识就显然而然的明白了。也不用死记硬背一些结论。上面上传了一份注释了一下的 源码。主要是补充泛型推导与函数调用链。基于注释后的源码探讨几个知识点。 STL 库的多…

【SpringBoot】 什么是springboot(三)?springboot使用ajax、springboot使用reids

文章目录 SpringBoot第五章第六章1、springboot使用ajax2、springboot使用reids1、单机版**使用步骤**1-5步67-9步RedisTemplate使用RedisTemplate2、集群版开启集群项目配置1234-5第七章1、springboot文件上传使用步骤1-234-52、springboot邮件发送步骤1-23453、springboot拦截…

【智能算法】最优捕食算法(OFA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2017年,GY Zhu受到动物行为生态学理论启发,提出了最优捕食算法(Optimal Foraging Algorithm, OFA)。 2.算法原理 2.1算法思想 OFA灵感来源…

网络编程学习笔记1

文章目录 一、socket1、创建socket2、网络通信流程3、accept()函数4、signal()函数5、recv()函数6、connect()函数 二、I/O多路复用1.select模型2.poll模型3.epoll模型 注 一、socket 1、创建socket int socket(int domain,int type,int protocol); //返回值:一个…

微信小程序的Vant Weapp组件库(WeUI组件库)

一、定义: 是一套开源的微信小程序UI组件库。提供了一整套UI基础组件和业务组件,能够快速地搭配出一套风格统一的页面 二、使用: (1)(找到.eslintrc.js 右键,在内件终端打开)打开命…

|Python新手小白中级教程|第二十八章:面向对象编程(类定义语法私有属性类的继承与多态)(4)

文章目录 前言一、类定义语法二、私有方法和私有属性1.私有属性2.私有方法 三、类“继承”1.初识继承2.使用super函数调用父类中构造的东西 四、类“多态”1.多态基础2.子类不同形态3.使用isinstance函数与多态结合判断类型 总结 前言 大家好,我是BoBo仔吖&#xf…

RocketMQ学习笔记(一)

一、基本概念 生产者(Producer):也称为消息发布者,是RocketMQ中用来构建并传输消息到服务端的运行实体,举例:发信者主题(Topic):Topic是RocketMQ中消息传输和存储的顶层…

【全开源】Java知识付费教育付费资源付费平台公众号小程序源码

特色功能: 多样化的内容呈现:资源付费平台小程序支持图文、音视频、直播等多种形式的内容呈现,为用户提供了丰富的学习体验。直播课程:专家或讲师可以通过小程序进行在线授课,与用户实时互动,增强了学习的…

再有人说数字孪生大屏没有用,用这8条怼回去。

数字孪生大屏之所以受到欢迎,主要有以下几个原因: 实时数据可视化 数字孪生大屏可以将实时数据以直观的可视化形式展示出来,让用户能够一目了然地了解数据的状态和趋势。这样可以帮助用户更好地理解和分析数据,及时做出决策和调…

动态规划算法练习——计数问题

题目描述 给定两个整数 a 和 b,求 a 和 b 之间的所有数字中 0∼9 的出现次数。 例如,a1024,b1032,则 a 和 b 之间共有 9 个数如下: 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出现 10 次,1 出现…

蓝桥杯-网络安全比赛(7)基础知识 HTTP、TTL、IP数据包、MSS、MTU、ARP、LLMNR、MDNS、NBNS。

1. IP中TTL值能够给我提供什么信息?2. IP头部中标志、13位偏移、32位源IP地址、目标IP、IP数据包格式,有多少字节3. IP头部中的16位标识是什么?4. MSS 和MTU分别有多大?5. 怎么获取路由IP信息?PING、NSLOOKUP、TRACERT…

day6Qt作业

人脸识别系统 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include<opencv2/face.hpp> #include <vector> #include <map> #include <QMessag…

创建一个react项目(router,store,axios,antd)最后有项目地址

第一步&#xff1a;使用cra脚手架 创建项目 文档地址&#xff1a;Create React App 中文文档 npx create-react-app 你的项目名称 第二步&#xff1a;整理项目结构和删除多余代码 目标效果图&#xff1a; 在src目录下分别新建apis,assets,components,pages,router,store,ut…

重学JavaScript核心知识点(二)—— 详解Js中的模块化

详解Js中的模块化 1. 模块化的背景2. 来看一个例子3. 优雅的做法 —— 创建模块对象4. 模块与类&#xff08;class&#xff09;5. 合并模块6. 动态加载模块 1. 模块化的背景 JavaScript 在诞生之初是体积很小的&#xff0c;早期&#xff0c;它们大多被用来执行独立的脚本任务&…