OrientDB中Java调用astar函数执行SQL查询出现解析错误如何解决
问题产生原因
- 语法版本不兼容:你参考的3.1版本文档语法不适用于3.2.x版本,3.2对A*路径函数的调用规则做了修改,不再支持在
SELECT ... FROM V的投影字段位置直接调用该函数 - 调用上下文错误:astar是图路径计算专用函数,不需要指定
FROM V数据源,原有写法将其作为普通字段查询,解析器无法识别函数参数格式,所以在括号位置抛出解析错误 - 参数格式错误:权重字段名、方向、启发式算法名三个字符串类型参数,必须用单引号包裹,你原有写法未加引号,是触发解析错误的直接原因
解决方案
可直接运行的正确代码示例(参数绑定版本,避免SQL注入)
public void getShortestPath(int from, int to){ // 移除FROM V子句,字符串参数加单引号,用expand展开路径结果 String query = "SELECT expand(astar(?, ?, 'time', 'OUT', 'EUCLIDEAN'))"; OResultSet set = db.query(query, getNode(from).getProperty("@rid"), getNode(to).getProperty("@rid") ); // 后续业务逻辑:遍历set即可获取路径上的顶点/边序列,从中统计总通行时间 }
额外验证要求
- 确保你的顶点实体包含
latitude、longitude两个数值类型属性,EUCLIDEAN启发式算法依赖这两个属性计算两点间预估距离,缺失会导致运行时报错 - 确保连接顶点的边实体包含
time数值类型字段,用于路径权重计算 - 如果你不需要使用欧几里得距离作为启发式规则,可以去掉最后一个参数,使用默认的曼哈顿距离计算,降低计算开销
内容的提问来源于stack exchange,提问作者Jordan MacLachlan
相关产品推荐
相关产品推荐

