AGE中含`RETURN *`的Cypher转SQL查询报错,求未知列解决方案
AGE中Cypher RETURN *转SQL的列匹配问题
我正在为将Cypher查询转换为SQL的AGE项目添加查询支持,测试的Cypher语句如下:
MATCH p=({name: 'agens-graph'})-[{lang: 'java'}]->(m) RETURN *;
转换后的SQL语句为:
SELECT * FROM cypher('test', $$ MATCH p=({name: 'agens-graph'})-[{lang: 'java'}]->(m) RETURN * $$) AS (v agtype);
执行该SQL时出现错误:
ERROR: return row and column definition list do not match
问题:在不清楚RETURN *会生成哪些具体列的情况下,能否将AS (v agtype)替换为其他形式(如AS (* agtype))来支持该查询,或者AGE目前是否不支持这种场景?
解答
错误原因:当Cypher使用
RETURN *时,会返回所有匹配的变量(这里是路径p和节点m两个变量),而你写的AS (v agtype)只定义了一个列,列数不匹配导致报错。关于
AS (* agtype)的可行性:PostgreSQL本身不支持这种模糊列定义语法,必须明确指定每个返回列的名称和类型,所以这种写法无效。解决方案:
- 显式指定Cypher返回的变量:将Cypher语句改为
RETURN p, m,对应的SQL列定义改为AS (p agtype, m agtype),这样列数和类型就能严格匹配。 - 动态解析列:如果必须保留
RETURN *,在Cypher转SQL的过程中,需要先解析Cypher查询,识别出RETURN *对应的所有变量,再自动生成对应的列定义(比如解析出p和m后,生成AS (p agtype, m agtype))。
- 显式指定Cypher返回的变量:将Cypher语句改为
AGE的支持情况:目前AGE要求
cypher()函数的AS子句必须与查询返回的列数、类型完全匹配,不支持模糊的列定义方式,所以直接用AS (* agtype)无法解决问题。
内容的提问来源于stack exchange,提问作者Ken W.
相关产品推荐
相关产品推荐

