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 を使用してこれらの呼び出しを転送することにより、サーバー側で効率的に実行されます。
それとも、これはページネーションを除外しますか?
この場合、他にどのようなオプションがありますか?