0

Я работаю над проектом, в котором мы используем Neo4j в качестве базы данных. У меня есть удаленная база данных, созданная для приложения и размещенная в Cloud. Существует другая база данных (локальная база данных), которая размещается на месте клиента.Neo4j - Как синхронизировать локальную базу данных с удаленным сервером базы данных neo4j

Вопрос: есть ли способ синхронизации двух баз данных? Существуют ли какие-либо прямые продукты COTS, которые могут использоваться для этой синхронизации?

+0

Я думаю, что это правильный вопрос, но я считаю, что вы должны удалить свое смелое предложение, поскольку оно прямо противоречит одной из наших причин, не связанных с темой: запрашивает рекомендацию по ресурсам или продуктам за пределами площадки. –

+0

Это все, что я знаю, что может вам помочь, и это не поможет столько, сколько вам бы хотелось: http://stackoverflow.com/questions/18830686/export-whole-database-in-cypher-format -ascii-text –

ответ

0

Это зависит от того, какая версия работает. Если вы используете Enterprise Edition, вы можете синхронизировать его из коробки, однако, если вы используете Community, вы должны сделать это самостоятельно.

Я делаю это, записывая все запросы, которые изменяют данные в локальной базе данных и затем воспроизводятся в удаленной базе данных. Приведенный ниже код является примером делать это в 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

 Смежные вопросы

  • Нет связанных вопросов^_^