Я пытаюсь сравнить массивную вставку Neo4j в среде клиент-сервер. Пока я обнаружил, что есть только два способа сделать это:
- использовать ОТДЫХ
- внедрить серверное расширение
Я могу заранее сказать, что наш дизайн требует возможности вставки из многих одновременно запущенных процессов/машин, поэтому использование пакетной вставки с прямым подключением не вариант.
Я также хотел бы избежать необходимости расширения сервера, поскольку у нас и так плотный график.
Я протестировал массовую вставку через REST всего с одного клиента, отправив 2 типа очень простых запросов Cypher:
create (vertex:V {guid: {guid}, vtype: {vtype}, random1: {random1}, random2: {random2} })
match (a:V {guid: {a} }) match (b:V {guid: {b} }) create (a)-[:label]->(b)
Поле Guid имело индекс.
На данный момент результаты очень плохие: (10k V + 40k E) за 13 минут по сравнению с конкурирующими продуктами, такими как Titan или Orient, которые предоставляют эффективный сервер из коробки и пропускная способность около (10 кВ + 40 кВ) в минуту.
Я пробовал более длительные транзакции и параметры запроса, но ни один из них не дал существенного выигрыша. Кроме того, накладные расходы от REST очень малы, поскольку я тестировал фиктивные запросы, и они выполняются намного быстрее (и клиент, и сервер находятся на одной машине). Я также пробовал вставлять из нескольких потоков - производительность не увеличивается.
Я нашел еще один вопрос StackOverflow, где советовали вставлять пакеты в большие запросы, содержащие тысячи команд, и периодически фиксировать. К сожалению, из-за характера того, как мы генерируем данные, пакетная обработка запросов невозможна. В идеале мы хотели бы, чтобы вставки были атомарными операциями и чтобы результаты появлялись сразу после их выполнения (на самом деле нет необходимости в транзакциях).
Таким образом, мои вопросы:
- оптимальны ли мои запросы Cypher для вставки?
- соответствуют ли результаты тому, что может быть достигнуто с помощью REST (или я могу выжать из REST гораздо больше)?
- Существуют ли другие способы эффективной многоклиентской массовой вставки?
{guid}
совпадает с{a}
или{b}
? Кроме того, вы уже создали индекс (или ограничение уникальности) для:V(guid)
? - person cybersam   schedule 04.02.2016