AGE中访问路径内边属性时报错,请求技术解决方案
在Apache AGE中访问路径内边属性时的错误解决方法
我在使用Apache AGE进行图查询时,以下代码可正常执行:
SELECT * FROM cypher('age_graph', $$ MATCH (a)-[:LocatedAt*]->(c:City) MATCH (a:Airport)-[e:Flight*]->(b:Airport) MATCH (b)-[:LocatedAt*]->(c1:City) RETURN c, a, e, b, c1 $$) AS (c agtype, airport1 agtype,e agtype , airport2 agtype, c1 agtype);
但尝试返回路径内边的属性时,执行以下代码出现错误:
SELECT * FROM cypher('age_graph', $$ MATCH (a)-[:LocatedAt*]->(c:City) MATCH (a:Airport)-[e:Flight*]->(b:Airport) MATCH (b)-[:LocatedAt*]->(c1:City) RETURN c, a, e, b, c1, e.arrival_time $$) AS (c agtype, airport1 agtype,e agtype , airport2 agtype, c1 agtype, arrival agtype);
错误信息:
ERROR: array index must resolve to an integer value
错误原因与解决方法
错误核心在于[e:Flight*]中的e是边的数组(*表示匹配0或多条边),而非单条边。直接通过e.arrival_time访问属性会被解析为数组索引操作,因此触发报错。根据业务需求,可选择以下两种解决方案:
- 仅匹配单条Flight边
如果业务逻辑只需要单个Flight边的属性,去掉*即可,此时e是单条边,可直接访问属性:
SELECT * FROM cypher('age_graph', $$ MATCH (a)-[:LocatedAt*]->(c:City) MATCH (a:Airport)-[e:Flight]->(b:Airport) MATCH (b)-[:LocatedAt*]->(c1:City) RETURN c, a, e, b, c1, e.arrival_time $$) AS (c agtype, airport1 agtype,e agtype , airport2 agtype, c1 agtype, arrival agtype);
- 处理多条Flight边的情况
若需要匹配多条边并提取每条边的属性,使用UNWIND将边数组展开后再访问:
SELECT * FROM cypher('age_graph', $$ MATCH (a)-[:LocatedAt*]->(c:City) MATCH (a:Airport)-[e:Flight*]->(b:Airport) MATCH (b)-[:LocatedAt*]->(c1:City) UNWIND e AS flight_edge RETURN c, a, e, b, c1, flight_edge.arrival_time $$) AS (c agtype, airport1 agtype,e agtype , airport2 agtype, c1 agtype, arrival agtype);
如果需要将所有边的属性收集为列表,可使用列表推导式:
SELECT * FROM cypher('age_graph', $$ MATCH (a)-[:LocatedAt*]->(c:City) MATCH (a:Airport)-[e:Flight*]->(b:Airport) MATCH (b)-[:LocatedAt*]->(c1:City) RETURN c, a, e, b, c1, [edge IN e | edge.arrival_time] AS arrival_times $$) AS (c agtype, airport1 agtype,e agtype , airport2 agtype, c1 agtype, arrival_times agtype);
内容的提问来源于stack exchange,提问作者Jaber
相关产品推荐
相关产品推荐

