Cypher DELETE和REMOVE语句的用法(附带实例)
在 Neo4j 中,DELETE 语句的作用是删除当前节点及其相关节点,以及它们之间的关系。REMOVE 语句的作用是删除现有节点或关系,删除标签、属性。这两个语句常与 MATCH 语句一起使用。
然后,删除关系的 role 属性,代码如下:
返回关系的 role 属性,代码如下:
删除 name 属性值为“Rob Reiner”的节点的 Person 标签,代码如下:
查看标签为 Person 的节点,代码如下:
然后,删除 name 属性值为“Charlie Sheen”的节点,代码如下:
为了演示使用 DELETE 语句完成单节点删除,我们先使用 CREATE 语句创建一个节点,节点的标签为 DelDemo,再使用 MATCH 语句查询该节点信息。代码如下:
这里采用 WITH 关键字是因为如果不添加该关键字,那么 CREATE 语句与 MATCH 语句将会分两次执行,否则会报错,报错信息为:WITH is required between CREATE and MATCH。
下面删除标签为 DelDemo 的节点,代码如下:
再次使用 MATCH 语句查询标签为 DelDemo 的节点信息,代码如下:
删除name属性值为“Oliver Stone”和title属性值为“Wall Street”的节点之间,关系标签为 DIRECTED 的关系,代码如下:
此时再次查看任意两个节点间关系标签为 DIRECTED 的路径,并返回路径,代码如下:
在上述例子中,DELETE 语句仅会删除关系,并不会删除对应的节点。如果要删除节点,仅需将节点的变量添加到 DELETE 语句中即可。
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 个关系。