Neo4J I';我试图删除帖子中的回复,但不删除回复中的用户或其他关系

Neo4J I';我试图删除帖子中的回复,但不删除回复中的用户或其他关系,neo4j,cypher,Neo4j,Cypher,我有一个节点,我们称它为(p:Post),该节点与另一个名为[r:reply_WITH]的帖子有关系。另一个帖子将是(reply:Post)回复可能有更多具有相同关系的节点。从技术上讲,这可能是无穷无尽的回复。我想以级联方式删除(p)和每个回复以及回复的每个回复。我知道DETACH DELETE,但是它说它不适用于大型数据集,我想确保它不会删除它确实不应该删除的内容,因为它几乎说它会删除所有连接到它的关系和节点,这听起来不像是用户创建帖子时我应该做的事情 对于视觉,这是我想要删除的内容 (p:P

我有一个节点,我们称它为
(p:Post)
,该节点与另一个名为
[r:reply_WITH]
的帖子有关系。另一个帖子将是
(reply:Post)
<代码>回复可能有更多具有相同关系的节点。从技术上讲,这可能是无穷无尽的回复。我想以级联方式删除
(p)
和每个回复以及回复的每个回复。我知道
DETACH DELETE
,但是它说它不适用于大型数据集,我想确保它不会删除它确实不应该删除的内容,因为它几乎说它会删除所有连接到它的关系和节点,这听起来不像是用户创建帖子时我应该做的事情

对于视觉,这是我想要删除的内容
(p:Post)您需要使用可变长度关系来标识要删除的节点

您还需要使用“分离删除”来代替单独删除关系和节点,因为只有删除其中的所有关系才能删除节点

如果一次完成所有操作,查询将如下所示:

// lower bound of 0 so the post itself is included in toDelete
MATCH (p:Post)<-[:replied_To*0..]-(toDelete:Post)
WHERE ID(p) = {postID}
DETACH DELETE toDelete
RETURN ID(toDelete)
如果块太大,您可以根据需要调整限制

编辑

注意这里可能存在的竞争条件很重要,特别是在您将应答链中的节点标记为:ToDelete,然后在另一个用户应答链中的某个位置之后。新回复是在标记节点后创建的,不会在批删除操作中删除

为了处理这些情况,您可能需要在最后运行一些清理查询,以查找悬空的回复,因为他们回复的帖子不见了。将所有回复标记为:Reply和:Post也很有用,这样您以后可以像这样匹配它们:

MATCH (x:Reply) 
WHERE NOT ()<-[:replied_To]-(x)
// we've found dangling replies, now delete their chains
MATCH (x)<-[:replied_To*0..]-(toDelete:Reply)
DETACH DELETE toDelete
匹配(x:回复)

其中NOT()您需要使用可变长度关系来标识要删除的节点

您还需要使用“分离删除”来代替单独删除关系和节点,因为只有删除其中的所有关系才能删除节点

如果一次完成所有操作,查询将如下所示:

// lower bound of 0 so the post itself is included in toDelete
MATCH (p:Post)<-[:replied_To*0..]-(toDelete:Post)
WHERE ID(p) = {postID}
DETACH DELETE toDelete
RETURN ID(toDelete)
如果块太大,您可以根据需要调整限制

编辑

注意这里可能存在的竞争条件很重要,特别是在您将应答链中的节点标记为:ToDelete,然后在另一个用户应答链中的某个位置之后。新回复是在标记节点后创建的,不会在批删除操作中删除

为了处理这些情况,您可能需要在最后运行一些清理查询,以查找悬空的回复,因为他们回复的帖子不见了。将所有回复标记为:Reply和:Post也很有用,这样您以后可以像这样匹配它们:

MATCH (x:Reply) 
WHERE NOT ()<-[:replied_To]-(x)
// we've found dangling replies, now delete their chains
MATCH (x)<-[:replied_To*0..]-(toDelete:Reply)
DETACH DELETE toDelete
匹配(x:回复)

在哪里不()perodic commit真是太棒了。我不知道那是真的。所以每一篇文章都有一个用户,但是分离也会删除这个用户吗?我相信DETACH DELETE会删除所有关系和节点,如果这些节点连接,用户也会被删除。准确吗?我的用户与(p:Post)的连接不准确。“分离-删除”将仅删除正在删除的节点以及附加到它们的所有关系。它不会将删除级联到查询中未包含的连接节点。在我上面的例子中,只有标记为:ToDelete的节点以及与其他节点的关系将被删除,因此写文章的所有:用户都将保留,因为他们都没有标记为:ToDelete.OK,但是如果
ToDelete
有一篇带有[:responsed_to]关系的文章,那么这些文章还会被删除吗?我希望避免在数据库中显示本来是回复的帖子,因为只删除了[:repled_to]关系,而没有删除回复。由于将节点标记为:ToDelete时存在可变长度关系,因此它将标记:repled_to链中的所有节点。也就是说,可能会出现一些种族状况,这些状况会给你留下悬而未决的答复。最后,我编辑了我的帖子来谈论这一点。佩罗迪的承诺真是太棒了。我不知道那是真的。所以每一篇文章都有一个用户,但是分离也会删除这个用户吗?我相信DETACH DELETE会删除所有关系和节点,如果这些节点连接,用户也会被删除。准确吗?我的用户与(p:Post)的连接不准确。“分离-删除”将仅删除正在删除的节点以及附加到它们的所有关系。它不会将删除级联到查询中未包含的连接节点。在我上面的例子中,只有标记为:ToDelete的节点以及与其他节点的关系将被删除,因此写文章的所有:用户都将保留,因为他们都没有标记为:ToDelete.OK,但是如果
ToDelete
有一篇带有[:responsed_to]关系的文章,那么这些文章还会被删除吗?我希望避免在数据库中显示本来是回复的帖子,因为只删除了[:repled_to]关系,而没有删除回复。由于将节点标记为:ToDelete时存在可变长度关系,因此它将标记:repled_to链中的所有节点。也就是说,可能会出现一些种族状况,这些状况会给你留下悬而未决的答复。最后,我编辑了我的帖子来谈论这一点。
MATCH (x:Reply) 
WHERE NOT ()<-[:replied_To]-(x)
// we've found dangling replies, now delete their chains
MATCH (x)<-[:replied_To*0..]-(toDelete:Reply)
DETACH DELETE toDelete