有没有办法调用apoc.create.node,如果由于重复键而无法创建一个或多个节点,它将不会失败?

时间:2017-08-04 22:24:24

标签: neo4j neo4j-apoc

我正在针对.CSV文件运行apoc.create.node。即使一个或多个节点由于重复键而失败,我也需要创建可以创建的节点。

我跑了这个:

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

1 个答案:

答案 0 :(得分:2)

我注意到它没有显示在生成的文档中,但是如果你检查dbms.procedures(),你会发现这也是可能的:

CALL apoc.merge.node()

签名与create相同,因此您的语句将变为:

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(*)

这应该可以解决你的问题。

希望这有帮助。

此致 汤姆