2

現在、アプリケーションには 2 つの Neo4j データベースがあります。Spring Data Neo4j (SDN) を使用しています。

最初のデータベースは STAGING データベースで、もう 1 つは LIVE データベースです。これは、バージョン管理の目的と、ユーザーが LIVE データベースを台無しにするのを防ぐためです。

約 50.000 のノードと 150.000 の関係があります。私たちの STAGING エリアは、少数のユーザーのサブセットを対象としており、STAGING でのみ CRUD 操作を実行できます。ユーザーが STAGING でデータをファイナライズ/検証した後、データセットを LIVE データベースにプッシュします。LIVE は READ ONLY データベースのみを対象とし、CRUD は同期プロセス中にのみ許可されます。

両方のデータベース間でデータを同期する最良の方法は何だろうと思っており、同期により増分更新が可能になるはずです。

Cypher Query + SDN を使用してノードごとに同期しようとしましたが、障害にぶつかり、時間がかかりすぎます。

@Query("START n=node:ItemCode('code:*') "
     + "WHERE has(n.status) AND n.status = 'ACTIVE') "
     + "RETURN n");
public Iterable<Item> getAllActiveItems();

STAGINGから LIVE db への同期プロセスを実行するSyncServiceクラス:

Iterable<Item> items = stagingRepo.getAllActiveItems();
for(Item item:items) {

    Item item = liveRepo.findItem(item.getCode());
    if(item == null) {
        //create item
    } else {
        //update item
    }
}

[更新] Peter Neubauerの回答に基づいて、Cypher クエリを一度に 2 つのデータベースで実行できるように、データベース リンクの概念があるかどうかをさらに調査したいと思います。

どんなアイデアでも大歓迎です。

ありがとう、ぐなわん

4

1 に答える 1

0

検索と更新を 1 つの Cypher クエリで実行し、neo4jTemplate.query("....", params)関数で実行する方法はありますか?

上記のコードを使用する場合、一致するすべてのものをデータベースからItemオブジェクトに実体化してから、リポジトリ関数に再度保存する必要があり、そのオーバーヘッドが発生します。

多分単純な

START n=node:ItemCode('code:*')
WHERE has(n.status) AND n.status = 'ACTIVE')
WITH n
SET n.updated=1

そして、新しいアイテムの1つは仕事をするでしょうか? そうすれば、作業は DB で行われ、SDN マッピング レイヤーには影響しません。

于 2013-09-13T11:39:28.430 に答える