2016-07-27 591 views
0

我正在使用Neo4j作为数据库的项目。我有一个为应用程序构建的远程数据库,并托管在Cloud中。还有另一个数据库(本地数据库),位于客户位置。Neo4j - 如何同步本地数据库与远程neo4j数据库服务器

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

+0

我认为这是一个有效的问题,但我相信你应该删除粗体句子,因为它直接违背我们的一个偏离主题的原因:要求提供非现场资源或产品推荐。 –

+0

这就是我所知道的,这可能会对你有所帮助,它不会像你可能想要的那样帮助你:http://stackoverflow.com/questions/18830686/export-whole-database-in-cypher-format -ascii-text –

回答

0

这取决于你的跑步版本。 如果您使用企业版,您可以同步开箱即用,但是如果您使用社区,则必须自己完成。

我通过记录所有在本地数据库上修改数据然后在远程数据库上重播的查询来完成此操作。 下面的代码是在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); 
      } 
     } 

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

+0

有没有更简单的方法,或者有一些工具可以做到这一点?我有社区版本3 –

+0

我不知道任何工具可以为你做到这一点。所以它要么自己做,要么分出Neo4j Enterprise的天价成本。通过上面的代码和一些将重播查询存储为字符串的机制,以及一个标志来说明同步是否成功(我使用的是MongoDB),您应该在一天左右的时间内启动并运行。 – joe

相关问题