首页 > 编程笔记 > MySQL笔记 阅读:13

Cypher DELETE和REMOVE语句的用法(附带实例)

在 Neo4j 中,DELETE 语句的作用是删除当前节点及其相关节点,以及它们之间的关系。REMOVE 语句的作用是删除现有节点或关系,删除标签、属性。这两个语句常与 MATCH 语句一起使用。

REMOVE语句删除属性及标签

1) REMOVE语句删除属性

首先,查看指定关系的 role 属性,代码如下:
MATCH () - [r:ACTED_IN] -> () RETURN r.role LIMIT 2
返回值如下:
│"r.role"                     │
│"President Andrew Shepherd"  │
│"Gordon Gekko"               │
可以看出,此时返回的两个关系均有 role 属性值。

然后,删除关系的 role 属性,代码如下:
MATCH () - [r1:ACTED_IN{role:"Gordon Gekko"}] -> () REMOVE r1.role

返回关系的 role 属性,代码如下:
MATCH () - [r:ACTED_IN] -> () RETURN r.role LIMIT 2
返回值如下:
│"r.role"                     │
│"President Andrew Shepherd"  │
│null                           │
可以看出,第 2 个关系的 role 属性已经被删除,返回为 null。

2) REMOVE语句删除标签

查看标签为 Person 的节点,代码如下:
MATCH (n:Person) RETURN n
返回值为:
│"n"                            │
│{"name":"Oliver Stone"}      │
│{"name":"Michael Douglas"}   │
│{"name":"Charlie Sheen"}     │
│{"name":"Martin Sheen"}      │
│{"name":"Rob Reiner"}        │

删除 name 属性值为“Rob Reiner”的节点的 Person 标签,代码如下:
MATCH (n:Person{name:"Rob Reiner"}) REMOVE n:Person

查看标签为 Person 的节点,代码如下:
MATCH (n:Person) RETURN n
返回值如下:
│"n"                            │
│{"name":"Oliver Stone"}      │
│{"name":"Michael Douglas"}   │
│{"name":"Charlie Sheen"}     │
│{"name":"Martin Sheen"}      │
可以看出,此时 name 属性值为“Rob Reiner”节点的 Person 标签被删除。

DELETE语句删除节点及关系

1) DELETE语句删除单个节点

首先,查看并返回标签为 Person 的所有节点,代码如下:
MATCH (n:Person) RETURN n
返回值如下:
│"n"                                                            │
│{"name":"Oliver Stone"}                                      │
│{"name":"Michael Douglas"}                                   │
│{"name":"Charlie Sheen"}                                     │
│{"name":"Martin Sheen"}                                      │
此时返回的是符合条件的所有节点。

然后,删除 name 属性值为“Charlie Sheen”的节点,代码如下:
MATCH (n:Person{name:"Charlie Sheen"}) DELETE n
这时返回的是错误信息,具体如下:
Neo.ClientError.Schema.ConstraintValidationFailed: Cannot delete node<4>, because it still has relationships. To delete this node, you must first delete its
relationships.
通过提示可以看出,节点上有关系。这时只有先删除节点对应的关系,才能对节点进行删除。

为了演示使用 DELETE 语句完成单节点删除,我们先使用 CREATE 语句创建一个节点,节点的标签为 DelDemo,再使用 MATCH 语句查询该节点信息。代码如下:
CREATE (n:DelDemo{name:"demo"})
WITH n
MATCH(n1:DelDemo) RETURN n1
上述代码的返回值如下:
│"n1"                                                           │
│{"name":"demo"}                                              │

这里采用 WITH 关键字是因为如果不添加该关键字,那么 CREATE 语句与 MATCH 语句将会分两次执行,否则会报错,报错信息为:WITH is required between CREATE and MATCH。

下面删除标签为 DelDemo 的节点,代码如下:
MATCH(n:DelDemo) DELETE n
返回值为:
Deleted 1 nodes, completed after 1 ms.

再次使用 MATCH 语句查询标签为 DelDemo 的节点信息,代码如下:
MATCH(n:DelDemo) RETURN n
得到的返回值为空,这说明删除节点成功。

2) DELETE语句删除关系

查看任意两个节点间关系标签为 DIRECTED 的路径,并返回路径,代码如下:
MATCH p=() - [r:DIRECTED] -> () RETURN p
此时返回匹配的两个路径,具体如下:
│"p"                                                                │
│[{"name":"Oliver Stone"},{},{"title":"Wall Street"}]         │
│[{"name":"Rob Reiner"},{},{"title":"The American President"}]│

删除name属性值为“Oliver Stone”和title属性值为“Wall Street”的节点之间,关系标签为 DIRECTED 的关系,代码如下:
MATCH (n { name: 'Oliver Stone' }) - [r:DIRECTED] -> (m{title:"Wall Street"})
DELETE r
返回值为:
Deleted 1 relationship, completed after 209 ms.
返回值的提示表明,有一个关系被删除了。

此时再次查看任意两个节点间关系标签为 DIRECTED 的路径,并返回路径,代码如下:
MATCH p=()-[r:DIRECTED]->() RETURN p
此时返回匹配的两个路径,具体如下:
│"p"                                                                │
│[{"name":"Rob Reiner"},{},{"title":"The American President"}]│
返回值表明指定节点之间的关系被删除了。

在上述例子中,DELETE 语句仅会删除关系,并不会删除对应的节点。如果要删除节点,仅需将节点的变量添加到 DELETE 语句中即可。

3) DELETE语句删除节点及相关的关系

删除节点时,在 DELETE 语句前添加 DETACH 关键字,便可以完成删除节点的同时删除该节点相关的关系,代码如下:
MATCH (n:Person{name:"Charlie Sheen"}) DETACH DELETE n
返回值如下:
Deleted 1 node, deleted 3 relationships, completed after 31 ms.
可以看出,删除了 1 个节点和 3 个关系。

相关文章