Spring Neo4j传递节点属性为参数遇Cypher语法错误求解决
解决Spring Neo4j动态传参的语法错误问题
错误原因
你在Cypher语句里的参数写法不符合Spring Data Neo4j的规范,把参数占位符{id}直接嵌套在了节点属性的大括号里,导致Neo4j解析Cypher时识别为无效语法。
解决方案
将Cypher语句中的参数引用改为**$参数名**的形式,这是Spring Data Neo4j兼容Cypher原生的参数传递语法,同时保持Repository方法的@Param注解与参数名对应即可。
修改后的查询语句
String get_interest="MATCH(user:User{id: $id})-[watched:WATCHED]->(movie:Movie{title: $title}) " + "MATCH(movie)-[:BELONGS_TO]->(category:Category) " + "MATCH(category)<-[:BELONGS_TO]-(similarMovie:Movie) " + "WHERE NOT EXISTS((user) -[:WATCHED]->(similarMovie))" + "RETURN similarMovie Limit 20";
保持原Repository方法不变
@Query(get_interest) Collection<Movie> getMovieByInterest(@Param("id") String id, @Param("title") String title);
补充说明
- 旧版本的Spring Data Neo4j可能支持
{参数名}的写法,但在节点属性的大括号内部使用时会产生语法冲突,改用$参数名是更通用且符合Cypher标准的写法 - 这样修改后,参数会被Spring正确绑定并传递给Neo4j,既能避免硬编码值,又能保证语法合法
内容的提问来源于stack exchange,提问作者sami
相关产品推荐
相关产品推荐

