在我们的项目中,PEPOLE通过KNOWS关系连接起来。我们需要深入查询一个朋友,其中n是用户输入的参数。我们使用Spring Data Neo4j来实现它。
public interface PeopleRepository extends GraphRepository<People>
{
@Query("MATCH (startnode{name:{name}})-[:KNOWS*1..{depth}]-(remote_friend) RETURN remote_friend.name");
List<People> getFriendsInDepth(@Param("name") String name, @Param("depth") Integer depth);
}
以上代码无效。但是如果我用固定的Integer值替换{depth}参数,如下所示:
@Query("MATCH (startnode{name:{name}})-[:KNOWS*1..2]-(remote_friend) RETURN remote_friend.name");
List<People> getFriendsInDepth(@Param("name") String name, @Param("depth") Integer depth);
它有效。我知道问题是由深度参数引起的。但是我尝试了很多方法来替换{depth},例如:toInt({depth}),它仍然无法工作。有没有人知道如何在Cypher语句中使用参数进行可变长度模式匹配?
答案 0 :(得分:1)
Cypher不允许您参数化关系的深度,因此@Query也不会支持它。
如果您使用Spring Data Neo4j 4,那么您可以将@Query
翻译为一组org.neo4j.ogm.cypher.Filter
。
然后,您可以使用接受Session.loadAll
的{{1}}方法以及深度。
MusicIntegrationTest包含几个过滤器示例。