是否可以使用 GraphRepository 模式动态构建 neo4j 密码查询
Is it possible to dynamically construct a neo4j cypher query using the GraphRepository pattern
上下文:
我正在开发一个由 neo4j 数据库支持的 java Spring 引导系统。我使用 "ClassRepo extends GraphRepository" 结构访问数据库。编写查询是在我的精确查询中进行硬编码并用提供的参数(在本例中为 courseName)替换其中指定部分的简单案例。
@Query("MATCH (node:Course) WHERE node.name = {courseName} RETURN node LIMIT 1")
Course findByName(@Param("courseName") String name);
这一切对我来说都很好,让我 return 一个或多个结果没有问题。然而,随着我的项目的发展,我现在提供了大量的搜索选项列表(分面搜索,想想亚马逊产品过滤器)。为每个选择或未选择的过滤选项的排列编写静态密码查询似乎很愚蠢。
我的解决方案(尝试)是将部分查询作为参数传递,本质上是创建一个字符串查询构建器:
@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"。我知道 "RETURN course" 在查询字符串中静态输入是有效的。我刚刚删除了它并将字符串值作为参数传递进来,以查看它是否可以生成相同的查询并在 运行 时间 运行 它。
这没有真正成功,return将我带到错误页面并打印出以下堆栈:http://pastebin.com/J9VBfpxw
问题:
有没有办法将 append/insert 字符串转换为 GraphRepository 使用的密码查询字符串,以便可以动态更改查询,即在 运行 时间将 where 子句添加到匹配查询的末尾。
不,没有。 SDN/Neo4j OGM 不会在 运行 时修改自定义查询,只会将它们交给 Cypher 引擎执行。因此,您唯一可以参数化的是 Cypher 允许您进行的参数化 (http://neo4j.com/docs/stable/cypher-parameters.html).
同意为每个变体定义多个 @Query 语句没有意义,但您可以将查询构建为字符串并使用 Neo4jOperations.query* 方法来接受您动态生成的Cypher 查询和参数映射(同样,在 Cypher 语句中有效的参数)。
希望对您有所帮助。
上下文: 我正在开发一个由 neo4j 数据库支持的 java Spring 引导系统。我使用 "ClassRepo extends GraphRepository" 结构访问数据库。编写查询是在我的精确查询中进行硬编码并用提供的参数(在本例中为 courseName)替换其中指定部分的简单案例。
@Query("MATCH (node:Course) WHERE node.name = {courseName} RETURN node LIMIT 1")
Course findByName(@Param("courseName") String name);
这一切对我来说都很好,让我 return 一个或多个结果没有问题。然而,随着我的项目的发展,我现在提供了大量的搜索选项列表(分面搜索,想想亚马逊产品过滤器)。为每个选择或未选择的过滤选项的排列编写静态密码查询似乎很愚蠢。
我的解决方案(尝试)是将部分查询作为参数传递,本质上是创建一个字符串查询构建器:
@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"。我知道 "RETURN course" 在查询字符串中静态输入是有效的。我刚刚删除了它并将字符串值作为参数传递进来,以查看它是否可以生成相同的查询并在 运行 时间 运行 它。
这没有真正成功,return将我带到错误页面并打印出以下堆栈:http://pastebin.com/J9VBfpxw
问题: 有没有办法将 append/insert 字符串转换为 GraphRepository 使用的密码查询字符串,以便可以动态更改查询,即在 运行 时间将 where 子句添加到匹配查询的末尾。
不,没有。 SDN/Neo4j OGM 不会在 运行 时修改自定义查询,只会将它们交给 Cypher 引擎执行。因此,您唯一可以参数化的是 Cypher 允许您进行的参数化 (http://neo4j.com/docs/stable/cypher-parameters.html).
同意为每个变体定义多个 @Query 语句没有意义,但您可以将查询构建为字符串并使用 Neo4jOperations.query* 方法来接受您动态生成的Cypher 查询和参数映射(同样,在 Cypher 语句中有效的参数)。
希望对您有所帮助。