【问题标题】:Neo4J Cypher - using triggers to record deleted nodes and relationships in a csv fileNeo4J Cypher - 使用触发器在 csv 文件中记录已删除的节点和关系
【发布时间】:2018-01-27 11:51:31
【问题描述】:

我正在尝试使用 Neo4J 上的触发器在 CSV 中记录节点或关系被删除时的详细信息。在尝试了不同的触发查询后,我发现尝试将已删除关系的详细信息直接写入 csv 是行不通的,但是创建一个虚拟节点来记录关系详细信息,然后将 v-node 写入 csv 可以。我使用的查询是这样的:

call apoc.trigger.add("deletingRels","UNWIND {deletedRelationships} as del WITH del call apoc.create.vNode(['Record'], {startUUID:startNode(del).uuid, endUUID:endNode(del).uuid, relType:type(del)}) YIELD node as r WITH r, collect(r) as rs,'D:/export/reldeltest.cql' as filename call apoc.when(size(rs) > 0,'call apoc.export.csv.data(rs,[],filename,{quotes:false,useTypes:false}) YIELD rows RETURN rows','',{rs:rs,filename:filename}) YIELD value RETURN value",{phase:"before"})

运行查询:

match (t:Test {name:"test 12"})-[r]->(s:Test {name:"test 7"}) delete r return t,s

删除关系 r 并令人满意地生成以下 csv:

"_id","_labels","startUUID","relType","endUUID","_start","_end","_type"
"-4",":Record","f8ccb190-fd43-11e7-866b-40b034e34b1f","testR","ad45c410-fd24-11e7-90a4-40b034e34b1f",,,

删除节点的类似触发器是:

call apoc.trigger.add("deletingNodes", "UNWIND {deletedNodes} as del WITH del call apoc.create.vNode(['Record'], {uuid:del.uuid, nodeLabels:labels(del)}) YIELD node as r WITH r, collect(r) as rs,'D:/export/nodedeltest.cql' as filename call apoc.when(size(rs) > 0,'call apoc.export.csv.data(rs,[],filename,{quotes:false,useTypes:false}) YIELD rows RETURN rows','',{rs:rs,filename:filename}) YIELD value RETURN value", {phase:"before"})

运行查询以删除节点会导致 Neo4J 浏览器中出现以下错误消息:

Neo.ClientError.Transaction.TransactionHookFailed

并且控制台中的错误日志开始:

WARN  Error executing trigger deletingNodes in phase before Node with id 1364 has been dele
ted in this transaction
org.neo4j.graphdb.QueryExecutionException: Node with id 1364 has been deleted in this transaction
        at org.neo4j.kernel.impl.query.QueryExecutionKernelException.asUserException(QueryExecutionKernelException.java:
35).

运行查询以匹配节点显示它仍然存在。

我在 Windows 上运行压缩版本的 Neo4J 3.3.1,并在控制台中安装了 apoc 3.3.1 插件。

有人可以帮忙吗?

【问题讨论】:

    标签: neo4j cypher neo4j-apoc


    【解决方案1】:

    我认为我们应该可以简化记录更新/删除数据的整个过程。

    话虽如此,我认为这是 b/c 您访问已删除节点的属性 del.uuid 不再可用/可访问,我认为您可能能够访问 id(del)labels(del) b/c 它们是在节点记录中。

    对于关系,您也只能访问type(del),但不能访问属性。

    删除的属性应该在单独的(早期)removed-properties-trigger 中可用。

    【讨论】:

    • 谢谢迈克尔,我会尝试在删除节点触发器之前使用删除属性触发器,并让您知道我的进展情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2022-11-21
    • 2018-01-27
    • 2022-10-19
    • 1970-01-01
    相关资源
    最近更新 更多