是否可以使用GraphRepository模式

时间:2016-01-24 17:58:26

标签: 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);

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

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

@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
);

where&#34; returnCourse&#34;是一个带有值&#34; RETURN课程&#34;的字符串。我知道&#34;返回课程&#34;在查询字符串中静态输入。我刚删除它并将字符串值作为参数传递,以查看它是否可以生成相同的查询并在运行时运行它。

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

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

1 个答案:

答案 0 :(得分:6)

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

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

希望有所帮助。