Neo4j Как синхронизировать локальную базу данных с удаленным сервером базы данных neo4j

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

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


person Anish Bapna    schedule 27.07.2016    source источник
comment
Я думаю, что это правильный вопрос, но я считаю, что вам следует удалить предложение, выделенное жирным шрифтом, поскольку оно прямо противоречит одной из наших причин, не относящихся к теме: запрашивает сторонний ресурс или рекомендацию по продукту.   -  person Two-Bit Alchemist    schedule 27.07.2016
comment
Это все, что я знаю, что может вам помочь, и это не поможет так сильно, как вам, вероятно, хотелось бы: stackoverflow.com/questions/18830686/   -  person Two-Bit Alchemist    schedule 27.07.2016


Ответы (1)


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

Я делаю это, записывая все запросы, которые изменяют данные в локальной базе данных, а затем воспроизводят их в удаленной базе данных. Приведенный ниже код является примером выполнения этого в С#.

 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);
            }
        }

ПРИМЕЧАНИЕ. Вам необходимо убедиться, что вы воспроизводите только один раз и повторяете запросы по порядку.

person joe    schedule 28.07.2016
comment
Есть ли более простой способ или какой-то инструмент для этого? У меня версия Community Edition 3 - person Anish Bapna; 28.07.2016
comment
Я не знаю ни одного инструмента, который может сделать это для вас. Так что либо сделайте это сами, либо раскошельтесь на астрономическую стоимость Neo4j Enterprise. С приведенным выше кодом и некоторым механизмом хранения запросов воспроизведения в виде строк и флагом, указывающим, была ли синхронизация успешной (я использую MongoDB), вы должны начать работу в течение дня или около того. - person joe; 29.07.2016