目前我们的应用程序中有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查询可以一次在两个数据库上运行。
欢迎任何想法。
谢谢, 古纳万
答案 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映射层。