我正在开发一个项目,我们使用 Neo4j 作为数据库。我有一个为应用程序构建并托管在云中的远程数据库。还有另一个数据库(本地数据库)托管在客户位置。
问题是:有没有办法同步两个数据库?有没有直接的COTS产品可以用于这种同步?
这取决于您运行的版本。 如果您使用企业版,您可以开箱即用地进行同步,但是如果您使用社区版,则必须自己进行同步。
我通过记录修改本地数据库上的数据的所有查询然后在远程数据库上重放来实现此目的。 下面的代码是在 c# 中执行此操作的示例
var query = _client.Cypher
.Match("(p:Person)")
.Where((Person p) => p.Id == id)
.Set("p = {person}")
.WithParam("person", person);
query.ExecuteWithoutResults();
RecordQuery(query);
private static void RecordQuery(dynamic query)
{
var syncStore = new SynchronisationStore();
var replayQuery = syncStore.Create();
replayQuery.TimeStamp = DateTime.Now;
var queryText = query.Query.QueryText.Replace("\r\n", " ");
replayQuery.CypherQueryText = queryText;
replayQuery.CypherQueryParameters = query.Query.QueryParameters;
syncStore.Store(replayQuery);
}
然后,您可以使用任何您想要的方法在服务器之间传输字符串数据(我使用 RESTful 服务)并使用以下方法重播:
public void ReplayQuery(ReplayQuery replayQuery)
{
foreach (var pair in replayQuery.CypherQueryParameters)
{
replayQuery.CypherQueryText = replayQuery.CypherQueryText.Replace("{" + pair.Key + "}", SerializeWithoutQuote(pair.Value));
}
var query = new CypherQuery(replayQuery.CypherQueryText, new Dictionary<string, object>(), CypherResultMode.Set, null);
_client.Connect();
((IRawGraphClient) _client).ExecuteCypher(query);
}
}
注意 - 您需要确保只重播一次并且按顺序重播查询。
虽然这可能是一个较旧的问题,可能不再涉及 Anish Bapna,但我仍然想提供一个答案,以防它对最终来到这里的其他人有价值。
过去,当我需要一个解决方案来比较和同步 Neo4j 开发数据库与 Neo4j 生产数据库时,我遇到了类似的挑战。尽管多年来进行了多次搜索,但我从未找到令人满意的解决方案。
自从 Anish Bapna 在回复 joe 时问道:“是否有更简单的方法或可用的工具来做到这一点?”我觉得今年年初,我创建了自己的 Neo4j 图形比较工具,它可以完全满足要求,这是相关的。它的名称为“Compare41”,可以通过 https://www.circles-arrows.com/.
访问。为了保持完全透明,以防不明显,我与 Circles Arrows 有着密切的联系。