在2个Neo4j数据库之间同步数据的最佳方法是什么?

时间:2013-09-11 06:54:55

标签: nosql neo4j spring-data-neo4j

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

第一个数据库是我们的STAGING数据库,另一个是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();

SyncService 类上执行从STAGING到LIVE db的同步过程:

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查询可以一次在两个数据库上运行。

欢迎任何想法。

谢谢, 古纳万

1 个答案:

答案 0 :(得分: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

一个新项目可以完成这项工作吗?这样,工作在DB中完成,不会触及SDN映射层。