2017-08-04 60 views
2

我对一个.CSV文件运行apoc.create.node。即使一个或多个节点由于重复键而失败,我也需要创建可创建的节点。有没有办法调用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

不知道可以在apoc.load.csv做,但你绝对可以做,如果你使用“普通” LOAD CSV。 –

+0

@TomGeudens是的,但如果我这样做,那么我不能这样做:https://stackoverflow.com/questions/45166907/how-to-use-a-csv-field-to-define-the-node-它是一个catch-22。 :) – nicomp

回答

2

我注意到它是不是在生成的文档中显示,但是如果你检查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(*) 

这应该解决您的问题。

希望这会有所帮助。

问候, 汤姆

+1

不错!我已经编写了Java将多行.CSV文件处理为单行CSV,然后将单个文件提交给apoc.load.csv()。下次我将使用apoc.merge.node() - 并且会有下一次... – nicomp

相关问题