本文还是照例讲讲自己工作中遇到的坑。本文将会讲述如何在Neo4j中正确地删除节点。
图数据库在删除节点的时候,并不像删除属性和删除关系那样方便,原因就在于删除节点时,可能有关系与之相连,因此需要考虑这个问题。Neo4j在删除节点时,已经考虑了这个问题,那么,我们该如何正确地在Neo4j中删除节点呢?
本文将会介绍如何使用Neo4j原生Cypher语句及py2neo模块进行节点删除。
首先,我们有如下的3个节点及边,如下图:
原生Cypher语句
- 只删除节点
MATCH (n:Test{name: 'test1'}) DELETE (n)
运行上述语句会报错:Cannot delete node<10000>, because it still has relationships. To delete this node, you must first delete its relationships.
,该语句只删除name为test1的节点,但该节点因为有关系与之相连,故删除节点报错。
- 删除节点及其子图
MATCH (n:Test{name: 'test1'}) DETACH DELETE (n)
运行上述语句,执行成功,会删除name为test1的节点及其子图,也就是该节点与其他节点相连的边也会删除,如下图:
- 删除全部节点
MATCH (n) DETACH DELETE (n)
该语句会删除整个图谱,即所有的节点和关系,应当慎用
,另外,当图谱规模很大时,运行该语句容易报错(OOM
,Out Of Memeory)。
py2neo
py2neo是Python操作Neo4j的第三方模块。
- 只删除节点
py2neo没有相应的函数来实现只删除节点的操作,可以借助graph.run()函数调用原生Cypher语句实现,示例代码如下:
# -*- coding: utf-8 -*-
from py2neo import Graph
# 连接Neo4j
url = "http://localhost:7474"
username = "neo4j"
password = "***"
graph = Graph(url, auth=(username, password))
print("neo4j info: {}".format(str(graph)))
# 只删除节点
graph.run("MATCH (n:Test{name: 'test1'}) DELETE (n)")
- 删除节点及其子图
py2neo的graph中的delete()函数会删除节点及其子图,示例代码如下:
# -*- coding: utf-8 -*-
from py2neo import Graph
from py2neo import NodeMatcher
# 连接Neo4j
url = "http://localhost:7474"
username = "neo4j"
password = "***"
graph = Graph(url, auth=(username, password))
print("neo4j info: {}".format(str(graph)))
# 删除节点及其子图
node = NodeMatcher(graph=graph).match("Test", name='test1').first()
result = graph.delete(node)
总结
本文到此结束,感谢阅读,后续将会介绍更多关于知识图谱相关的内容,敬请关注~