2

目前我们的应用程序中有 2 个 Neo4j 数据库。我们使用 Spring Data Neo4j (SDN)。

第一个数据库是我们的 STAGING 数据库,另一个是 LIVE 数据库。这更多是为了版本控制和防止用户弄乱 LIVE 数据库。

我们有大约 50.000 个节点和 150.000 个关系。我们的 STAGING 区域适用于一小部分用户,我们只允许在 STAGING 中进行 CRUD 操作。在用户完成/验证 STAGING 中的数据后,我们会将数据集推送到 LIVE 数据库。LIVE 仅适用于只读数据库,仅在同步过程中允许使用 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 查询可以一次在两个数据库上运行。

欢迎任何想法。

谢谢,古纳万

4

1 回答 1

0

有什么方法可以在一个 Cypher 查询中进行查找和更新并在neo4jTemplate.query("....", params)函数中执行它?

如果你使用上面的代码,所有匹配的东西都必须从数据库中具体化为Item对象,然后再次保存在你的 repo 函数中,从而产生开销。

也许一个简单的

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

和一个新项目将完成这项工作?这样,工作在数据库中完成,不涉及 SDN 映射层。

于 2013-09-13T11:39:28.430 回答