2017-08-04 40 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

相關問題