neo4j / apoc

Apache License 2.0
84 stars 27 forks source link

IndexEntryConflictException with apoc.merge.node #558

Open v2belleville opened 9 months ago

v2belleville commented 9 months ago

apoc.merge.node returns an IndexEntryConflictException (see full error output below)

(t:Tweet {id:"1652044756417912836"}) does exists in the database but it is not the first id in the file that is in the db. why this one triggers the errors is a mystery. tried several time, it is this id that triggers the error every time. If I suppress it another, id further down the file triggers the same error

I'm apparently not the only one who faced that error (https://stackoverflow.com/questions/67507411/facing-indexentryconflictexception-while-merging) . Since I'm not sure which directories are mentioned in the SO answer (I use a Windows Desktop version of Neo4j), I tried dropping and reconstructing constraint and indexes but problem remains the same...

UPDATE: I just realize that the use of apoc here was a leftover from a previous more complex version of the query. in this case, a simple merge works like a charm, but I guess the apoc issue is worth fixing anyway...

`File ~\Desktop\Python\myTwitterJsonImport2Neo4j.py:156, in importJsonTwLst(jsonTwLst, twExportDate, label, twOrigine, check, src) 149 #print(twLstNoNull) 151 query="""unwind $twLst as twJson 152 match (u:TwUser {id:twJson.userId}) 153 call apoc.merge.node(['Tweet'],twJson) yield node 154 with twJson,u,node where not exists((u)-[:TWEETED]->(node)) 155 create (u)-[:TWEETED {twExportDate:twJson.twExportDate, importDateTime:localdatetime({ timezone: 'Europe/Paris' })}]->(node)""" --> 156 res=Neo.session.run(query,twLst=twLstNoNull) 157 print(res.consume().counters) 159 # creation des tw RT

File C:\Program Files\Python311\Lib\site-packages\neo4j_sync\work\session.py:311, in Session.run(self, query, parameters, kwargs) 309 bookmarks = self._get_bookmarks() 310 parameters = dict(parameters or {}, kwargs) --> 311 self._auto_result._run( 312 query, parameters, self._config.database, 313 self._config.impersonated_user, self._config.default_access_mode, 314 bookmarks, self._config.notifications_min_severity, 315 self._config.notifications_disabled_categories, 316 ) 318 return self._auto_result

File C:\Program Files\Python311\Lib\site-packages\neo4j_sync\work\result.py:166, in Result._run(self, query, parameters, db, imp_user, access_mode, bookmarks, notifications_min_severity, notifications_disabled_categories) 164 self._pull() 165 self._connection.send_all() --> 166 self._attach()

File C:\Program Files\Python311\Lib\site-packages\neo4j_sync\work\result.py:274, in Result._attach(self) 272 if self._exhausted is False: 273 while self._attached is False: --> 274 self._connection.fetch_message()

File C:\Program Files\Python311\Lib\site-packages\neo4j_sync\io_common.py:180, in ConnectionErrorHandler.getattr..outer..inner(*args, kwargs) 178 def inner(*args, *kwargs): 179 try: --> 180 func(args, kwargs) 181 except (Neo4jError, ServiceUnavailable, SessionExpired) as exc: 182 assert not asyncio.iscoroutinefunction(self.__on_error)

File C:\Program Files\Python311\Lib\site-packages\neo4j_sync\io_bolt.py:808, in Bolt.fetch_message(self) 804 # Receive exactly one message 805 tag, fields = self.inbox.pop( 806 hydration_hooks=self.responses[0].hydration_hooks 807 ) --> 808 res = self._process_message(tag, fields) 809 self.idle_since = perf_counter() 810 return res

File C:\Program Files\Python311\Lib\site-packages\neo4j_sync\io_bolt5.py:352, in Bolt5x0._process_message(self, tag, fields) 350 self._server_state_manager.state = self.server_states.FAILED 351 try: --> 352 response.on_failure(summary_metadata or {}) 353 except (ServiceUnavailable, DatabaseUnavailable): 354 if self.pool:

File C:\Program Files\Python311\Lib\site-packages\neo4j_sync\io_common.py:247, in Response.on_failure(self, metadata) 245 handler = self.handlers.get("on_summary") 246 Util.callback(handler) --> 247 raise Neo4jError.hydrate(**metadata)

ClientError: {code: Neo.ClientError.Procedure.ProcedureCallFailed} {message: Failed to invoke procedure apoc.merge.node: Caused by: IndexEntryConflictException{propertyValues=( String("1652044756417912836") ), addedEntityId=-1, existingEntityId=2328}}`

gem-neo4j commented 8 months ago

Hey! Can you let me know which APOC and Neo4j version you are working with, and are you able to provide us a dataset or a simpler reproduction set? Thanks :)

v2belleville commented 8 months ago

Neo4j and APOC are 5.11.0 (Windows Desktop)

but since it's been 3 weeks, I'm afraid I won't have the time to dig into this to remember which data file triggered the error (as mentioned, I'm not using APOC for this anymore) . will update if I run into the issue again