Neo4j入門(五)刪除節(jié)點的正確姿勢
??本文還是照例講講自己工作中遇到的坑。本文將會講述如何在Neo4j中正確地刪除節(jié)點。
??圖數(shù)據(jù)庫在刪除節(jié)點的時候,并不像刪除屬性和刪除關(guān)系那樣方便,原因就在于刪除節(jié)點時,可能有關(guān)系與之相連,因此需要考慮這個問題。Neo4j在刪除節(jié)點時,已經(jīng)考慮了這個問題,那么,我們該如何正確地在Neo4j中刪除節(jié)點呢?
??本文將會介紹如何使用Neo4j原生Cypher語句及py2neo模塊進(jìn)行節(jié)點刪除。
??首先,我們有如下的3個節(jié)點及邊,如下圖:

原生Cypher語句
只刪除節(jié)點
MATCH?(n:Test{name:?'test1'})?DELETE?(n)
運(yùn)行上述語句會報錯:Cannot delete node<10000>, because it still has relationships. To delete this node, you must first delete its relationships.,該語句只刪除name為test1的節(jié)點,但該節(jié)點因為有關(guān)系與之相連,故刪除節(jié)點報錯。
刪除節(jié)點及其子圖
MATCH?(n:Test{name:?'test1'})?DETACH?DELETE?(n)
運(yùn)行上述語句,執(zhí)行成功,會刪除name為test1的節(jié)點及其子圖,也就是該節(jié)點與其他節(jié)點相連的邊也會刪除,如下圖:

刪除全部節(jié)點
MATCH?(n)?DETACH?DELETE?(n)
該語句會刪除整個圖譜,即所有的節(jié)點和關(guān)系,應(yīng)當(dāng)慎用,另外,當(dāng)圖譜規(guī)模很大時,運(yùn)行該語句容易報錯(OOM,Out Of Memeory)。
py2neo
??py2neo是Python操作Neo4j的第三方模塊。
只刪除節(jié)點
??py2neo沒有相應(yīng)的函數(shù)來實現(xiàn)只刪除節(jié)點的操作,可以借助graph.run()函數(shù)調(diào)用原生Cypher語句實現(xiàn),示例代碼如下:
#?-*-?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)))
#?只刪除節(jié)點
graph.run("MATCH?(n:Test{name:?'test1'})?DELETE?(n)")
刪除節(jié)點及其子圖
??py2neo的graph中的delete()函數(shù)會刪除節(jié)點及其子圖,示例代碼如下:
#?-*-?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)))
#?刪除節(jié)點及其子圖
node?=?NodeMatcher(graph=graph).match("Test",?name='test1').first()
result?=?graph.delete(node)
總結(jié)
??本文到此結(jié)束,感謝閱讀,后續(xù)將會介紹更多關(guān)于知識圖譜相關(guān)的內(nèi)容,敬請關(guān)注~
