参考文档点击文末阅读原文打开; 推荐《最好的PostgreSQL学习镜像》;
DuckDB 图数据库插件 duckpgq
DuckDB的插件越来越多了, 感兴趣的朋友请移步DuckDB的核心插件和社区插件网站查看.
https://duckdb.org/docs/extensions/core_extensions https://duckdb.org/community_extensions/list_of_extensions
如果把数据理解为对象和对象与对象之间的关联, 现实中的数据都可以和图数据库关联起来, 在未来可能会有较大的使用范围, 例如社交/电商推荐、公安行政、保险行业风控、量化交易等.
duckpgq是DuckDB 的一款图数据库插件, 目前不支持索引, 具有简单的图式操作的语法.
demo
加载duckpgq
$ ./duckdb -unsigned
D install duckpgq from community;
D load duckpgq;
获取测试数据
D CREATE TABLE Person as select * from 'https://gist.githubusercontent.com/Dtenwolde/2b02aebbed3c9638a06fda8ee0088a36/raw/8c4dc551f7344b12eaff2d1438c9da08649d00ec/person-sf0.003.csv';
D CREATE TABLE Person_knows_person as select * from 'https://gist.githubusercontent.com/Dtenwolde/81c32c9002d4059c2c3073dbca155275/raw/8b440e810a48dcaa08c07086e493ec0e2ec6b3cb/person_knows_person-sf0.003.csv';
结构如下
D desc Person;
┌────────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │ null │ key │ default │ extra │
│ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │
├────────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ creationDate │ TIMESTAMP │ YES │ │ │ │
│ id │ BIGINT │ YES │ │ │ │
│ firstName │ VARCHAR │ YES │ │ │ │
│ lastName │ VARCHAR │ YES │ │ │ │
│ gender │ VARCHAR │ YES │ │ │ │
│ birthday │ DATE │ YES │ │ │ │
│ locationIP │ VARCHAR │ YES │ │ │ │
│ browserUsed │ VARCHAR │ YES │ │ │ │
│ LocationCityId │ BIGINT │ YES │ │ │ │
│ speaks │ VARCHAR │ YES │ │ │ │
│ email │ VARCHAR │ YES │ │ │ │
├────────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┤
│ 11 rows 6 columns │
└──────────────────────────────────────────────────────────────────────┘
D desc Person_knows_person;
┌──────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │ null │ key │ default │ extra │
│ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │
├──────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ creationDate │ TIMESTAMP │ YES │ │ │ │
│ Person1Id │ BIGINT │ YES │ │ │ │
│ Person2Id │ BIGINT │ YES │ │ │ │
└──────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘
将以上2个表的数据通过字段关联起来, 创建图
D CREATE PROPERTY GRAPH snb
VERTEX TABLES (
Person
)
EDGE TABLES (
Person_knows_person SOURCE KEY (Person1Id) REFERENCES Person (id)
DESTINATION KEY (Person2Id) REFERENCES Person (id)
LABEL Knows
);
┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ 0 rows │
└─────────┘
查找谁的好友有谁?
D FROM GRAPH_TABLE (snb
MATCH (a:Person)-[k:knows]->(b:Person)
COLUMNS (a.id, b.id)
)
LIMIT 1;
┌───────┬────────────────┐
│ id │ id_1 │
│ int64 │ int64 │
├───────┼────────────────┤
│ 14 │ 10995116277782 │
└───────┴────────────────┘
D FROM GRAPH_TABLE (snb
MATCH (a:Person)-[k:knows]->(b:Person)
COLUMNS (a.id, b.id)
)
LIMIT 10;
┌───────┬────────────────┐
│ id │ id_1 │
│ int64 │ int64 │
├───────┼────────────────┤
│ 14 │ 10995116277782 │
│ 14 │ 24189255811081 │
│ 14 │ 26388279066668 │
│ 16 │ 2199023255594 │
│ 16 │ 26388279066655 │
│ 16 │ 28587302322180 │
│ 16 │ 28587302322204 │
│ 32 │ 2199023255594 │
│ 32 │ 13194139533352 │
│ 32 │ 17592186044461 │
├───────┴────────────────┤
│ 10 rows 2 columns │
└────────────────────────┘
查找谁和谁的连接距离?
D FROM GRAPH_TABLE (snb
MATCH p = ANY SHORTEST (a:person)-[k:knows]->{1,3}(b:Person)
COLUMNS (a.id, b.id, path_length(p))
)
LIMIT 1;
┌───────┬────────────────┬────────────────┐
│ id │ id_1 │ path_length(p) │
│ int64 │ int64 │ int64 │
├───────┼────────────────┼────────────────┤
│ 14 │ 10995116277782 │ 1 │
└───────┴────────────────┴────────────────┘
D FROM GRAPH_TABLE (snb
MATCH p = ANY SHORTEST (a:person)-[k:knows]->{1,3}(b:Person)
COLUMNS (a.id, b.id, path_length(p))
)
LIMIT 10;
┌───────┬────────────────┬────────────────┐
│ id │ id_1 │ path_length(p) │
│ int64 │ int64 │ int64 │
├───────┼────────────────┼────────────────┤
│ 14 │ 10995116277782 │ 1 │
│ 14 │ 24189255811081 │ 1 │
│ 14 │ 24189255811109 │ 2 │
│ 14 │ 26388279066641 │ 2 │
│ 14 │ 26388279066658 │ 2 │
│ 14 │ 26388279066668 │ 1 │
│ 14 │ 28587302322180 │ 2 │
│ 14 │ 28587302322196 │ 2 │
│ 14 │ 28587302322204 │ 2 │
│ 14 │ 28587302322223 │ 3 │
├───────┴────────────────┴────────────────┤
│ 10 rows 3 columns │
└─────────────────────────────────────────┘
我之前写过一篇使用PostgreSQL实现图搜索中最常见的: 层级关系, 最短路径. 有兴趣的同学可参考:
《PostgreSQL 图式搜索(graph search)实践 - 百亿级图谱,毫秒响应》
参考
https://duckdb.org/docs/extensions/core_extensions
https://github.com/cwida/duckpgq-extension
https://duckdb.org/community_extensions/extensions/duckpgq.html
《PostgreSQL 图式搜索(graph search)实践 - 百亿级图谱,毫秒响应》
文末彩蛋:国产数据库周边生态
当然一款数据库要流行起来, 除了自己要强大, 还离不开生态. 用好周边生态工具, 管理水平战胜90%老司机!!! 下面简单介绍一下国产数据库周边生态.
1、管控软件
鸣嵩(前阿里云数据库总经理 / 研究员)等大佬们创业创办的云猿生, 核心产品是KubeBlocks. 他们的理念是让管理数据库和搭积木一样简单, 如果你要管理很多套并且种类(OLTP\OLAP\NoSQL\KV\TS\MQ等)很多的数据库产品, 推荐首选.
https://github.com/apecloud/kubeblocks
PG中文社区核心委员唐成老师的公司乘数开源的Clup, 专用管理PostgreSQL和PolarDB的集群管理软件, 如果你要管理很多套数据库, 推荐选择. 并且Clup还提供了企业版、自研的连接池、分布式存储、一体机、备份平台等, 是企业用户推荐之选.
https://www.csudata.com/
若航老司机开源的pigsty, 集成了300多个PG插件的PG集群和PolarDB集群管理软件, 如果你要管理很多套PG或PolarDB数据库, 且对插件有特别多的需求, 推荐选择.
https://pigsty.cc/zh/
2、审计监控诊断优化
翟总(曾经是我背后的男人)到海信聚好看后研发的 DBdoctor, 采用ebpf技术, 在对数据库几乎没有影响的情况下实时监控数据库和服务器的各项指标, 发现和诊断问题根因非常方便.
https://www.dbdoctor.cn/
天舟老哥的核心产品Bytebase 是位于您和数据库之间的中间件。它是数据库 DevOps 的 GitLab/GitHub,专为开发人员、DBA 和平台工程师打造。
https://bytebase.cc/docs/introduction/what-is-bytebase/
PawSQL, SQL优化和诊断产品.
D-Smart, Oracle老前辈白老大出品, 专注企业级市场, 将业界顶级DBA经验的产品化作品, 产品功能包括数据库监控、诊断、优化等.
https://www.modb.pro/db/567140
3、国产数据库IDE
IDE是开发者的必备工具,例如社区有pgAdmin, 国产IDE则可以看看老程序猿达刚老师的DeskUI:
https://www.deskui.com
4、数据同步&迁移&备份恢复
NineData, 老领导出去创业做的产品, 产品涵盖了数据同步、迁移、备份、比对、devops、chatDBA等.
https://www.ninedata.cloud/home
DSG, 非常老牌的数据库同步迁移企业级产品, 支持各种数据库的异构和同构迁移, 用他们的话说, 没有dsg搞不定的迁移, 比goldengate还牛.
https://www.dsgdata.com/
公开课
如果你对PolarDB学习感兴趣可以阅读这个公开课系列:
除了PolarDB还非常值得关注的几款PG栈国产数据库:
HaloDB(基于PG兼容PostgreSQL、Oracle、MySQL. http://www.halodbtech.com/ )、 IvorySQL(基于开源PG兼容PG、Oracle. https://www.ivorysql.org/zh-cn/ )、 ProtonBase(云原生分布式数仓. https://protonbase.com/ )、 成都文武数据库(https://ww-it.cn)
参考文档点击阅读原文获得
感谢关注我的github (https://github.com/digoal/blog) 及视频号:





