Spring 引导 neo4j 查询参数

Spring Boot neo4j query param

我正在尝试在 Spring 引导项目中使用参数为 Neo4J 编写 Cypher 查询。 有很多教程展示了这些内容,但其中 none 对我有用。一个版本是这样的:

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

这会被执行,其中包含 {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 查询?奖金问题:这些不同语法的故事是什么?我从没听说过前两个。那是旧东西吗?

好的,我已经弄明白了。正确的语法是……击鼓声……

    @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 中对其进行转义。