加载Neo4j数据库转储(Neo4j外壳)

加载Neo4j数据库转储(Neo4j外壳),neo4j,cypher,dump,data-transfer,Neo4j,Cypher,Dump,Data Transfer,我的数据库受到Neo4j 2.1.1中的错误的影响,该错误往往会在删除了许多节点的区域损坏数据库。事实证明,在我的数据库中,大多数受影响的关系都被标记为删除。我使用neo4jshell和一个查询dump对其余数据进行了编辑。这提供了一个1.5G密码文件,我需要将其导入mint数据库,以使我的数据恢复到健康的数据结构中 我注意到转储文件包含(1)模式、(2)节点和(3)关系的定义。我已经从文件中删除了模式定义,因为它们可以稍后应用。现在的问题是,由于转储文件在节点创建(采用以下格式:_nodeid

我的数据库受到Neo4j 2.1.1中的错误的影响,该错误往往会在删除了许多节点的区域损坏数据库。事实证明,在我的数据库中,大多数受影响的关系都被标记为删除。我使用
neo4jshell
和一个查询
dump
对其余数据进行了编辑。这提供了一个1.5G密码文件,我需要将其导入mint数据库,以使我的数据恢复到健康的数据结构中

我注意到转储文件包含(1)模式、(2)节点和(3)关系的定义。我已经从文件中删除了模式定义,因为它们可以稍后应用。现在的问题是,由于转储文件在节点创建(采用以下格式:_nodeid)和关系创建期间为节点使用一系列标识符,因此所有
CREATE
语句(在我的例子中为33160527)似乎都需要在单个事务中运行

我的第一次尝试让服务器忙了36个小时,但没有结果。我让
neo4jshell
直接将数据加载到新的数据库目录中,而不是连接到服务器。新数据库目录中的数据文件从未显示任何接收数据的迹象,消息日志显示许多指示线程块的消息


我想知道将这些数据返回数据库的最佳方式是什么?我应该加载一个特定的配置文件吗?我需要分配一个大的Java堆吗?将如此大的转储文件加载到数据库中的诀窍是什么?

dump命令不适用于更大规模的导出,最初有一个版本适用于此,但产品中未包含该命令

如果旧数据库仍然存在,可以尝试以下方法:

  • 请联系Neo4j支持部门以帮助您恢复数据
  • 使用my将其复制到新的数据库(它将跳过所有损坏的记录)
  • 使用cypher查询数据并将结果导出为csv
    • 你可以用这个
    • 然后再次使用shell工具或
      load CSV
      命令或批导入器从CSV导入数据

    • 以下是我最后做的:

      首先,我识别了所有未受影响的节点,并用一个特定的标签(比如说Carriable)标记它们。在我的例子中,这是一个非常简单的过程,因为所有受影响的节点都有相同的标签,所以,我只是排除了这个特定的标签。在我的例子中,我不必单独标识受影响的关系,因为所有受影响的关系也都连接到受影响标签中的节点

      然后,我使用单个查询(在
      neo4jshell
      中)将整个数据库(受影响的节点和关系除外)导出到GraphML:

      这花费了大约半个小时来生成4GB XML文件

      然后,我将整个GraphML导入mint数据库:

      JAVA_OPTS="-Xmx8G" neo4j-shell -c "import-graphml -c -t -b 10000 -i /home/mah/full.gml" -path /db/newneo
      
      这又花了半个小时才完成

      请注意,我分配了超过足够的Java堆内存(
      Java_OPTS=“-Xmx8G”
      ),施加了特别小的批大小(
      -b 10000
      ),并允许使用磁盘缓存


      最后,我删除了不必要的“Carriable”标签并重新创建了约束

      在修改POM文件以加载Neo4j 2.1.2之后,我尝试编译store UTIL,但由于Neo4j库的修改,包无法编译。我有太多的标签和属性,无法使用CSV进行传输。因此,我最终在Neoj4 shell中使用了graphml导出和导入命令。我在下面描述这个过程。
      JAVA_OPTS="-Xmx8G" neo4j-shell -c "import-graphml -c -t -b 10000 -i /home/mah/full.gml" -path /db/newneo