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 中对其进行转义。
我正在尝试在 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 中对其进行转义。