Java 服务器端分页是否可能?

Java 服务器端分页是否可能?,java,performance,rest,neo4j,spring-data-neo4j,Java,Performance,Rest,Neo4j,Spring Data Neo4j,在Java应用程序中,我使用Spring数据通过REST绑定访问Neo4j数据库 用作上下文的spring.xml包含以下行: <neo4j:config graphDatabaseService="graphDatabaseService" /> <neo4j:repositories base-package="org.example.graph.repositories"/> <bean id="graphDatabaseService" class

在Java应用程序中,我使用Spring数据通过REST绑定访问Neo4j数据库

用作上下文的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>
但是,此请求的性能非常糟糕:完成此请求需要超过400秒(!)。
经过一点调试,我发现Spring数据生成以下查询:

START `foo`=node:__types__(className="org.example.Foo") RETURN `foo`
然后看起来好像在客户端上完成了分页,所有
Foo
s(超过100000个)都被传输到客户端。使用web界面向Neo4j服务器发出上述查询时,大约需要60秒。但是,如果我手动添加一个“LIMIT 5”,执行时间将减少到0.5秒左右

我做错了什么,使spring数据不使用服务器端密码分页?

通过使用RESTAPI转发这些调用,在服务器端高效地执行诸如遍历和查询之类的昂贵操作

或者这排除了分页吗?

在这种情况下,我还有什么其他选择?

您可以执行以下操作来处理此服务器端

  • 在存储库中提供您自己的查询方法
  • cypher查询应该使用order、skip和limit并对它们进行参数化,以便您可以在每页的基础上传递skip和limit值
  • 例如


    好的,所以我必须手动操作。不是我想要的答案,但现在我知道了。:-)
    for (Foo foo : fooRepository.findAll(new PageRequest(0, 5))) //...
    
    START `foo`=node:__types__(className="org.example.Foo") RETURN `foo`
    
    start john=node:users("name:pangea")
    match john-[:HAS_SEEN]-(movie)
    return movie
    order by movie.name? 
    skip 20
    limit 10