【问题标题】:Neo4J Cypher - Delete existing Node if Json source file no longer foundNeo4J Cypher - 如果不再找到 Json 源文件,则删除现有节点
【发布时间】:2022-01-02 23:37:08
【问题描述】:

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

如果数据库中已经存在文件 ID,我什么也不做,如果有新文件 ID,我创建新节点,如果目录中不再存在文件名 ID,那么我想删除具有匹配 ID 的节点。

对于apoc.load.json,我正在使用failOnError:false,以便在任何文件不再存在并因此无法加载时脚本不会失败。

我尝试了各种示例来传递丢失文件的 ID,即它返回了 null,但到目前为止,我想出的最好的方法是下面的,它仍然没有删除所需的节点,因为出现错误发生它移动到下一个要加载的文件。 这是一个 sn-p,在此之后还有进一步的创建代码:

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 我也尝试过收集/合并组合来返回一些工作,但这也不起作用。

感谢您的帮助!

【问题讨论】:

    标签: neo4j null cypher neo4j-apoc failonerror


    【解决方案1】:

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

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

    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
    

    【讨论】:

    • 您好 Toma%c5,感谢您花时间回答我的问题。在进一步谷歌搜索之后,我也从我已经实施的某个地方得到了相同的解决方案,并且运行良好。看看是否可以为其提出功能请求并不是一个坏主意,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多