如何在Cypher语句中使用参数进行可变长度模式匹配?

时间:2015-09-24 09:48:20

标签: neo4j cypher spring-data-neo4j

在我们的项目中,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语句中使用参数进行可变长度模式匹配?

1 个答案:

答案 0 :(得分:1)

Cypher不允许您参数化关系的深度,因此@Query也不会支持它。

如果您使用Spring Data Neo4j 4,那么您可以将@Query翻译为一组org.neo4j.ogm.cypher.Filter

然后,您可以使用接受Session.loadAll的{​​{1}}方法以及深度。 MusicIntegrationTest包含几个过滤器示例。