spring - 是否可以使用 GraphRepository 模式动态构建 Neo4j 密码查询

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

其中“returnCourse”是一个值为“RETURN course”的字符串。我知道在查询字符串中静态输入的“返回类(class)”有效。我刚刚删除了它并将字符串值作为参数传入,以查看它是否可以生成相同的查询并在运行时运行它。

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

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

最佳答案

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

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

希望有帮助。

关于spring - 是否可以使用 GraphRepository 模式动态构建 Neo4j 密码查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34979333/

相关文章:

neo4j - 密码查询,加载 CSV 在 Neo4j 2.1 中没有响应

neo4j - 如何删除所有没有任何关系的节点 - neo4j/cypher

java - 将 spring mvc 添加到 spring java "desktop"应用程序

Spring嵌套事务

java - 在 java config 中添加 http 安全过滤器

database - Neo4j - 查找从未与其他节点有任何关系的节点

neo4j - 查询不同的属性并返回完整的节点

java - Spring App + Tomcat + XSLT = TransformerFactoryConfigurationError

apache-spark - 来自Docker的Ne​​o4j和Spark的ServiceUnavailableException

neo4j - 如何在 Neo4j 中找到飞行的持续时间