В приложении 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 для перенаправления этих вызовов.
Или это исключает разбиение на страницы?
Какие еще варианты у меня есть в этом случае?