【问题标题】:How to reset / clear / delete neo4j database?如何重置/清除/删除neo4j数据库?
【发布时间】:2014-06-12 04:06:29
【问题描述】:

我们可以通过以下查询删除所有节点和关系。

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

但新创建的节点的内部 id 为 ({last node internal id} + 1) 。它不会重置为零。

我们如何重置 neo4j 数据库,例如新创建的节点将 id 为 0?

从2.3开始,我们可以删除所有有关系的节点,

MATCH (n)
DETACH DELETE n

【问题讨论】:

  • 从 Neo4j 2.3 开始,您可以选择使用MATCH (n) DETACH DELETE n
  • MATCH (n) DETACH DELETE n 在有很多节点时惨遭失败:There is not enough memory to perform the current task. Please try increasing 'dbms.memory.heap.max_size' in the neo4j configuration (normally in 'conf/neo4j.conf' or, if you you are using Neo4j Desktop, found through the user interface) or if you are running an embedded installation increase the heap by using '-Xmx' command line flag, and then restart the database

标签: database neo4j cypher


【解决方案1】:

关闭您的 Neo4j 服务器,执行rm -rf data/graph.db 并再次启动服务器。此过程会完全擦除您的数据,因此请小心处理。

【讨论】:

  • 我相信在 Neo4j 3.0 中文件结构发生了变化,现在所有的数据文件都在数据库根目录下,而不是在数据文件夹中。现在我要做的是“rm -rf databaseFolder/*”从文件夹中删除所有内容。显然,首先应该停止服务器。
  • Neo4j 3.0 是支持多个数据库的第一步——目前 Neo4j 安装可以托管多个 graphdb,但仅限于同时运行其中一个。要在 3.0 中删除数据库:rm -rf data/databases/graph.db(如果默认数据库名为 graph.db)。
  • 请注意,在带有自制软件的 macOS 上,此文件位于系统文件夹中,例如/usr/local/Cellar/neo4j/3.1.1/libexec/data/databases
  • 在 ubuntu 18.04 上,对于 neo4j 3.5,此文件夹位于 /var/lib/neo4j/data/databases/graph.db
  • @StefanArmbruster 无法使用 neo4j 4.0+ 提出您的建议。所以我找到了一个解决方法,并在下面提出另一个建议。
【解决方案2】:

运行这两个命令。

match (a) -[r] -> () delete a, r

上述命令将删除所有有关系的节点。 然后运行,

match (a) delete a

它会删除没有关系的节点。

【讨论】:

  • 这不会删除我们为节点创建的属性。即使在删除所有节点和关系之后,我仍然可以看到这些属性仍然可用。有什么办法,我们也可以删除属性
【解决方案3】:

处理多个数据库。

根据Neo4j manage multiple databases documentation

最后一个管理差异是如何完全清理一个数据库而不影响具有多个数据库的整个实例。在处理单个实例和单个数据库的方法时,用户可以删除整个实例并重新开始。但是,对于多个数据库,我们无法做到这一点,除非我们愿意在这种情况下从其他数据库中丢失所有内容。 该方法类似于其他 DBMS,我们可以删除和重新创建数据库,但保留其他所有内容。 Cypher 的命令是CREATE OR REPLACE DATABASE <name>。这将创建数据库(如果它不存在)或用干净的数据库替换现有数据库。

当 neo4j 启动时,可以访问两个数据库,一个 system 数据库和一个默认 (neo4j) 数据库。清除/重置neo4j 数据库:

1 - 切换到system 数据库:

:use system

2 - 显示使用实例创建的所有数据库:

SHOW DATABASES

3 - 运行命令清除数据库。

CREATE OR REPLACE DATABASE <name>

【讨论】:

  • 这个答案的问题是它不适用于社区版本。否则,这是一个很好的建议
  • @EnriqueOrtuño 它在社区版本中对我有用!但是,有一个问题,如果我尝试两次以上,它会破坏我的数据库。我打算在 Github 上报告这个问题。
  • 在社区版本上我也没有运气,文档表明它仅限企业版:neo4j.com/docs/cypher-manual/4.0/administration/databases/…
  • @EnriqueOrtuño 当您第一次下载社区版时,他们会为您提供企业试用版。这或许可以解释为什么它适用于您的“社区版”。
【解决方案4】:

根据我的经验,有两种方法可以重置 Neo4j 数据库,具体取决于您的需要。

方法一:简单删除所有节点/关系/索引/约束

在 Neo4j 浏览器中,或在 Py2neo 中使用graph.run() (link)。

# All nodes and relationships.
MATCH (n) DETACH DELETE n

# All indexes and constraints.
CALL apoc.schema.assert({},{},true) YIELD label, key RETURN *

然而,尽管方便,但这种方法不适合使用命令 neo4j-admin.bat import 进行 BULK 导入的情况,即非常适合一次快速导入数百万个节点。

方法 2:为 BULK Import Tool 重置数据库

当数据库非空时,不能BULK import。上面的方法我试过了,还是报错:

Import error: C:\Users\[username]\AppData\Local\Neo4j\Relate\Data\dbmss\dbms-dd16c384-78c5-4c21-94f3-b0e63e6c4e06\data\databases\neo4j already contains data, cannot do import here
Caused by:C:\Users\[username]\AppData\Local\Neo4j\Relate\Data\dbmss\dbms-dd16c384-78c5-4c21-94f3-b0e63e6c4e06\data\databases\neo4j already contains data, cannot do import here
java.lang.IllegalStateException: C:\Users\[username]\AppData\Local\Neo4j\Relate\Data\dbmss\dbms-dd16c384-78c5-4c21-94f3-b0e63e6c4e06\data\databases\neo4j already contains data, cannot do import here

为了解决这个问题,我删除了以下文件夹:

c:\Users\[username]\AppData\Local\Neo4j\Relate\Data\dbmss\dbms-dd16c384-78c5-4c21-94f3-b0e63e6c4e06\data\databases\neo4j

c:\Users\[username]\AppData\Local\Neo4j\Relate\Data\dbmss\dbms-dd16c384-78c5-4c21-94f3-b0e63e6c4e06\data\transactions\neo4j

然后执行导入命令:

"C:\Users\[username]\AppData\Local\Neo4j\Relate\Data\dbmss\dbms-dd16c384-78c5-4c21-94f3-b0e63e6c4e06\bin\neo4j-admin.bat" import --database=neo4j --multiline-fields=true --nodes=node_ABC.csv --nodes=node_XYZ.csv relationships=relationship_LMN.csv --relationships=relationship_UIO.csv

启动 Neo4j 数据库。在 Neo4j Desktop 中,现在应该可以识别标签和关系。

注意我删除的数据库(neo4j)和我导入的数据库是一样的。

【讨论】:

  • 适用于 4.2.7
【解决方案5】:

此命令会删除所有内容,但需要安装 apoc:

CALL apoc.periodic.iterate('MATCH (n) RETURN n', 'DETACH DELETE n', {batchSize:1000})

【讨论】:

  • 这是正确的做法。你必须使用 apoc!运行此命令后,运行 DROP DATABASE name_of_your_database;
【解决方案6】:

这对我来说适用于版本。 4.3.2社区版:

  • 停止服务器
  • cd &lt;neo home&gt;
  • rm -Rf data/databases/* data/transactions/*
  • 重启服务器

现在您又拥有了系统和 neo4j 数据库。上面的命令也删除了系统数据库,这似乎是必要的,因为仅删除常规数据库(在社区版中只能是 'neo4j')会使系统数据库中的元数据不一致并且您开始看到错误。

data/dbms 似乎包含用户凭据,如果您想保留现有用户,可以保留它(否则,您将返回默认的 neo4j/test 用户)。

推荐的方法是使用DROPCREATE Cypher 命令,但是这些仅在企业版中可用(我认为像这样的基本功能是他们的高级产品的一部分,但那是它)。

【讨论】:

    【解决方案7】:

    如果你在 docker 容器上使用它,你可以这样做

    docker-compose rm -f -s -v myNeo4jService

    【讨论】:

    • 如果您为数据库使用外部卷挂载,则不会。如果不是,那么只需重新启动 docker 容器就会导致新状态。
    • @cricket_007 你能详细说明“重启”吗?
    • 删除和启动 Docker 容器不会清除外部卷挂载的数据库。我只是想澄清一下答案
    【解决方案8】:

    由于 neo4j 只运行 conf 文件中指定的当前数据库,启动一个新的干净数据库的简单方法是在 neo4j.conf 文件中更改当前数据库,然后重新启动 neo4j 服务器。

    dbms.active_database=graph.db --> dbms.active_database=graph2.db
    

    有些人可能会争辩说数据库名称已更改。但在撰写本文时 [2018-12],neo4j 不支持多个数据库实例。我们不需要区分数据库,因此我们的代码中没有使用数据库的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 2011-05-28
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多