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());
}
}
有没有办法使用 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());
}
}