我目前每天都会在neo4j数据库中加载一个json文件目录。
如果一个文件ID已经存在于数据库中,我什么也不做,如果有新的文件ID,我会创建新的节点,如果文件名ID不再存在于目录中,那么我想删除具有匹配ID的节点。
对于apoc.load.json
,我使用failOnError:false
,这样,如果任何文件不再存在,因此无法加载,脚本就不会失败。
我尝试了各种例子来传递丢失文件的ID,即它返回了null,但到目前为止,我得到的最好的例子是下面的,它仍然没有删除所需的节点,因为当错误发生时,它会移动到下一个要加载的文件。这是一个片段,在这一点之后还有更多的创建代码:
UNWIND range(1,100) as id
WITH DISTINCT id + ".json" as file,id
CALL apoc.load.json("file:///output/"+file, null, {failOnError:false})
YIELD value
WITH value,id
CALL apoc.do.when(value is not null, "RETURN value",
"MATCH (n:File {FileId: id}) DETACH DELETE n", {value:value, id:id}) YIELD value as v
RETURN v
是否有一种方法可以捕获failOnError并在此时处理Cypher,以便能够删除所需的节点?
此处类似查询:https://github.com/neo4j-contrib/neo4j-apoc-procedures/issues/1149我也尝试过收集/合并组合来返回一些要处理的内容,但这也不起作用。
感谢您的帮助!
我已经测试了代码,当load.json
过程失败时,似乎无法获得空映射。也许打开另一个功能请求并解释您的问题。在此期间,我建议采取以下措施作为变通办法。
首先,将辅助标签添加到所有"文件"节点。
MATCH (f:File)
SET f:Delete
然后运行您的代码并根据需要更新文件,最后从具有源文件的文件节点中删除辅助标签:
UNWIND range(1,100) as id
WITH DISTINCT id + ".json" as file,id
CALL apoc.load.json("file:///output/"+file, null, {failOnError:false})
YIELD value
WITH value,id
MATCH (n:File {FileId: id})
REMOVE n:Delete
do some updates etc...
完成后,删除过程中不匹配的所有节点
MATCH (d:Delete)
DETACH DELETE d