gpt4 book ai didi

java - 服务器端分页可能吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:16 29 4
gpt4 key购买 nike

在 Java 应用程序中,我使用 Spring-Data 通过 REST 绑定(bind)访问 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 多秒(!)才能完成。
经过一些调试,我发现 Spring-data 生成了以下查询:

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

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

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

the expensive operations like traversals and querying are executed efficiently on the server side by using the REST API to forward those calls.

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

最佳答案

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

  1. 在存储库中提供自己的查询方法
  2. 密码查询应使用 order、skip 和 limit 并将它们参数化,以便您可以按页传递 skip 和 limit 值。

例如

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

关于java - 服务器端分页可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18435827/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com