Spring Boot neo4j 查询参数

Spring Boot neo4j query param

提问人:Gambanishu Habbeba 提问时间:3/12/2022 更新时间:3/13/2022 访问量:291

问:

我正在尝试在 Spring Boot 项目中使用 params 为 Neo4J 编写 Cypher 查询。 有很多教程显示显示这些东西,但它们都不适合我。一个版本是这样的:

@Query("MATCH p=(n:Phone {phoneId:{0}})-[f:calling]-(m) OPTIONAL MATCH (m)-[r]-() where length(p)<{1} return m,r")
...

这将在 is it 中执行,其中有 and,显然它不起作用。{0}{1}

某些网站使用以下语法:

@Query("MATCH (a:City {name:$departure}), (b:City {name:$arrival})\n"
      + "MATCH p=(a)-[*]->(b)\n"
      + "WITH collect(p) as paths\n"
      + "CALL apoc.spatial.sortByDistance(paths) YIELD path, distance\n"
      + "RETURN path, distance")
  List<Path> getAllPaths(String departure, String arrival);

这甚至无法编译。它说查询必须是编译时常量。

如果是带有MySQL的JPA,它将如下所示:

    @Query("update blah b set b.foo = :foo, b.bar = :bar where b.id = :id")
    fun update(foo: String, bar: String, id: Int)

使用 Neo4J 时,该部件也会在查询中结束,而不会进行任何值替换。:param

所以主要问题是:我怎样才能为Neo4J编写带有参数的Cypher查询?奖励问题:这些不同语法的故事是什么?我从未听说过前 2 个。那是老东西吗?

spring-boot kotlin neo4j spring-data-jpa

评论


答:

3赞 Gambanishu Habbeba 3/13/2022 #1

好的,我已经想通了。正确的语法是......鼓声...

    @Query(value = "match (:Dude {dudeId: \$underlingId1})-[*0..]->(x)<-[*0..]-(:Dude {dudeId: \$underlingId2}) return x")
    fun findLCA(underlingId1: Int, underlingId2: Int): Dude

等效的 Java 语法为:

    @Query(value = "match (:Dude {dudeId: $underlingId1})-[*0..]->(x)<-[*0..]-(:Dude {dudeId: $underlingId2}) return x")
    Dude findLCA(Integer underlingId1, Integer underlingId12);

因此,Neo4J 库对 $ 字符进行了操作,该字符需要在 Kotlin 中转义。