2015-05-08 4 views
1

Есть ли способ динамического построения запроса cypher с использованием данных весны neo4j?Neo4j Spring Query Builder


У меня есть Cypher запрос, который фильтрует мои объекты, похожие на этот:

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

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

Когда список имен пуст или нулевой я просто хочу, чтобы вернуть все продукты. Поэтому моя услуга. проверяет массив имен и вызывает правильный метод репозитория. Данный пример выглядит чистым, но он действительно становится уродливым, когда инструкции cypher более сложны, и код начинает повторяться.

+0

Вам интересно, возможно ли это с аннотацией @Query или вообще использовать? – troig

+0

Я не знаю, но я думаю, что @Query не подходит, поскольку запрос в основном статичен. – Jotschi

ответ

1

Вы можете создать свои собственные динамические запросы Cypher и использовать Neo4jOperations для их выполнения. Вот это пример (с запросом, отличным от вашего OP), что я думаю, что может ilustrate, как это сделать:

@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

Обработки подкачки также можно таким образом:

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