TypeError: не сериализуемый JSON Пакетная отправка Py2neo

Я создаю огромную базу данных графов с более чем 1,4 миллионами узлов и 160 миллионами связей. Мой код выглядит следующим образом:

from py2neo import neo4j
# first we create all the nodes
batch = neo4j.WriteBatch(graph_db)
nodedata = []

for index, i in enumerate(words): # words is predefined
    batch.create({"term":i})
    if index%5000 == 0: #so as not to exceed the batch restrictions
        results = batch.submit()
        for x in results:
            nodedata.append(x)
        batch = neo4j.WriteBatch(graph_db)

results = batch.submit()
for x in results:
    nodedata.append(x)

#nodedata contains all the node instances now
#time to create relationships

batch = neo4j.WriteBatch(graph_db)
for iindex, i in enumerate(weightdata): #weightdata is predefined 
    batch.create((nodedata[iindex], "rel", nodedata[-iindex], {"weight": i})) #there is a different way how I decide the indexes of nodedata, but just as an example I put iindex and -iindex
    if iindex%5000 == 0: #again batch constraints
        batch.submit() #this is the line that shows error
        batch = neo4j.WriteBatch(graph_db)
batch.submit()

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "test.py", line 53, in <module>
    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 351, in send
    rs = self._send_request(request.method, request.uri, request.body, request.$
  File "/usr/lib/python2.6/site-packages/py2neo/rest.py", line 326, in _send_re$
    data = json.dumps(data, separators=(",", ":"))
  File "/usr/lib64/python2.6/json/__init__.py", line 237, in dumps
    **kw).encode(obj)
  File "/usr/lib64/python2.6/json/encoder.py", line 367, in encode
    chunks = list(self.iterencode(o))
  File "/usr/lib64/python2.6/json/encoder.py", line 306, in _iterencode
    for chunk in self._iterencode_list(o, markers):
  File "/usr/lib64/python2.6/json/encoder.py", line 204, in _iterencode_list
    for chunk in self._iterencode(value, markers):
  File "/usr/lib64/python2.6/json/encoder.py", line 309, in _iterencode
    for chunk in self._iterencode_dict(o, markers):
  File "/usr/lib64/python2.6/json/encoder.py", line 275, in _iterencode_dict
    for chunk in self._iterencode(value, markers):
  File "/usr/lib64/python2.6/json/encoder.py", line 317, in _iterencode
    for chunk in self._iterencode_default(o, markers):
  File "/usr/lib64/python2.6/json/encoder.py", line 323, in _iterencode_default
    newobj = self.default(o)
  File "/usr/lib64/python2.6/json/encoder.py", line 344, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 3448 is not JSON serializable

Может ли кто-нибудь предложить мне, что именно здесь происходит и как я могу это преодолеть? Любая помощь будет оценена по достоинству. Заранее спасибо! :)


person AnotherCodingEnthusiast    schedule 10.07.2014    source источник


Ответы (2)


Трудно сказать, не имея возможности запустить свой код с тем же набором данных, но это, вероятно, вызвано типом элементов в weightdata.

Пройдитесь по коду или распечатайте тип данных, чтобы определить тип i в части {"weight": i} дескриптора отношения. Вы можете обнаружить, что это не int, который потребуется для сериализации номеров JSON. Если эта теория верна, вам нужно будет найти способ приведения или иного преобразования этого значения свойства в int, прежде чем использовать его в наборе свойств.

person Nigel Small    schedule 11.07.2014

Я никогда не использовал p2neo, но если я посмотрю документацию

Этот:

batch.create((nodedata[iindex], "rel", nodedata[-iindex], {"weight": i}))

Отсутствует часть rel():

batch.create(rel(nodedata[iindex], "rel", nodedata[-iindex], {"weight": i}))
person Ron van Weverwijk    schedule 10.07.2014
comment
Верно, но отношение можно также назвать следующим образом: (node1,rel,node2,{property:value}), как показано здесь: book.py2neo.org/en/latest/graphs_nodes_relationships Обратите внимание, что я также создал узлы другим способом, но он их создает. Так что я думаю, что есть какая-то другая проблема. - person AnotherCodingEnthusiast; 10.07.2014