Something is still off with the passing of the parameters. I'm getting ValueErrors no matter what I try.
First tried this:
statement = """
UNWIND $parameters as row
MERGE (iui:ItemUsageInstance {instance_id: trim(row.USAGE_INSTANCE)})
ON CREATE SET
iui.usage_type = trim(row.USAGE_TYPE)
MERGE (nhiui:ItemUsageInstance {instance_id: trim(row.NEXT_HIGHER_USAGE_INST)})
ON CREATE SET
nhiui.usage_type = trim(row.NEXT_HIGHER_USAGE_TYPE)
"""
tx = graph.begin(autocommit=True)
params = []
# dataframe is indexed with numerical indexes
for index, row in df.iterrows():
params += {
'USAGE_INSTANCE': row['USAGE_INSTANCE'],
'USAGE_TYPE': row['USAGE_TYPE'],
'NEXT_HIGHER_USAGE_INST': row['NEXT_HIGHER_USAGE_INST'],
'NEXT_HIGHER_USAGE_TYPE': row['NEXT_HIGHER_USAGE_TYPE'],
}
if index % 20000 == 0:
tx.evaluate(statement, parameters = params)
params = []
tx.evaluate(statement, parameters = params)
Results in:
ValueError Traceback (most recent call last)
<ipython-input-37-28c0264c4f87> in <module>()
48 #params.append(params_dict)
49 if index % 20000 == 0:
---> 50 tx.evaluate(statement, parameters = params)
51 params = []
52 tx.evaluate(statement, parameters = params)
/app/local/anaconda3/envs/py35/lib/python3.5/site-packages/py2neo/database.py in evaluate(self, cypher, parameters, **kwparameters)
889 :returns: single return value or :const:`None`
890 """
--> 891 return self.run(cypher, parameters, **kwparameters).evaluate(0)
892
893 def create(self, subgraph):
/app/local/anaconda3/envs/py35/lib/python3.5/site-packages/py2neo/database.py in run(self, cypher, parameters, **kwparameters)
840 result = self.transaction.run(cypher, parameters, **kwparameters)
841 else:
--> 842 result = self.session.run(cypher, parameters, **kwparameters)
843 except CypherError as error:
844 raise GraphError.hydrate({"code": error.code, "message": error.message})
/app/local/anaconda3/envs/py35/lib/python3.5/site-packages/neo4j/v1/api.py in run(self, statement, parameters, **kwparameters)
325 self._connect()
326
--> 327 result = self.__run__(statement, dict(parameters or {}, **kwparameters))
328
329 if not self.has_transaction():
ValueError: dictionary update sequence element #0 has length 22; 2 is required
If I look at the params
object:
['NEXT_HIGHER_USAGE_INST',
'NEXT_HIGHER_USAGE_TYPE',
'USAGE_INSTANCE',
'USAGE_TYPE']
Then I tried to ensure we are building a list of dicts:
statement = """
UNWIND $parameters as row
MERGE (iui:ItemUsageInstance {instance_id: trim(row.USAGE_INSTANCE)})
ON CREATE SET
iui.usage_type = trim(row.USAGE_TYPE)
MERGE (nhiui:ItemUsageInstance {instance_id: trim(row.NEXT_HIGHER_USAGE_INST)})
ON CREATE SET
nhiui.usage_type = trim(row.NEXT_HIGHER_USAGE_TYPE)
"""
tx = graph.begin(autocommit=True)
params = []
# dataframe is indexed with numerical indexes
for index, row in df.iterrows():
params_dict = {
'USAGE_INSTANCE': row['USAGE_INSTANCE'],
'USAGE_TYPE': row['USAGE_TYPE'],
'NEXT_HIGHER_USAGE_INST': row['NEXT_HIGHER_USAGE_INST'],
'NEXT_HIGHER_USAGE_TYPE': row['NEXT_HIGHER_USAGE_TYPE'],
}
params.append(params_dict)
if index % 20000 == 0:
tx.evaluate(statement, parameters = params)
params = []
tx.evaluate(statement, parameters = params)
Error:
ValueError Traceback (most recent call last)
<ipython-input-25-86de9174551c> in <module>()
48 params.append(params_dict)
49 if index % 20000 == 0:
---> 50 tx.evaluate(statement, parameters = params)
51 params = []
52 tx.evaluate(statement, parameters = params)
/app/local/anaconda3/envs/py35/lib/python3.5/site-packages/py2neo/database.py in evaluate(self, cypher, parameters, **kwparameters)
889 :returns: single return value or :const:`None`
890 """
--> 891 return self.run(cypher, parameters, **kwparameters).evaluate(0)
892
893 def create(self, subgraph):
/app/local/anaconda3/envs/py35/lib/python3.5/site-packages/py2neo/database.py in run(self, cypher, parameters, **kwparameters)
840 result = self.transaction.run(cypher, parameters, **kwparameters)
841 else:
--> 842 result = self.session.run(cypher, parameters, **kwparameters)
843 except CypherError as error:
844 raise GraphError.hydrate({"code": error.code, "message": error.message})
/app/local/anaconda3/envs/py35/lib/python3.5/site-packages/neo4j/v1/api.py in run(self, statement, parameters, **kwparameters)
325 self._connect()
326
--> 327 result = self.__run__(statement, dict(parameters or {}, **kwparameters))
328
329 if not self.has_transaction():
ValueError: dictionary update sequence element #0 has length 4; 2 is required
If I then look at the params
object:
# (dict values replaced with toy data values...)
[{'NEXT_HIGHER_USAGE_INST': 'inst9002',
'NEXT_HIGHER_USAGE_TYPE': 'prototype',
'USAGE_INSTANCE': 'inst7312',
'USAGE_TYPE': 'production'}]
From what I have found so far, this exception is raised "because you trying to update dict
object by using a wrong sequence ( list
or tuple
) structure." However, I'm not seeing where a dict is being updated here. It is just set, then appended to a list.