Ошибка отправки пакета Py2neo Neo4j

У меня есть файл json с данными около 1,4 миллиона узлов, и я хотел создать для него графовую базу данных Neo4j. Я попытался использовать функцию пакетной отправки py2neo. Мой код выглядит следующим образом:

# the variable words is a list containing node names
from py2neo import neo4j
batch = neo4j.WriteBatch(graph_db)
nodedict = {}
# I decided to use a dictionary because I would be creating relationships
# by referring to the dictionary entries later
for i in words:
    nodedict[i] = batch.create({"name":i})
results = batch.submit()

Показанная ошибка выглядит следующим образом:

Traceback (most recent call last):
  File "test.py", line 36, in <module>
    results = batch.submit()
  File "/usr/lib/python2.6/site-packages/py2neo/neo4j.py", line 2116, in submit
    for response in self._submit()
  File "/usr/lib/python2.6/site-packages/py2neo/neo4j.py", line 2085, in _submit
    for id_, request in enumerate(self.requests)
  File "/usr/lib/python2.6/site-packages/py2neo/rest.py", line 427, in _send
    return self._client().send(request)
  File "/usr/lib/python2.6/site-packages/py2neo/rest.py", line 364, in send
    return Response(request.graph_db, rs.status, request.uri, rs.getheader("Loc$
  File "/usr/lib/python2.6/site-packages/py2neo/rest.py", line 278, in __init__
    raise SystemError(body)
SystemError: None

Кто-нибудь может сказать мне, что именно здесь происходит? Это как-то связано с тем, что пакетный запрос довольно большой? Если да, то что можно сделать? Заранее спасибо! :)


person AnotherCodingEnthusiast    schedule 09.07.2014    source источник
comment
Что ж, думаю, я нашел ответ здесь: stackoverflow.com/questions/17902741/ Думаю, я попытаюсь разбить огромный пакетный запрос на более мелкие фрагменты по 5 тыс. Запросов, а затем запустить несколько процессов пакетной отправки. Надеюсь, что это работает :)   -  person AnotherCodingEnthusiast    schedule 09.07.2014


Ответы (3)


Итак, вот что я понял (благодаря этому вопросу: py2neo - Neo4j - Системная ошибка: создание узлов/связей пакетной обработки):

Функция пакетной отправки py2neo имеет собственные ограничения в отношении запросов, которые можно сделать. Хотя я не смог получить точную сумму верхнего предела, я попытался ограничить количество запросов в пакете до 5000. Поэтому я решил запустить следующий фрагмент кода:

# the variable words is a list containing node names
from py2neo import neo4j
batch = neo4j.WriteBatch(graph_db)
nodedict = {}
# I decided to use a dictionary because I would be creating relationships
# by referring to the dictionary entries later

for index, i in enumerate(words):
    nodedict[i] = batch.create({"name":i})
    if index%5000 == 0:
        batch.submit()
        batch = neo4j.WriteBatch(graph_db) # As stated by Nigel below, I'm creating a new batch
batch.submit() #for the final batch

Таким образом, я отправил пакетные запросы (размер запросов 5k) и смог успешно создать весь свой график!

person AnotherCodingEnthusiast    schedule 09.07.2014

Нет реального способа описать ограничение на количество заданий, которое может содержать пакет — оно может сильно различаться в зависимости от ряда факторов. В общем, лучше всего поэкспериментировать, чтобы найти оптимальный размер для вашего варианта использования и придерживаться его. Похоже, это то, что вы уже делаете :-)

Что касается вашего решения, я бы порекомендовал одну настройку. Пакетные объекты не предназначены для повторного использования, поэтому вместо очистки пакета после каждой отправки просто создайте новый. Возможность отправки пакета несколько раз будет удалена в следующей версии py2neo в любом случае.

person Nigel Small    schedule 10.07.2014
comment
Спасибо за ваше понимание! Хотя у меня было еще одно сомнение. На следующем этапе я хотел создать отношения, используя узлы, хранящиеся в словаре. Однако, поскольку я отправляю пакет, он показывает ошибку значения: запрос не найден. Не могли бы вы предложить что-нибудь? - person AnotherCodingEnthusiast; 10.07.2014
comment
О, кажется, я понял это. Благодаря этому вопросу: stackoverflow.com/questions/23812614/batching-in-py2neo - person AnotherCodingEnthusiast; 10.07.2014
comment
В основном из-за проблемы, поднятой в вопросе, на который вы ссылаетесь, пакеты станут одноразовыми в следующей версии py2neo. Пакет необходимо будет удалить после отправки и при необходимости создать новый. - person Nigel Small; 11.07.2014

У меня была такая же проблема после того, как я начал использовать пакетное создание через graph.create(*alist). Приведенные выше ответы указали мне правильное направление, и в итоге я использовал этот фрагмент, вдохновленный https://gist.github.com/anonymous/6293739 из этого вопроса py2neo - Neo4j – Системная ошибка – Создать пакетные узлы/отношения

chunk_size=500
chunks=(alist[pos:pos + chunk_size] for pos in xrange(0, len(alist), chunk_size))
for c in chunks:
    graph.create(*c)

PS py2neo==2.0.7

person citynorman    schedule 11.08.2015