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

使用AGE查询关联顶点名称时报错:no relation entry for relid 3

问题说明

我有一个包含两类节点的图:代表客户的Person节点,以及代表商家和店铺的Merchant节点,通过边记录客户在店铺的消费情况。创建节点与边的Cypher语句如下:

-- Customers
CREATE (Bobby :Person {id:'1', name:'Bobby', gender:'man', age: 72})

-- Merchants
CREATE (Amazon :Merchant {id:'2', name:'Amazon', street:'2626 Wilkinson Court', address:'San Bernardino, CA 92410'})

-- Transaction
CREATE (Bobby)-[:HAS_BOUGHT_AT {amount:'986', time:'4/17/2014', status:'Undisputed'}]->(Amazon)

当仅查询购买日期并按降序排列时,查询可成功返回结果:

SELECT * FROM cypher('MyGraph', $$
    MATCH (v)-[r :HAS_BOUGHT_AT]->(m)
    WITH toInteger(split(r.time, '/')[0]) as month, 
         toInteger(split(r.time, '/')[1]) as day, 
         toInteger(split(r.time, '/')[2]) as year
    RETURN month, day, year
    ORDER BY year DESC, month DESC, day DESC
$$) AS (month agtype, day agtype, year agtype);

查询结果:

month | day | year 
-------+-----+------
 12    | 28  | 2014
 12    | 26  | 2014
 12    | 24  | 2014
 12    | 23  | 2014
 12    | 20  | 2014
 12    | 20  | 2014
 12    | 20  | 2014
 12    | 20  | 2014
 12    | 16  | 2014
 12    | 15  | 2014
 11    | 28  | 2014
 11    | 27  | 2014
 11    | 14  | 2014
 10    | 25  | 2014
 10    | 15  | 2014

但当尝试返回匹配的顶点名称时,会抛出错误:

SELECT * FROM cypher('MyGraph', $$
    MATCH (v)-[r :HAS_BOUGHT_AT]->(m)
    WITH toInteger(split(r.time, '/')[0]) as month,
         toInteger(split(r.time, '/')[1]) as day,
         toInteger(split(r.time, '/')[2]) as year
    RETURN month, day, year, v.name, m.name
    ORDER BY year DESC, month DESC, day DESC
$$) AS (month agtype, day agtype, year agtype, v_name agtype, m_name agtype);

错误信息:

ERROR:  no relation entry for relid 3
解决方法

报错的核心原因是WITH子句只保留了month、day、year三个变量,把匹配到的v、m节点变量丢弃了,后续RETURN语句尝试访问v.name和m.name时,这两个变量已经不存在,因此触发错误。

可以通过两种方式修正:

方案1:在WITH中保留节点变量

在WITH子句里明确保留v和m,确保后续RETURN能正常访问节点属性:

SELECT * FROM cypher('MyGraph', $$
    MATCH (v)-[r :HAS_BOUGHT_AT]->(m)
    WITH v, m,
         toInteger(split(r.time, '/')[0]) as month,
         toInteger(split(r.time, '/')[1]) as day,
         toInteger(split(r.time, '/')[2]) as year
    RETURN month, day, year, v.name, m.name
    ORDER BY year DESC, month DESC, day DESC
$$) AS (month agtype, day agtype, year agtype, v_name agtype, m_name agtype);

方案2:直接在RETURN中处理日期转换(更简洁)

如果不需要用WITH做中间处理,直接把日期转换逻辑放到RETURN里,省去WITH步骤:

SELECT * FROM cypher('MyGraph', $$
    MATCH (v)-[r :HAS_BOUGHT_AT]->(m)
    RETURN toInteger(split(r.time, '/')[0]) as month,
           toInteger(split(r.time, '/')[1]) as day,
           toInteger(split(r.time, '/')[2]) as year,
           v.name, m.name
    ORDER BY year DESC, month DESC, day DESC
$$) AS (month agtype, day agtype, year agtype, v_name agtype, m_name agtype);

内容的提问来源于stack exchange,提问作者Matheus Farias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:47:40