是否可以使用GraphRepository模式动态构造neo4j cypher查询

Jac*_*ton 6 spring neo4j cypher spring-data-neo4j-4 neo4j-ogm

语境:我正在开发一个由neo4j数据库支持的java Spring Boot系统.我使用"ClassRepo extends GraphRepository"结构访问数据库.编写查询是我的精确查询中硬编码的简单情况,并用提供的参数(在本例中为courseName)替换它的指定部分.

@Query("MATCH (node:Course) WHERE node.name = {courseName}  RETURN node LIMIT 1")
Course findByName(@Param("courseName") String name);
Run Code Online (Sandbox Code Playgroud)

这对我来说都很好,让我可以毫无问题地返回一个或多个结果.然而,随着我的项目的发展,我现在提供了大量的搜索选项列表(分面搜索,思考亚马逊产品过滤器).为所选择的或未选择的过滤选项的每个排列编写静态密码查询似乎很愚蠢.

我的解决方案(尝试)是将部分查询作为参数传递,实质上是创建一个字符串查询构建器:

@Query("MATCH (course:Course) -[r]-> (description:CourseYearDescription) " +
        "WITH course, count(description) as relationCount, collect(description) as descriptions " +
        "WHERE relationCount > {numberOfYears} {returnCourse}")
Iterable<Course> findCourseWithNumberOfYears(
        @Param("numberOfYears") int numberOfYears,
        @Param("returnCourse") String returnCourse
);
Run Code Online (Sandbox Code Playgroud)

其中"returnCourse"是一个值为"RETURN course"的字符串.我知道在查询字符串中静态输入"RETURN课程"的事实.我刚删除它并将字符串值作为参数传递,以查看它是否可以生成相同的查询并在运行时运行它.

这没有真正的成功,让我回到错误页面并打印出以下堆栈:http://pastebin.com/J9VBfpxw

问题:是否有办法将字符串附加/插入到GraphRepository使用的密码查询字符串中,以便可以动态更改查询,即在运行时将where子句添加到匹配查询的末尾.

Lua*_*nne 6

不,没有.SDN/Neo4j OGM不会在运行时修改自定义查询,只需将它们交给Cypher引擎执行即可.因此,您可以参数化的唯一内容是Cypher允许您访问的内容(http://neo4j.com/docs/stable/cypher-parameters.html).

同意为每个变体定义多个@Query语句没有意义,但您可以做的是将查询构建为字符串并使用Neo4jOperations.query*方法接受动态生成的Cypher查询和参数映射(同样,在Cypher语句中有效的参数).

希望有所帮助.