2014-12-17 4 views
0

Я пытаюсь создать некоторые узлы в Neo4j с помощью Java через CYPHER, в частности с JSON и http://hostname:7474/db/data/transaction/commit.Проблемы с сохранением Neo4j с большими свойствами

Мой тест должен создать некоторые узлы со следующими Cypher утверждениями:

MERGE (a:LABEL1 { name: 'nameNNN', version: 1001 }) 
SET a.PROP1='<data>' 
RETURN id(a) 

Пока мало, например, один или несколько свойств с < 1kB в сумме, все работает. Если попытка записать узлы с большим свойством (10 МБ двоичной base64 данные кодируются для примера), тест создает 9 или 10 узлов:

{errors=[], results=[{"data":[{"row":[10009]}],"columns":["id(a)"]}]} 
{errors=[], results=[{"data":[{"row":[10010]}],"columns":["id(a)"]}]} 
... 
{errors=[], results=[{"data":[{"row":[10011]}],"columns":["id(a)"]}]} 

, а затем начинает возвращать:

{errors=[], results=[]} 

Если Я перезапускаю тест, я сразу получаю пустой результат. Если я перезапущу сервер Neo4j, , я могу либо обновить эти 9 или 10 узлов, либо создать 9 или 10 узлов с разными именами и , тогда снова получаю только пустые результаты.

Как я понимаю, каждое утверждение представляет собой одну транзакцию (я выполняю одно слияние на запрос сервера).

Является ли это ошибкой или пределом сообщества (2.1.6) или я что-то не так?

+0

Обязательно используйте параметры для своих операторов, а не простые данные в запросе. –

+0

Также убедитесь, что у вас есть индекс/ограничение по крайней мере на: Label1 (name) –

+0

Если у вас есть буквальные данные, возможно, что-то сломает разбор строки? –

ответ

1

Это один из немногих антипаттернов для Neo4j для хранения больших кусков данных blob в собственности. Рекомендуемый подход состоит в том, чтобы переместить их в хранилище данных, подходящее для больших капель (например, Amazon S3 и другие) и сохранить ссылки URI на них в Neo4j.

Таким образом, узел, представляющий содержимое blob, имеет свойство uri, указывающее на внешний хранилище blob.

+0

Мы оцениваем несколько баз данных для будущего проекта, и есть тестовый фрейм, который содержит также некоторые тесты с большими атрибутами. Такие большие атрибуты довольно редко, но должны работать, если они происходят. Даже если это не лучшее решение, я предположил, что это сработает. Но это не работает. Я должен перезапустить сервер после 9 таких операций записи. Мой вопрос: это ошибка, или я что-то не так? Это зависит от размера отдельного атрибута или я могу запустить ту же проблему только позже, если я напишу еще несколько, но меньших узлов. –

+0

AFAIK jersey (который используется под капотами) имеет некоторое ограничение в размере запроса. Возможно, вы захотите использовать длинные свойства при запуске Neo4j во встроенном режиме (см. Руководство). –

+0

Я не думаю, что ограничения на трикотажа - проблема, потому что она работает некоторое время (каждое слияние - это один запрос).Я попытался с разными размерами, а количество узлов и времени работы увеличилось с меньшими размерами: Размер: 11184812 -> 12, 187s Размер: 5592408 -> 26, 225s Размер: 2796204 -> 56, 240s Размер: 1572864 - > 99, 243s Размер: 1561944 -> 101, 254s Размер: 1560576 -> 101, 253s Размер: 1560000 -> 102, 267s Размер: 1559736 -> 108, 321s Размер: 1559600 -> 117, 403s Размер: 1559536 -> 125, 474s Размер: 1559468 -> 150, 708s Кажется, какая-то магическая граница в этом диапазоне размеров около 1,5 миллионов –

0

Если я использую параметры вместо данных в запросе, проблема не возникает. Спасибо за этот намек!

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