Neo4j Spring数据查询生成器

时间:2015-05-08 18:39:25

标签: spring-data-neo4j

有没有办法使用spring数据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时,我只想返回所有产品。因此,我的服务impl。检查names数组并调用正确的存储库方法。给定的示例看起来很干净,但是一旦cypher语句更复杂并且代码开始重复,它就会变得很难看。

2 个答案:

答案 0 :(得分:1)

您可以创建自己的动态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);
   }

希望有所帮助

答案 1 :(得分:1)

也可以通过这种方式处理分页:

@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());
    }
}