Neo4j --如何同步本地数据库与远程neo4j数据库服务器

tjrkku2a  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(336)

我正在做一个项目,我们使用Neo4j作为数据库。我有一个为应用程序构建的远程数据库,并托管在云中。还有另一个数据库(本地数据库)托管在客户端的位置。
问题是:有没有办法同步两个数据库?是否有任何直接的COTS产品可用于此同步?

o7jaxewo

o7jaxewo1#

虽然这可能是一个老问题,可能不再关心阿尼什巴普纳,我仍然想提供一个答案,以防它证明有价值的任何人谁最终在这里。
过去,当我需要一个解决方案来比较和同步Neo4j开发数据库与Neo4j生产数据库时,我也面临过类似的挑战。尽管在几年的时间里进行了多次搜索,但我从未遇到过令人满意的解决方案。
自从Anish Bapna在回应乔时问道:“有没有一种更简单的方法或者某种工具可以做到这一点?“我觉得这是相关的,在今年年初,我创建了自己的Neo4j图形比较工具,可以做什么正是被要求。它的名字是“Compare41”,可以在https://www.circles-arrows.com/上访问。
为了保持完全的透明度,以防它不明显,我与圆圈箭头有密切的联系。

vuktfyat

vuktfyat2#

这取决于你运行的版本。如果您使用企业版,您可以立即进行同步,但是如果您使用社区,您必须自己进行同步。
我通过记录所有修改本地数据库上数据的查询,然后在远程数据库上重放来实现这一点。下面的代码是一个用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);
            }
        }

注意-您需要确保只重播一次,并且按顺序重播查询。

相关问题