对边属性的访问



下面的代码运行良好

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获取准确的数据。

最新更新