Спасибо, ребята, за то, что упомянул GraphAware, просто чтобы добавить другой подход в микс: проблема с получением всех узлов с ванилью GlobalGraphOperations
заключается в том, что все это происходит в одной транзакции. На графике с узлами 100M это не сработает.
По этой причине GraphAware Framework имеет ряд BatchTransactionExecutor
с, что мы используем в наших модулей для повторной индексации/восстановления и такие сценарии, когда вам нужно сделать что-то для каждого узла/отношения или подмножество из них.
Позвольте мне опубликовать пример того, как вы будете использовать это - это из модуля схемы Enforcement GraphAware (а не с открытым исходным кодом, поэтому размещение здесь):
final List<String> violations = new LinkedList<>();
new IterableInputBatchTransactionExecutor<>(database, 1000,
new AllNodes(database, 1000),
new UnitOfWork<Node>() {
@Override
public void execute(GraphDatabaseService database, Node input, int batchNumber, int stepNumber) {
for (Constraint<Node> constraint : nodeConstraints) {
if (!constraint.satisfiedBy(input)) {
violations.add(input + " violates " + constraint.toString());
}
}
}
}).execute();
Большинство входных параметров должны быть понятны. Обратите внимание, что AllNodes
- это другой класс рамок, который извлекает все узлы из database
партиями 1000 (в данном случае) за транзакцию. Мы предоставляем другие (AllNodesWithLabel
, AllRelationships
), но вы можете легко реализовать свои собственные.
Выполнение этого в фоновом режиме - это вопрос создания отдельного потока, или если вы хотите получить более сложный подход, используйте модули с таймером фреймворка, как уже указывал Уильям.
Отметим также, что GraphAware уже имеет модуль для репликации ES: https://github.com/graphaware/neo4j-to-elasticsearch –
Вы можете просто выполнить обработку узлов, которые вы возвращаете из getAllNodes(), с несколькими потоками в бассейне, тогда это действительно эффективно. –