0

我目前每天将一个 json 文件目录加载到我的 neo4j 数据库中。

如果数据库中已经存在文件 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 我也尝试了收集/合并组合来返回一些工作,但这也不起作用。

感谢您的任何帮助!

4

1 回答 1

1

load.json我已经测试了代码,当程序失败时,似乎没有办法得到一张空地图。也许打开另一个功能请求并解释您的问题。同时,我建议执行以下操作作为解决方法。

首先,为所有 File 节点添加一个二级标签。

MATCH (f:File)
SET f:Delete

然后运行您的代码并根据需要更新文件,最后从具有源文件的 File 节点中删除辅助标签:

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
于 2022-01-03T22:05:43.840 回答