我正在尝试使用一些Neo4j的APOC程序,主要包括 apoc.periodic.commit
和 apoc.periodic.iterate
使用 @Query
注解的Spring Data Neo4j仓库中。下面的查询将作为一个例子。
@Query("CALL apoc.periodic.commit(\"MATCH (n:SomeNodeLabel)-[*]->(x) WHERE ID(n) = {id} DETACH DELETE x RETURN COUNT(x) LIMIT {limit}\", {limit:10000});")
public void deleteXyz(@Param("id") Long id);
问题是,当以程序方式执行时(例如,在单元测试中),执行没有效果(没有删除任何内容),但也没有错误。在Web界面中执行时,一切正常。
在Neo4j的配置文件中,所有的查询都是启用白名单的。
为了防止将来有人面临同样的问题,我想出了办法,它与Spring Data Neo4j仓库中的@Query注解有关。
它与传递参数到存储过程查询的方式有关。用下面的版本代替上面的版本。
@Query("CALL apoc.periodic.commit(\"MATCH (n:SomeNodeLabel)-[*]->(x) WHERE ID(n) = {id} DETACH DELETE x RETURN COUNT(x) LIMIT {limit}\", {limit:10000, id: {id}});")
public void deleteXyz(@Param("id") Long id);