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ここで、いくつかの 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 を使用してこれらの呼び出しを転送することにより、サーバー側で効率的に実行されます。

それとも、これはページネーションを除外しますか?
この場合、他にどのようなオプションがありますか?

4

1 に答える 1

2

このサーバー側を処理するには、以下を実行できます。

  1. リポジトリで独自のクエリ メソッドを提供する
  2. cypher クエリでは、order、skip、および limit を使用し、それらをパラメーター化して、ページごとにスキップ値と制限値を渡すことができるようにする必要があります。

例えば

start john=node:users("name:pangea")
match john-[:HAS_SEEN]-(movie)
return movie
order by movie.name? 
skip 20
limit 10
于 2013-08-26T15:53:52.753 に答える