资讯动态

不学新语言也能写图查询:pgGraph 的 GQL 与 openCypher 兼容层入门实战

发布时间:2026/10/16 1:31:53 来源:尧图企业网站定制
【免费下载链接】pgGraphOpen-source graph database superpowers for your existing Postgres data.项目地址https://gitcode.com/gh_mirrors/pggr/pgGraph点击查看免费下载pgGraph 是一个 PostgreSQL 图数据库扩展它内置了 GQL 查询接口与 openCypher 兼容层你不需要迁移数据、也不需要学习新的图数据库语言直接在现有 SQL 环境里用MATCH ... RETURN写出图查询节点和关系依然由你的 PostgreSQL 表来承载。快速上手10分钟在 PostgreSQL 里跑通第一条图查询如果你的环境里已经有 pgGraphDocker 镜像、源码构建或 PGXN 均可参见 docs/user_guide/installation.mdx最快的方式是用仓库自带的快速入门脚本拉起一个自带演示数据的数据库scripts/quickstart.sh psql这个命令会构建并启动 PostgreSQL、自动注册示例表、建好图然后打开psql交互终端可以直接开始写查询。如果你想手动体验完整流程把下面这段贴进任意psql会话即可两张普通的表people、companies加上一个外键就是我们要的图。CREATE EXTENSION IF NOT EXISTS graph; SELECT graph.reset(true); CREATE TABLE companies (id text PRIMARY KEY, name text NOT NULL); CREATE TABLE people ( id text PRIMARY KEY, name text NOT NULL, company_id text REFERENCES companies(id) ); INSERT INTO companies VALUES (c1,Acme Bank), (c2,Northwind Trading); INSERT INTO people VALUES (p1,Alice,c1), (p2,Bob,c1), (p3,Carol,c2); -- 自动发现表与外键并构建图 SELECT * FROM graph.auto_discover(public);跑完后用状态函数确认图已就绪SELECT node_count, edge_count, edge_types FROM graph.status();你会看到 3 个节点、1 个边类型。完整流程说明见 docs/quickstart.mdx。GQL 查询入门把图模式写进一条 SQLpgGraph 的 GQL 入口是一个普通 SQL 函数graph.gql(查询文本, params, hydrate)。它的核心设计是标签即表名、类型即边名节点标签如people解析为已注册的源表名关系类型如works_at解析为已注册的边标签变量用$name形式通过paramsJSONB 参数传入天然防注入。第一条 GQL单跳关系查询SELECT row FROM graph.gql( MATCH (p:people)-[:works_at]-(c:companies) WHERE p.name $name RETURN p.name AS person, c.name AS company ORDER BY company LIMIT 20, params : {name:Alice}::jsonb, hydrate : true );每条结果是一个row列的 JSONB 对象键就是RETURN里起的别名。这是刻意为 SDK 设计的稳定形状{ person: Alice, company: Acme Bank }返回完整节点、聚合与路径函数如果RETURN里直接写节点变量如RETURN cpgGraph 会返回水合后的节点对象包含保留键_id源表 主键与_labels以及可读的源行字段{ _id: { table: companies, id: c1 }, _labels: [companies], id: c1, name: Acme Bank }hydrate : false时只返回_id和_labels输出更紧凑。聚合查询同样是标准写法非聚合列自动成为分组键SELECT row FROM graph.gql( MATCH (p:people)-[:works_at]-(c:companies) RETURN c.name AS company, count(*) AS headcount ORDER BY company );路径函数nodes(p)、relationships(p)、length(p)可以作用于命名路径变量SELECT row FROM graph.gql( MATCH p(p:people)-[r:works_at]-(c:companies) RETURN p.name, length(p) AS len, hydrate : false );完整的能力清单以机器校验的 docs/user_guide/gql-profile.mdx 为准MATCH/OPTIONAL MATCH、WITH投影、DISTINCT、ORDER BY/SKIP/LIMIT、聚合、有界变长关系如*1..3等均已覆盖。openCypher 兼容层Cypher 存量查询如何迁移如果你手上的查询是 openCypher 风格pgGraph 提供了独立的兼容入口graph.cypher()它与graph.gql()映射到同一套执行模型返回形状完全一致SELECT row FROM graph.cypher( MATCH (p:people)-[:works_at]-(c:companies) RETURN p.name AS person, c.name AS company );入口定位配套函数graph.gql()文档化的 GQL 子集graph.gql_explain()graph.cypher()openCypher 形状的兼容层降级到同一 GQL IRgraph.cypher_explain()、graph.cypher_compatibility()两个关键事实值得强调同一逻辑 IR兼容层解析出的 Cypher 会降级到与 GQL 共享的逻辑中间表示源码中甚至有专门的测试binds_compatible_cypher_to_same_logical_ir_as_gql保证两者绑定出完全相同的计划见 graph/src/cypher/mod.rs。诚实的兼容矩阵pgGraph 不宣称完整的 openCypher 兼容。在数据库里直接查询矩阵即可SELECT feature, status, notes FROM graph.cypher_compatibility();矩阵内置于 graph/src/cypher/ast.rs摘要如下能力状态节点MATCH、单关系MATCH✅ supportedRETURN/WITH/ORDER BY/SKIP/LIMIT、聚合、路径函数✅ supported映射写入CREATE / SET / REMOVE / DELETE / DETACH DELETE / MERGE✅ supported仅限已注册映射CALL、YIELD、UNWIND、FOREACH、LOAD CSV、START、UNION、Cypher DDL❌ rejected完整 openCypher 兼容⚠️ not claimed不支持的写法会怎样不会静默出错。无法映射的语法会在执行前被拒绝并附带可操作的诊断信息例如SELECT * FROM graph.cypher(CALL db.labels() YIELD label RETURN label); -- 错误unsupported ... CALL/YIELD ...UNWIND、LOAD CSV、START nnode(1)等写法同理对应测试见 graph/src/pg_tests/cypher.rs。这意味着你可以放心把存量 Cypher 逐条迁移支持的就跑不支持的会得到明确错误而不是错误结果。GQL 写入实战CREATE、MERGE 与 DETACH DELETEpgGraph 的写路径是PostgreSQL 优先的GQL 写入先更新已映射的源表PostgreSQL 的约束、触发器、RLS、MVCC 全部照常生效然后才构建图侧结果。开启写入需要mutable_overlay投影模式SET graph.mutable_enabled on; SELECT * FROM graph.build(mode : mutable_overlay);然后就能写单节点/单关系的映射写入了-- 创建节点 SELECT row FROM graph.gql( CREATE (c:companies {id: $id, name: $name}) RETURN c, params : {id:c3,name:Vertex Labs}::jsonb ); -- 创建关系 SELECT row FROM graph.gql( MATCH (p:people {id: $from}), (c:companies {id: $to}) CREATE (p)-[r:works_at]-(c) RETURN r, params : {from:p1,to:c3}::jsonb ); -- 更新 / 清除属性 SELECT row FROM graph.gql( MATCH (c:companies {id: $id}) SET c.name $name RETURN c.name AS name, params : {id:c3,name:Vertex AI}::jsonb ); -- 幂等合并MERGE SELECT row FROM graph.gql( MERGE (c:companies {id: $id, name: $name}) ON CREATE SET c.name $name RETURN c.id AS id, params : {id:c3,name:Vertex AI}::jsonb ); -- 连同关联边一起删除节点 SELECT row FROM graph.gql( MATCH (c:companies {id: $id}) DETACH DELETE c RETURN c.id AS id, params : {id:c3}::jsonb );注意事项写入范围是刻意收窄的每次一条映射写入并发竞态走 PostgreSQL 的规则例如同键CREATE撞唯一约束会得到 SQLSTATE23505csr_readonly投影会直接拒绝写入。更多语义细节见 docs/user_guide/querying.mdx。调试技巧用 explain 与兼容矩阵看懂执行计划在把查询放进生产之前先用不执行的解释函数看看它如何绑定与降级SELECT graph.gql_explain( MATCH (p:people {id: $id}) RETURN p );输出形如NodeLookup(...)主键/id(node)等值直查或NodeScan(...)标签扫描写操作则显示CreateNode(...)、MergeNode(...)等物理计划实现见 graph/src/sql_facade/gql.rs。Cypher 侧对应graph.cypher_explain()。排错三步走语法/不支持错误看错误文本里的 feature 名如UNWIND、Cypher DDL对照graph.cypher_compatibility()的 notes 列计划不符合预期用explain确认是NodeLookup还是NodeScan必要时把标签条件改写成主键等值写失败确认投影模式是mutable_overlay、目标表已注册、且当前用户有对应表的 DML 权限。边界与限制pgGraph 明确不做什么保持预期准确比什么都能跑更重要。pgGraph 1.0 的 GQL 能力边界由 release/v1-gql-unsupported.json 逐条锁定典型例子写法结果MATCH (a)-[:knows*]-(b)无上界变长拒绝提示explicit upper boundSQLSTATE0A000MATCH ... UNION MATCH ...拒绝返回语法错误SQLSTATE42601CALL foo() RETURN 1拒绝返回语法错误关系属性表达式如r.weight1.0 子集之外请返回整个关系值此外标签始终解析为已注册的源表、关系类型解析为已注册的边标签权限由 PostgreSQL ACL 与 RLS 最终裁决——图函数不会绕过你对源表的可见性边界。更多已知问题与规避方案见 docs/known-issues.mdx。下一步深入文档与源码文档入口docs/user_guide/querying.mdxGQL 与 openCypher 兼容层全貌、docs/user_guide/gql-profile.mdx逐项能力清单、docs/user_guide/api-reference.mdxSQL API 参考浏览器内体验sandbox/start_playground.sh 一键启动带真实数据集的 SQL 检查台兼容层源码GQL 前端 graph/src/gql/词法、AST、解析openCypher 兼容前端 graph/src/cypher/含降级到 GQL IR 的lower.rsSQL 门面 graph/src/sql_facade/gql.rs 与 graph/src/sql_facade/cypher.rs集成测试graph/src/pg_tests/gql.rs 与 graph/src/pg_tests/cypher.rs一句话总结pgGraph 让图查询退化成一次普通的SELECT调用——GQL 与 openCypher 兼容层负责理解你的模式语法PostgreSQL 继续做它最擅长的事存储、权限与事务。赞分享【免费下载链接】pgGraphOpen-source graph database superpowers for your existing Postgres data.项目地址https://gitcode.com/gh_mirrors/pggr/pgGraph点击查看免费下载相关推荐Nebula Graph查询引擎揭秘openCypher兼容与nGQL语言Nebula Graph查询引擎揭秘openCypher兼容与nGQL语言 本文深入解析了Nebula Graph图数据库的查询引擎架构重点介绍了原生查询语图数据库终极指南Euler GQL图查询语言详解与10个实用查询示例终极指南Euler GQL图查询语言详解与10个实用查询示例 Euler是一个分布式图深度学习框架其内置的GQL图查询语言是处理复杂图数据的强大工具。本文将在Postgres里直接写图数据pgGraph GQL映射写入CREATE、MERGE与DELETE全解析在Postgres里直接写图数据pgGraph GQL映射写入CREATE、MERGE与DELETE全解析 前言为什么要在 Postgres 里直接写创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑