有没有办法使用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语句更复杂并且代码开始重复,它就会变得很难看。
答案 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());
}
}