DELETE

DELETE 子句用于删除节点、关系或路径。

若要移除属性和标签,请参阅 REMOVE 子句。

如果节点上连接有关系,则无法直接删除该节点,除非同时删除这些关系。这可以通过显式删除特定关系,或使用 DETACH DELETE 子句来实现。

虽然 DELETE 子句会使被删除的对象不再可访问,但这些节点和关系所占用的空间仍保留在磁盘上,并留给后续创建数据的事务使用。有关如何清理和重用已删除对象所占空间的详细信息,请参阅 操作手册 → 空间重用

示例图

下文示例使用以下图表。图中展示了四位演员,其中三位(Keanu ReevesCarrie-Anne MossLaurence Fishburne)在电影 The MatrixACTED_IN(参演),另一位演员(Tom Hanks)未参演。

要重建该图,请在空的 Neo4j 数据库中运行以下查询

CREATE
  (keanu:Person {name: 'Keanu Reever'}),
  (laurence:Person {name: 'Laurence Fishburne'}),
  (carrie:Person {name: 'Carrie-Anne Moss'}),
  (tom:Person {name: 'Tom Hanks'}),
  (theMatrix:Movie {title: 'The Matrix'}),
  (keanu)-[:ACTED_IN]->(theMatrix),
  (laurence)-[:ACTED_IN]->(theMatrix),
  (carrie)-[:ACTED_IN]->(theMatrix)

删除单个节点

要删除单个节点,请使用 DELETE 子句。

查询
MATCH (n:Person {name: 'Tom Hanks'})
DELETE n

这将删除 Person 节点 Tom Hanks。此查询仅在未连接任何关系的节点上才能运行。

结果
Deleted 1 node

NODETACH 关键字

也可以使用 NODETACH DELETE 子句来删除单个节点。使用 NODETACH 关键字明确定义了不会从节点分离并删除其关系。NODETACH 关键字是现有关键字 DETACH 的对应项,它是作为 Cypher® 的 GQL 一致性的一部分引入的。包含它在功能上与使用简单的 DELETE 相同。

查询
MATCH (n:Person {name: 'Tom Hanks'})
NODETACH DELETE n

这也将删除 Person 节点 Tom Hanks

仅删除关系

可以删除关系,同时不影响与该关系连接的节点。

查询
MATCH (n:Person {name: 'Laurence Fishburne'})-[r:ACTED_IN]->()
DELETE r

这将删除 Person 节点 Laurence Fishburne 的所有外向 ACTED_IN 关系,而不会删除该节点本身。

结果
Deleted 1 relationship

删除节点及其所有关系

要删除节点及其连接的所有关系,请使用 DETACH DELETE 子句。

查询
MATCH (n:Person {name: 'Carrie-Anne Moss'})
DETACH DELETE n

这将删除 Person 节点 Carrie-Anne Moss 以及与之相连的所有关系。

结果
Deleted 1 node, deleted 1 relationship

具有受限安全权限的用户可能无法使用 DETACH DELETE 子句。有关详细信息,请参阅 操作手册 → 细粒度访问控制

删除所有节点和关系

可以删除图中的所有节点和关系。

删除所有节点和关系
MATCH (n)
DETACH DELETE n
结果
Deleted 3 nodes, deleted 1 relationship

DETACH DELETE 在试验小型示例数据集时很有用,但不适合删除大量数据,也不会删除 索引 或任何 模式 (schema)

若要删除大量数据而不删除索引和模式,请改用 事务中的 CALL 子查询

使用 CALL 子查询删除所有节点和关系
MATCH (n)
CALL (n) {
 DETACH DELETE n
} IN TRANSACTIONS

要移除所有数据(包括索引和约束),请使用以下命令重新创建数据库:CREATE OR REPLACE DATABASE name

删除数据库并重新创建
CREATE OR REPLACE DATABASE neo4j