Neo4j Spring 数据查询生成器

Neo4j Spring Data Query Builder

有没有办法使用 spring 数据 neo4j 动态构建密码查询?


我有一个密码查询来过滤我的实体,类似于这个:

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

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

当名称列表为空或 null 时,我只想 return 所有产品。因此我的服务意味着。检查名称数组并调用正确的存储库方法。给定的示例看起来很干净,但一旦 cypher 语句更复杂并且代码开始自我重复,它就会变得很难看。

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

希望对您有所帮助

也可以这样处理分页:

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