Neo4j Spring Data 查询构建器

3

有没有一种使用Spring Data Neo4j动态构建Cypher查询的方法?


我有一个类似于以下过滤实体的Cypher查询:

@Query("MATCH (n:Product) WHERE n.name IN {0} return n")
findProductsWithNames(List<String> names);

@Query("MATCH (n:Product) return n")
findProductsWithNames();

当名称列表为空或为null时,我只想返回所有产品。因此,我的服务实现会检查名称数组并调用正确的存储库方法。给定的示例看起来很简洁,但一旦密码语句变得更加复杂并且代码开始重复,它就会变得非常混乱。


你是否在思考在@Query注释或者一般情况下能否实现这个功能? - troig
我不确定,但我认为@Query不太适合,因为查询基本上是静态的。 - Jotschi
2个回答

2
您可以创建自己的动态Cypher查询,并使用Neo4jOperations来执行它们。以下是一个示例(具有不同于您的OP的查询),我认为这可以说明如何实现:
   @Autowired
   Neo4jOperations template;

   public User findBySocialUser(String providerId, String providerUserId) {
      String query = "MATCH (n:SocialUser{providerId:{providerId}, providerUserId:{providerUserId}})<-[:HAS]-(user) RETURN user";

      final Map<String, Object> paramsMap = ImmutableMap.<String, Object>builder().
            put("providerId", providerId).
            put("providerUserId", providerUserId).
            build();

      Map<String, Object> result = template.query(query, paramsMap).singleOrNull();
      return (result == null) ? null : (User) template.getDefaultConverter().convert(result.get("user"), User.class);
   }

希望这有所帮助。

2
处理分页也可以通过这种方式:
@Test
@SuppressWarnings("unchecked")
public void testQueryBuilding() {
    String query = "MATCH (n:Product) return n";
    Result<Map<String, Object>> result = neo4jTemplate.query(query, Collections.emptyMap());
    for (Map<String, Object> r : result.slice(1, 3)) {
        Product product = (Product) neo4jTemplate.getDefaultConverter().convert(r.get("n"), Product.class);
        System.out.println(product.getUuid());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接