簡體   English   中英

服務器端分頁可能嗎?

[英]Server-side paging possible?

在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秒(!)。
經過一些調試后,我發現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分頁?
根據編程模型

通過使用REST API轉發這些調用,可以在服務器端高效執行遍歷和查詢等昂貴的操作。

或者這是否排除了分頁?
在這種情況下我還有哪些其他選擇?

您可以執行以下操作來處理此服務器端。

  1. 在存儲庫中提供您自己的查詢方法
  2. 密碼查詢應使用順序,跳過和限制以及參數化它們,以便您可以在每頁的基礎上傳遞跳過和限制值。

例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM