我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

因为苏南大叔计划后续的文章写neo4j的查询语句的写法,所以,不可避免的会不断清空数据库。所以,这里就先说说清空数据库的办法把。清空或删除一个neo4j数据库的方法很多,本文中也是介绍其中的几个办法,仅供参考。

苏南大叔:neo4j图数据库,如何清空或删除某个database? - neo4j-删库
neo4j图数据库,如何清空或删除某个database?(图8-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录苏南大叔和计算机代码的故事。本文中,苏南大叔将介绍几个暴力清除neo4j数据库的方式。使用的场景不同,看到看情况使用。

本文测试环境:win10neo4j@4.4.3社区版。实验的过程中,可能会涉及到多次还原数据库,可以参考下面的文章链接:

本文中的介绍的操作,都比较危险,不要在生产环境上实验!一定要备份好数据后再操作!本文提到的这几种方式都是有局限性的,效果都不好!强迫症患者推荐使用删除/data/目录的方式。非强迫症患者可以使用cypher语句删除数据。

方案一:Cypher语句 【有残余】

本条是neo4j官方推荐的方式,但是,在苏南大叔的反复测试操作中,感觉这个方法也是有局限性的。

使用方式

进入neo4j管理界面:

注意看清楚,当前操作的数据库是哪一个,可以使用下面的类似语句更改当前数据库。不过,对于社区版的neo4j来说,一般来说也就一个可以操作的数据库实例(neo4j)。

:use <db_name>

苏南大叔:neo4j图数据库,如何清空或删除某个database? - 查看当前数据库
neo4j图数据库,如何清空或删除某个database?(图8-2)

这里有两种cypher语句可供参考:

MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r

或者

match (n) detach delete n

执行的过程中,没有任何确认提示的。所以,一定要谨慎操作。执行之后,对应数据库实例就是个空壳,所以对应的数据库文件夹还存在,就是个清空的操作。

存在问题

问题一:identity不归零

这两条语句执行完成后,如果不重启图数据库的话,插入新数据的时候,自带的identity是不归零的,用以前的sql的话来说,就是没有truncate效果。如果清库之后,再重启一下数据库,identity就自动归零了,完美。

苏南大叔:neo4j图数据库,如何清空或删除某个database? - 清空数据库
neo4j图数据库,如何清空或删除某个database?(图8-3)

问题二:左侧有残留使用痕迹
官方推荐的方式,还有个非常严重的问题,在browser左侧会残余Node Labels/Relationship Types/Property Keys。建立索引的时候,就会有前两者残余。

前两者可以使用apoc提供的功能去除,而Property Keys的去除,只能够使用neo4j-admin copy的功能去除,然而!这个copy功能只存在于企业版中!社区版中没有!非官方的store-utils提供的copy,只支持到3.5系列,4系列不更新了。
所以说对于强迫症患者又只能使用社区版的同学来说,这事儿简直不能接受。

苏南大叔:neo4j图数据库,如何清空或删除某个database? - 无法清除属性
neo4j图数据库,如何清空或删除某个database?(图8-4)

方案二:直接删除对应图文件【可能有残余】

在上一篇文章中,大家可以知道:neo4j中一个数据库就对应着两个文件夹,那么,非常简单暴力的操作方式就是:直接删除这两个文件夹。路径分别在:

  • 一个在/data/databases/
  • 另外一个在/data/transactions/中。

当然,再删除之前,大家一定要想好自己在做什么,世界上没有卖后悔药的。而且删除之后,在browser里面,还是能看到对应的数据库实例的名字的。如果删除的是neo4j还可以,如果是neo4j2/neo4j3之类的话,就看着列表有些不舒服了。

苏南大叔:neo4j图数据库,如何清空或删除某个database? - 可能的残留
neo4j图数据库,如何清空或删除某个database?(图8-5)

方案三:直接删除整个/data/目录【推倒重来】【推荐】

更加推荐更加野蛮的方式是:删除整个/data/目录,一切推倒重来。如果把/data/目录直接删除的话(里面还有system实例),整个neo4j会直接重建数据库,所有的配置包括用户名密码等,都是全部还原的。

苏南大叔:neo4j图数据库,如何清空或删除某个database? - 物理删除文件
neo4j图数据库,如何清空或删除某个database?(图8-6)

如果/data/目录无法删除的话,可能需要停止一下neo4j服务。

苏南大叔:neo4j图数据库,如何清空或删除某个database? - neo4j-service-stop
neo4j图数据库,如何清空或删除某个database?(图8-7)

注意,一定要删除/data/目录,而不是/data/databases/目录。否则,会导致无法启动neo4j。显示错误信息:

An illegal reflective access operation has occurred

苏南大叔:neo4j图数据库,如何清空或删除某个database? - neo4j-logs
neo4j图数据库,如何清空或删除某个database?(图8-8)

本方案虽然暴力,但是确实治标又治本。而且看了官方issue里面的相关讨论,看上去官方并不想解决这个问题,默许大家物理删库重来。如果您有更加完美的方案,欢迎留言给苏南大叔。谢谢。

参考文献

综述

整体总结来说的话,如果仅仅是重新初始化同一组数据,关系属性等没变的话,就match (n) detach delete n就可以了。如果不是同一组数据了,那么,最好的方法就是物理删除db目录了。

在折腾neo4j的过程中,就是要反复尝试,才会有收获。反复尝试的过程中,就需要不断的备份还原数据,对数据做各种实验。那么,这就是本文的主要应用场景了。
更多neo4j的文章,请点击苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   neo4j    cypher