在PL/pgSQL中使用Apache AGE Cypher创建节点并获取ID报错求助
解决Apache AGE在PL/pgSQL中创建节点并获取graphid的问题
第一个错误的原因
- 使用
plcypher语言编写函数时,Cypher语句的变量引用和语法有特定要求,且你的RETURN子句引用了不存在的节点b(应为n)。 - 在Cypher语句中无法直接通过
$p_bar_name这种命名参数引用PL/pgSQL参数,需要用位置参数或正确的变量绑定方式。
第二个错误的原因
algorithm.ag_catalog.agtype是错误的类型声明,agtype属于ag_catalog模式,无需添加图名(algorithm是图名)作为前缀,正确写法为ag_catalog.agtype。- 你试图从节点属性中提取
id,但AGE节点的内部graphid需要通过Cypher的id(n)函数返回,而非从properties中获取。
修正后的函数代码
CREATE OR REPLACE FUNCTION Reader ( p_bar_name VARCHAR, p_bar_tag VARCHAR, p_bar_city VARCHAR, p_bar_state VARCHAR, p_bar_address VARCHAR, p_bar_country VARCHAR, p_tag_image VARCHAR, p_bar_image VARCHAR, p_bar_email VARCHAR ) RETURNS ag_catalog.graphid AS $$ DECLARE new_id ag_catalog.graphid; BEGIN -- 调用ag_catalog.cypher创建节点并返回其graphid SELECT id INTO new_id FROM ag_catalog.cypher('algorithm', $$ CREATE (n:Bar { bar_name: $1, bar_tag: $2, bar_city: $3, bar_state: $4, bar_address: $5, bar_country: $6, tag_image: $7, bar_image: $8, bar_email: $9 }) RETURN id(n) $$) AS (id ag_catalog.graphid) USING p_bar_name, p_bar_tag, p_bar_city, p_bar_state, p_bar_address, p_bar_country, p_tag_image, p_bar_image, p_bar_email; RETURN new_id; END; $$ LANGUAGE plpgsql;
代码说明
- 直接调用
ag_catalog.cypher函数,通过USING子句将PL/pgSQL参数传递给Cypher语句的位置参数$1至$9。 - 在Cypher的RETURN子句中用
id(n)获取节点的内部graphid,而非从属性中提取。 - 使用正确的
ag_catalog.graphid类型声明,避免跨数据库引用错误。 - 通过
SELECT ... INTO直接将查询结果赋值给变量new_id,无需使用EXECUTE format(仅在动态构造图名等场景需要)。
内容的提问来源于stack exchange,提问作者Chide Ogan
相关产品推荐
相关产品推荐

