在Neo4j中,我想获取从特定节点出现的路径,然后我想迭代路径中的每个节点并根据存储的操作删除它

问题描述 投票:0回答:1

我正在做一个将MySQL表转换为Neo4j图的项目。转换后,我在图中使用java复制SQL数据库的删除操作。所以当我删除SQL数据库中的一条记录时,我想删除相关的节点例如,我正在从带有complaint_id = 7的投诉表中删除。Complaint_Details是带有ON DELETE CASCADE操作的投诉的子表。这进一步有另一个带有ON DELETE SET NULL操作的子表。所以在图中我想要删除complaint_id = 7的Complaint节点、complaint_id = 7的Complaint_Details节点并删除其子节点的相应属性。

我当前的方法是使用complaint_id 7查询来自节点投诉的路径 字符串 cypherPath = "匹配路径=(n:" + tableName + "{" + columnName + ":" + PkValue + "})-[*]->(m) WHERE NOT EXISTS((m)-[]-> ()) 返回路径"; 然后我迭代每个节点并检查数据库的删除操作。根据该操作,我要么删除节点,要么删除属性。 该方法耗时较长(2000条记录大约需要5s) 有没有更有效的方法来做到这一点?

neo4j cypher
1个回答
0
投票

根据您的评论,我假设您的数据模型看起来像这样(节点可以具有比所示更多的属性):

(:Complaints {complaint_id: 7})-[:Complaint_Details_complaint_id]->(:Complaint_Details {complaint_id: 7, detail_id: 123})-->(:Foo {detail_id: 123})

其中

Foo
只是
Complaint_Details
节点的子节点的任意数量的标签之一。

在这种情况下,当删除

Complaints
节点时,您还可以删除其
Complaint_Details
节点并以这种方式删除其子节点的
detail_id
属性:

MATCH (c:Complaints)-[:Complaint_Details_complaint_id]->(d:Complaint_Details)
WHERE c.complaint_id = $complaint_id
OPTIONAL MATCH (d)-->(f)
REMOVE f.details_id
DETACH DELETE d, c

查询假定所需的

complaint_id
值作为
$complaint_id
参数传递。

© www.soinside.com 2019 - 2024. All rights reserved.