在 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 分页?
根据编程模型
通过使用 REST API 转发这些调用,可以在服务器端有效地执行遍历和查询等昂贵的操作。
或者这是否排除了分页?
在这种情况下,我还有哪些其他选择?