You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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;

代码说明

  1. 直接调用ag_catalog.cypher函数,通过USING子句将PL/pgSQL参数传递给Cypher语句的位置参数$1至$9。
  2. 在Cypher的RETURN子句中用id(n)获取节点的内部graphid,而非从属性中提取。
  3. 使用正确的ag_catalog.graphid类型声明,避免跨数据库引用错误。
  4. 通过SELECT ... INTO直接将查询结果赋值给变量new_id,无需使用EXECUTE format(仅在动态构造图名等场景需要)。

内容的提问来源于stack exchange,提问作者Chide Ogan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:07:13