使用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
相关产品推荐
相关产品推荐

