Разбиение по страницам и сортировка в Spring Data Neo4j 4

Есть ли поддержка разбиения на страницы для пользовательских запросов в SDN4?

  • Если да, то как это работает?
  • Если нет, есть ли обходной путь?

У меня есть следующий репозиторий Spring Data Neo4j 4:

@Repository
public interface TopicRepository 
  extends GraphRepository<Topic>,IAuthorityLookup {

  // other methods omitted
  @Query("MATCH (t:Topic)-[:HAS_OFFICER]->(u:User) "
    + "WHERE t.id = {0} "
    + "RETURN  u")
  public Page<User> topicOfficers(Long topicId, Pageable pageable);
}

И соответствующий тесткейс:

@Test
public void itShouldReturnAllOfficersAsAPage() {
  Pageable pageable = new PageRequest(1,10);
  Page<User> officers = topicRepository.topicOfficers(1L, pageable);
  assertNotNull(officers);
}

Когда я запускаю тест, я сталкиваюсь со следующим исключением

Failed to convert from type java.util.ArrayList<?> to type   org.springframework.data.domain.Page<?> for value '[org.lecture.model.User@1]'; 
nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type java.util.ArrayList<?> to type org.springframework.data.domain.Page<?>

Это моя установка:

dependencies {
//other dependencies omitted
  compile("org.neo4j:neo4j-cypher-dsl:2.0.1")


  compile "org.neo4j.app:neo4j-server:2.2.2"

  compile(group: 'org.springframework.data',
          name: 'spring-data-neo4j',
          version: '4.0.0.BUILD-SNAPSHOT')


  compile(group: 'org.springframework.data',
          name: 'spring-data-neo4j',
          version: '4.0.0.BUILD-SNAPSHOT',
          classifier: 'tests')

  testCompile(group: 'org.neo4j',
          name: 'neo4j-kernel',
          version: '2.2.2',
          classifier: 'tests')

  testCompile(group: 'org.neo4j.app',
              name: 'neo4j-server',
              version: '2.2.2',
              classifier: 'tests')

  testCompile(group: 'org.neo4j',
              name: 'neo4j-io',
              version: '2.2.2',
              classifier: 'tests')
} 

Снимок, который я использую, должен обрабатывать разбиение на страницы, поскольку следующий тест работает нормально:

@Test
public void itShouldReturnAllTopicsAsAPage() {

  Pageable pageable = new PageRequest(1,10);
  Page<Topic> topics = topicRepository.findAll(pageable);

  assertNotNull(topics);
}

person ShrimpPhaser    schedule 03.06.2015    source источник


Ответы (2)


На данный момент это невозможно.

Чтобы включить эту функцию, нам нужно сделать несколько вещей. Сначала при запуске нам нужно будет проверить сигнатуру связанного с запросом метода и пометить запрос как требующий разбиения по страницам. Затем во время выполнения, когда метод был вызван, нам нужно было бы получить экземпляр страницы, извлечь параметры страницы и применить их как предложения SKIP и LIMIT к соответствующему запросу Cypher. Наконец, по возвращении нам нужно обернуть результаты в объект Page. Так что есть немного работы, чтобы сделать это возможным.

Тем временем вы можете попробовать добавить в запрос предложения SKIP и LIMIT с параметризованными значениями и передать соответствующие значения через метод запроса. Я не пробовал это, но это должно работать - в теории:

  @Query("MATCH (t:Topic)-[:HAS_OFFICER]->(u:User) "
+ "WHERE t.id = {0} "
+ "RETURN  u SKIP {1} LIMIT {2}" )
public List<User> topicOfficers(long topicId, long skip, long limit)
person Vince    schedule 03.06.2015
comment
Спасибо за ваш ответ! У меня есть один вопрос, так как вы лучше меня разбираетесь в SDN4... будет ли эта функция (если вообще будет) доступна в обозримом будущем? Скажем, RC SDN4. Эта информация очень помогла бы мне принять решение о том, переписывать ли мой API. - person ShrimpPhaser; 03.06.2015
comment
Он не будет доступен в первом RC, потому что сейчас код замораживается. Я создал для него тикет и добавил его в список невыполненных работ для следующего релиза. Пока не могу сказать, когда это будет. jira.spring.io/browse/DATAGRAPH-653 - person Vince; 03.06.2015
comment
@Vince Для нашей системы нам нужны значения getTotalPages (), isFirst () и isLast () со страницы, возвращаемой при выполнении пользовательского запроса на подкачку. Можете ли вы дать какие-либо рекомендации о том, как это сделать / есть ли код SDN, на который вы можете мне указать, который выполняет построение объекта Page? Спасибо - person Coder Shark; 13.08.2015
comment
см. мой ответ здесь: stackoverflow.com/questions/32011358/ - person Vince; 14.08.2015
comment
Я только что решил эту проблему, добавив countQuery в аннотацию @Query. Пример: @Query(value = MATCH (t:Topic)-[:HAS_OFFICER]->(u:User) WHERE t.id = {0} RETURN u, countQuery = MATCH (t:Topic)-[:HAS_OFFICER]- ›(u:Пользователь) ГДЕ t.id = {0} RETURN count(u)) - person Marian; 16.06.2016

Теперь это разрешено с использованием интерфейсов Sort или Pageable в вашем запросе и исправлено в DATAGRAPH-653 и помечены как исправленные в версии 4.2.0.M1 (в настоящее время в предварительном выпуске).

Возможны такие запросы:

@Query("MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN actor")
List<Actor> getActorsThatActInMovieFromTitle(String movieTitle, Sort sort);

а также:

@Query("MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN actor")
Page<Actor> getActorsThatActInMovieFromTitle(String movieTitle, PageRequest page);

(пример из примеров шифрования в документах Spring Data + Neo4j)

Поиск предварительных сборок Spring Data Neo4j Milestone:

Вы можете просмотреть информацию о зависимостях для любого выпуска на странице проекта. А для сборки 4.2.0.M1 информация для Gradle (вы можете сделать вывод о Maven):

dependencies {
    compile 'org.springframework.data:spring-data-neo4j:4.2.0.M1'
}

repositories {
    maven {
        url 'https://repo.spring.io/libs-milestone'
    }
}

Вместо этого следует использовать любой более новый окончательный выпуск.

person Jayson Minard    schedule 08.09.2016