服务器端分页可能吗?

时间:2013-08-26 02:35:43

标签: java performance rest neo4j spring-data-neo4j

在Java应用程序中,我使用Spring-Data通过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>

我的存储库非常简单:

public interface FooRepository extends GraphRepository<Foo> {   
}

现在,我想循环一些Foo s:

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

然而,这个请求的表现很糟糕:完成需要400秒(!) 经过一些调试后,我发现Spring-data会生成以下查询:

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

然后看起来好像在客户端上进行了分页,并且所有Foo s(超过100,000)都被传输到客户端。使用Web界面向Neo4j服务器发出上述查询时,大约需要60秒。但是,如果我手动添加“LIMIT 5”,则执行时间减少到大约0.5秒。

我做错了什么,以便spring-data不使用服务器端,CYPHER分页?
根据{{​​3}}

  
    通过使用REST API转发这些调用,可以在服务器端高效执行遍历和查询等昂贵的操作。

  

或者这是否排除了分页?
在这种情况下我还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

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

  1. 在存储库中提供您自己的查询方法
  2. 密码查询应使用顺序,跳过并限制和参数化它们,以便您可以在每页的基础上传递跳过和限制值。
  3. E.g。

    start john=node:users("name:pangea")
    match john-[:HAS_SEEN]-(movie)
    return movie
    order by movie.name? 
    skip 20
    limit 10