2017-08-04 7 views
2

Je cours apoc.create.node contre un fichier .CSV. J'ai besoin que les noeuds qui peuvent être créés soient créés même si un ou plusieurs noeuds échouent à cause d'une clé dupliquée.Existe-t-il un moyen d'appeler apoc.create.node afin qu'il n'échoue pas si un ou plusieurs des noeuds ne peuvent pas être créés en raison d'une clé dupliquée?

je lance ceci:

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

et je reçois ce

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' 

Le fichier .csv ressemble à ceci

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

Je ne sais pas qui peut être fait dans apoc.load.csv, mais vous pouvez certainement le faire que si vous utilisez « simple » CSV CHARGE. –

+0

@TomGeudens True, mais si je fais cela, je ne peux pas le faire: https://stackoverflow.com/questions/45166907/how-to-use-a-csv-field-to-define-the-node- label-in-a-load-statement, c'est un catch-22. :) – nicomp

Répondre

2

Je remarque qu'il ne figure pas dans la documentation générée , mais si vous vérifiez dbms.procedures(), vous verrez que c'est également possible:

CALL apoc.merge.node() 

La signature semble la même que pour créer, de sorte que votre déclaration devient alors:

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

Cela devrait résoudre votre problème.

Espérons que cela aide.

Cordialement, Tom

+1

Nice! J'ai déjà écrit Java pour traiter un fichier .CSV multi-lignes en fichiers CSV mono-ligne, puis soumettre les fichiers individuels à apoc.load.csv(). La prochaine fois que j'utiliserai apoc.merge.node() - et il y aura une prochaine fois ... – nicomp