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

时间:2016-07-27 15:15:08

标签: neo4j data-synchronization transactional-replication

我正在开发一个使用Neo4j作为数据库的项目。我有一个为应用程序构建的远程数据库,并在Cloud中托管。还有另一个数据库(本地数据库)托管在客户的位置。

问题是:有没有办法同步两个数据库?是否有可用于此同步的直接COTS产品?

1 个答案:

答案 0 :(得分:0)

这取决于你的运行版本。 如果您使用Enterprise Edition,则可以立即进行同步,但是如果您使用社区,则必须自己进行同步。

我这样做是通过记录修改本地数据库上的数据然后在远程数据库上重放的所有查询。 下面的代码是在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);
            }
        }

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

相关问题