Возможна подкачка на стороне сервера?

В приложении Java я использую Spring-Data для доступа к базе данных Neo4j через привязку REST.

Spring.xml, используемый в качестве контекста, содержит следующие строки:

<neo4j:config graphDatabaseService="graphDatabaseService" />
<neo4j:repositories base-package="org.example.graph.repositories"/>

<bean id="graphDatabaseService"
    class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
    <constructor-arg index="0" value="http://example.org:1234/db/data" />
</bean>

Мой репозиторий очень простой:

public interface FooRepository extends GraphRepository<Foo> {   
}

Теперь я хотел бы пройтись по нескольким Foo:

for (Foo foo : fooRepository.findAll(new PageRequest(0, 5))) //...

Однако производительность этого запроса ужасна: для выполнения требуется более 400 секунд (!).
После небольшой отладки я обнаружил, что Spring-data генерирует следующий запрос:

START `foo`=node:__types__(className="org.example.Foo") RETURN `foo`

Тогда это выглядит так, как будто на клиенте выполняется пейджинг, и все Foo (более 100 000) передаются клиенту. При отправке вышеуказанного запроса на сервер Neo4j через веб-интерфейс это занимает около 60 секунд. Однако, если я вручную добавлю «LIMIT 5», время выполнения сократится примерно до 0,5 секунды.

Что я делаю неправильно, так что spring-data не использует разбивку на страницы CYPHER на стороне сервера?
Согласно Модель программирования

дорогостоящие операции, такие как обход и запросы, эффективно выполняются на стороне сервера за счет использования REST API для перенаправления этих вызовов.

Или это исключает разбиение на страницы?
Какие еще варианты у меня есть в этом случае?


person Matthias    schedule 26.08.2013    source источник


Ответы (1)


Вы можете сделать следующее, чтобы справиться с этой серверной стороной.

  1. Предоставьте свой собственный метод запроса в репозитории
  2. Шифровальный запрос должен использовать порядок, пропускать, ограничивать и параметризировать их, чтобы вы могли передавать значения пропуска и ограничения для каждой страницы.

E.g.

start john=node:users("name:pangea")
match john-[:HAS_SEEN]-(movie)
return movie
order by movie.name? 
skip 20
limit 10
person Aravind Yarram    schedule 26.08.2013
comment
Хорошо, мне нужно сделать это вручную. Не тот ответ, который я искал, но теперь я его знаю. :-) - person Matthias; 27.08.2013