2013-09-11 3 views
2

В настоящее время у нас есть 2 базы данных Neo4j в нашем приложении. Мы используем Spring Data Neo4j (SDN).Каков наилучший способ синхронизации данных между 2 базами данных Neo4j?

Первая база данных - это наша база данных STAGING, а другая база данных LIVE. Это больше для целей Versioning и для предотвращения использования пользователем базы данных LIVE.

У нас около 50 000 узлов и 150.000 отношений. Наша область STAGING предназначена для небольших подмножеств пользователей, и мы разрешаем делать операции CRUD только в STAGING. После того, как пользователь завершит/подтвердит данные в STAGING, мы переместим базу данных в базу данных LIVE. LIVE предназначен только для базы данных READ ONLY, CRUD разрешается только во время процесса синхронизации.

Мне интересно, как лучше всего синхронизировать данные между обеими базами данных и синхронизацией, это должно позволить инкрементные обновления.

Я попытался выполнить синхронизацию узла по узлу с помощью Cypher Query + SDN, но я попал в блокпост, он занимает слишком много времени.

@Query("START n=node:ItemCode('code:*') " 
    + "WHERE has(n.status) AND n.status = 'ACTIVE') " 
    + "RETURN n"); 
public Iterable<Item> getAllActiveItems(); 

На SyncService класса, который делает процесс синхронизации от STAGING ЖИТЬ дб:

Iterable<Item> items = stagingRepo.getAllActiveItems(); 
for(Item item:items) { 

    Item item = liveRepo.findItem(item.getCode()); 
    if(item == null) { 
     //create item 
    } else { 
     //update item 
    } 
} 

[UPDATE] На основании ответа по Peter Neubauer, я хотел бы продолжить изучение, если есть связь с базой данных так что запрос Cypher может запускаться в двух базах данных за один раз.

Любые идеи приветствуются.

Спасибо, Gunawan

+0

Добро пожаловать в stackoverflow.com. К сожалению, этот сайт предназначен только для программирования вопросов. Ваш вопрос, однако, касается администрирования базы данных. Вам лучше разместить его на dba.stackexchange.com. Это сказано: пытались ли вы просто скопировать базу данных на уровень файловой системы? – Philipp

+0

Кстати, это связано с вопросом программирования. Я не мог копировать файлы db для синхронизации между базами данных, так как в любом случае требуется выполнить частичную синхронизацию (только на определенных узлах, например, узлы с статусом ACTIVE), спасибо за ваш ввод. –

+0

Вы когда-нибудь находили решение для этого? Я столкнулся с той же проблемой – sak

ответ

0

Есть ли способ, что вы можете сделать находку и обновления в одном запросе Cypher и выполнить его в функции neo4jTemplate.query("....", params)?

Если вы используете приведенный выше код, все соответствующие материалы должны быть представлены в базе данных в Item, а затем снова сохранены в ваших функциях репо, создавая эти накладные расходы.

Может быть простой

START n=node:ItemCode('code:*') 
WHERE has(n.status) AND n.status = 'ACTIVE') 
WITH n 
SET n.updated=1 

и один для новых деталей будет делать эту работу? Таким образом, работа выполняется в БД и не касается слоев отображения SDN.

+0

Спасибо, Питер. Я попытаюсь запустить запрос вместо преобразования обратно в объект Java. Как бы то ни было, есть ли способ создать запрос для одновременного создания и обновления на основе существования узла? –

+0

Обнаружено это [MERGE] (http://docs.neo4j.org/chunked/snapshot/query-merge.html#merge-merge-using-unique-constraints-creates-a-new-node-if-no-node -исследованная команда) –

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