Я пытаюсь сравнить Neo4j массивную вставку в среде клиент-сервер. До сих пор я обнаружил, что есть только два способа сделать это:Neo4j multi-client массивная вставка - REST очень плохая производительность - другими способами?
- использование REST
- реализации Расширение сервера
Я могу сказать заранее, что наша конструкция требует, чтобы иметь возможность вставить от многих одновременно работающих процессов/машин, поэтому использование пакетной вставки с прямым подключением не является вариантом.
Я также хотел бы избежать необходимости развертывания расширения сервера, поскольку у нас уже есть жесткий график.
Я протестированные массивную вставку через 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 Е) за 13 минут, по сравнению с конкурирующими продуктами, такими как Титан или Восток, которые обеспечивают эффективный сервер из коробки и пропускной способность на уровне около (10k V + 40k E) за 1 минуту.
Я пробовал более длительные транзакции и параметры запроса, ни один из них не приносил значительных выигрышей. Кроме того, накладные расходы от REST очень малы, поскольку я тестировал фиктивные запросы, и они выполняются намного быстрее (и оба клиента и сервер находятся на одной машине). Я также попытался вставить из нескольких потоков - производительность не масштабируется.
Я нашел еще один вопрос StackOverflow, в котором рекомендуется вставлять вставки в большие запросы, содержащие тысячи команд и периодически совершать. К сожалению, из-за характера того, как мы генерируем данные, пакетная обработка запросов невозможна. В идеале мы хотели бы, чтобы вставки были атомарными операциями, и результаты отображаются сразу же после их выполнения (фактически нет необходимости в транзакциях).
Таким образом, мои вопросы:
- мои Cypher запросы оптимальны для вставки?
- - это результаты до сих пор в соответствии с тем, что может быть достигнуто с помощью REST (или я могу сжать намного больше от REST)?
- Есть ли какие-либо другие способы выполнения эффективной многоклиентской массовой вставки?
Является ли '{guid}' таким же, как '{a}' или '{b}'? Кроме того, вы уже создали индекс (или ограничение уникальности) на ': V (guid)'? – cybersam
Да, есть указатель на поле guid. Все 3 вара могут иметь разные значения, и эти 2 запроса будут выполняться отдельно. Однако, когда я создаю ребро, я могу гарантировать, что обе вершины уже созданы. – rohrl
Вы используете keepalive http connections? –