2016-02-04 5 views
1

Я пытаюсь сравнить Neo4j массивную вставку в среде клиент-сервер. До сих пор я обнаружил, что есть только два способа сделать это:Neo4j multi-client массивная вставка - REST очень плохая производительность - другими способами?

  1. использование REST
  2. реализации Расширение сервера

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

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

Я протестированные массивную вставку через 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, в котором рекомендуется вставлять вставки в большие запросы, содержащие тысячи команд и периодически совершать. К сожалению, из-за характера того, как мы генерируем данные, пакетная обработка запросов невозможна. В идеале мы хотели бы, чтобы вставки были атомарными операциями, и результаты отображаются сразу же после их выполнения (фактически нет необходимости в транзакциях).

Таким образом, мои вопросы:

  1. мои Cypher запросы оптимальны для вставки?
  2. - это результаты до сих пор в соответствии с тем, что может быть достигнуто с помощью REST (или я могу сжать намного больше от REST)?
  3. Есть ли какие-либо другие способы выполнения эффективной многоклиентской массовой вставки?
+0

Является ли '{guid}' таким же, как '{a}' или '{b}'? Кроме того, вы уже создали индекс (или ограничение уникальности) на ': V (guid)'? – cybersam

+0

Да, есть указатель на поле guid. Все 3 вара могут иметь разные значения, и эти 2 запроса будут выполняться отдельно. Однако, когда я создаю ребро, я могу гарантировать, что обе вершины уже созданы. – rohrl

+0

Вы используете keepalive http connections? –

ответ

0

У меня есть несколько мыслей/вопросов, которые не подходят очень хорошо в комментарии;)

  • Какую версию Neo4j вы используете? 2.3 ввел некоторые вещи, которые могут помочь

  • Когда вы говорите, что у вас есть индекс, вы имеете в виду новый стиль, а не устаревшие индексы? Новые индексы создаются с помощью CREATE INDEX ON :V(guid) и применяются к комбинации ярлыка и свойства.Вы можете попробовать свои запросы в веб-консоли с приставкой PROFILE, чтобы увидеть, если запрос бьет индекс и где он может быть медленным

  • Если вы можете иметь данные в формате CSV вы можете посмотреть в статье LOAD CSV в Cypher. Это также партия рода вещи, так что это не может быть столь же полезным

  • Я не думаю, что это помогло бы производительность много, но это немного лучше читать:

    матч (а: У { guid: {a}}), (b: V {guid: {b}}) create (a) - [: label] -> (b)

  • Я знаю, что сейчас это не поможет, но Neo4j 3.0 планируется создать новый сжатый бинарный сотовый протокол Bolt, который должен быть улучшен по сравнению с REST. По оценкам, для Q2

Я знаю, что многие из этих предложений, вероятно, не слишком полезны, но о них нужно подумать. Там также общественный натяжной чат для Neo4j здесь:

http://neo4j.com/blog/public-neo4j-users-slack-group/

Я поделюсь этим вопросом там, чтобы увидеть, если кто имеет какие-либо идеи

EDIT:

Макс DeMarzi прошел на одном этих статей по запросам на очередность, которые могут быть полезны:

http://maxdemarzi.com/2014/07/01/scaling-concurrent-writes-in-neo4j/

Похоже, вам нужно написать немного Java, но он излагает это для вас

+0

Neo4j 2.3.2. Да, новый индекс стиля. CSV неприменим. Спасибо за ссылки. – rohrl