2013-08-26 76 views
3

在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小号循环:

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

但是,这个请求的表现是可怕的:它接管400秒(!)完成。
有点调试后,我发现春数据生成以下查询:

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

然后,它看起来好像分页客户端上完成,所有Foo秒(超过10万)被转移给客户。当使用Web界面向Neo4j服务器发出上述查询时,大约需要60秒。但是,如果我手动追加“限制5”,执行时间会缩短到0.5秒左右。

我在做什么错误,以便spring-data不使用服务器端,CYPHER分页?
根据Programming Model

像遍历和查询昂贵的操作是通过使用REST API那些呼叫转移在服务器侧有效地执行。

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

回答

2

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

  1. 在仓库中
  2. Cypher支架查询应使用顺序,跳过和极限和参数,从而使您可以在跳跃和极限值通过对每个页面的基础上提供自己的查询方法。

例如,

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

好吧,所以我必须手动执行此操作。不是我正在寻找的答案,但现在我知道了。 :-) – Matthias