使用Apache AGE创建图数据库时插入数据提示关系不存在
问题描述
我尝试从现有关系数据库创建图数据库,背景如下:
- 拥有一张包含产品编号和序列号的表,目标是构建展示二者关系的图数据库
- 由于产品编号存在树形结构,选择使用Apache AGE实现
已完成的操作:
- 成功执行图创建命令:
SELECT * FROM ag_catalog.create_graph('part_numbers_graph');
- 通过
SELECT * FROM ag_catalog.ag_graph;确认图已存在,查询结果:
graphid | name | namespace ---------+--------------------+-------------------- 32924 | part_numbers_graph | part_numbers_graph
- 已正确加载AGE扩展:
CREATE EXTENSION age; LOAD 'age';
执行插入命令时触发错误:
INSERT INTO part_numbers_graph SELECT agtype(format('{"id": %L, "label": "SSN", "properties": {"name": %L}}', SSN, SSN)::jsonb) FROM serial_table;
错误提示:relation "part_numbers_graph" does not exist
环境信息:PostgreSQL 12.14 (Ubuntu 12.14-1.pgdg22.04+1)
解决方法
Apache AGE中,图本身并非可直接插入数据的关系表,而是包含顶点、边表的命名空间,因此不能直接向图名称执行插入操作。推荐两种正确的插入方式:
方式1:使用CYPHER语句插入(推荐)
通过ag_catalog.cypher函数执行Cypher命令完成节点创建,这是AGE官方推荐的操作方式:
SELECT * FROM ag_catalog.cypher('part_numbers_graph', $$ CREATE (n:SSN {name: $ssn}) RETURN n $$, $${"ssn": SSN}$$) AS (n agtype) FROM serial_table;
方式2:先创建顶点标签,再插入对应表
- 先为目标图创建
SSN标签的顶点表:
SELECT * FROM ag_catalog.create_vlabel('part_numbers_graph', 'SSN');
- 向生成的顶点表插入数据:
INSERT INTO part_numbers_graph.SSN (id, properties) SELECT SSN, agtype_build_object('name', SSN) FROM serial_table;
内容的提问来源于stack exchange,提问作者Jesper
相关产品推荐
相关产品推荐

