Есть ли способ вызвать apoc.create.node таким образом, чтобы он не давал сбоев, если один или несколько узлов не могут быть созданы из-за дублирующегося ключа?

Я запускаю apoc.create.node для файла .CSV. Мне нужно, чтобы узлы, которые можно создать, создавались, даже если один или несколько узлов выходят из строя из-за дублирующегося ключа.

Я запускаю это:

CALL apoc.load.csv('FILE:///C:/Temp/Test/Test/Neo4jTest/import/Neo4j_AttributeProvenance.csv',{sep:","}) YIELD map  CALL apoc.create.node([map.NodeType], {Key:map.Key, AttributeName:map.AttributeName, TableName:map.TableName, SchemaName:map.SchemaName, DataType:map.DataType, PreviousKey:map.PreviousKey}) yield node return count(*)

и я понимаю это

Neo4jUtils.ExecActionQuery().execute(): Failed to invoke procedure `apoc.create.node`: Caused by: org.neo4j.graphdb.ConstraintViolationException: Node(357) already exists with label `SubNode` and property `Key` = 'queryprocessingtest.ttablea.testDateTime'

Файл .CSV выглядит так

NodeType,Key,SchemaName,TableName,AttributeName,DataType,PreviousKey
RootNode,queryprocessingtest.q01.testDateTimeX,queryprocessingtest,q01,testDateTime,datetime,
SubNode,queryprocessingtest.ttablea.testDateTime,queryprocessingtest,ttablea,testDateTime,datetime,queryprocessingtest.q01.testDateTime

person nicomp    schedule 04.08.2017    source источник
comment
Не уверен, что это можно сделать в apoc.load.csv, но вы определенно можете это сделать, если используете простой LOAD CSV.   -  person Tom Geudens    schedule 06.08.2017
comment
@TomGeudens Верно, но если я это сделаю, то не смогу этого сделать: stackoverflow.com/questions/45166907/ , это ловушка -22. :)   -  person nicomp    schedule 06.08.2017


Ответы (1)


Я заметил, что это не показано в сгенерированной документации, но если вы проверите dbms.procedures(), вы увидите, что это также возможно:

CALL apoc.merge.node()

Подпись выглядит так же, как и для создания, поэтому ваше утверждение становится таким:

CALL apoc.load.csv('FILE:///C:/Temp/Test/Test/Neo4jTest/import/Neo4j_AttributeProvenance.csv',{sep:","}) YIELD map  CALL apoc.merge.node([map.NodeType], {Key:map.Key, AttributeName:map.AttributeName, TableName:map.TableName, SchemaName:map.SchemaName, DataType:map.DataType, PreviousKey:map.PreviousKey}) yield node return count(*)

Это должно решить вашу проблему.

Надеюсь это поможет.

С уважением, Том

person Tom Geudens    schedule 07.08.2017
comment
Хороший! Я уже писал Java для обработки многострочного файла .CSV в однострочные CSV, а затем отправлял отдельные файлы в apoc.load.csv(). В следующий раз я буду использовать apoc.merge.node() -- и будет следующий раз... - person nicomp; 07.08.2017