下面的代码运行良好
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);
错误:数组索引必须解析为整数值
您正在使用using VLE来匹配模式。VLE match返回两个节点之间的边数组,它包含单个或多个边。
为了从VLE中访问边的属性,你应该使用UNWIND子句(参见例1)或者使用index(参见例2)从数组中检索边,然后访问属性。
示例1
SELECT * FROM cypher('age_graph', $$
MATCH (a)-[e*]->(c)
UNWIND e as edge
RETURN properties(edge)
$$) AS (e agtype);
或
SELECT * FROM cypher('age_graph', $$
MATCH (a)-[e*]->(c)
UNWIND e as edge
RETURN edge.distance
$$) AS (e agtype);
示例2
SELECT * FROM cypher('age_graph', $$
MATCH (a)-[e*]->(c)
WITH e[0] as edge1
RETURN edge1.distance
$$) AS (e agtype);
参见与VLE相关的其他问题:
- 如何找到所有可能的路线随着时间的推移?
- 如何从可变长度边的每个属性求和
- 使用Apache AGE创建最短路径
返回e.arrival_time
将尝试返回由查询中匹配的节点的所有属性组成的数组,这就是为什么会出现这种错误。根据这个github问题,你的查询应该看起来像这样:
SELECT * FROM cypher('age_graph', $$
MATCH (a)-[:LocatedAt*]->(c:City)
MATCH p = (a:Airport)-[e:Flight*]->(b:Airport)
MATCH (b)-[:LocatedAt*]->(c1:City)
UNWIND (relationships(p)) AS x RETURN SUM(x.arrival_time)
RETURN c, a, e, b, c1, e.arrival_time
$$) AS (c agtype, airport1 agtype,e agtype , airport2 agtype, c1 agtype, arrival agtype);
错误消息是因为您正在尝试访问使用一些非整数值作为索引的数组。让我们假设这里用作索引的值不是一个数字,或者如果它是浮点值而不是整数。
问题是在' .arrival_time'使用不同的表达式而不是返回整数值。如果是"e"关系,可以使用id属性。
在这里,.arrival_time意味着arrival_time是一个数组,你想访问数组元素。因此,要从该数组中获取数据,可以使用UNWIND或EXTRACT获取准确的数据。