加载Neo4j数据库转储(neo4j-shell)

5
我的数据库受到了Neo4j 2.1.1中的bug的影响,该bug会导致在删除许多节点的区域中破坏数据库。结果发现,我数据库中大部分受影响的关系都被标记为删除。我使用neo4j-shell和单个查询来dump剩余数据。这产生了一个1.5G Cypher文件,我需要将其导入新的数据库中,以便使我的数据恢复到健康的数据结构中。
我注意到转储文件包含(1)模式、(2)节点和(3)关系的定义。我已经从文件中删除了模式定义,因为它们可以稍后应用。现在的问题是,由于转储文件在节点创建(格式如下:_nodeid)和关系创建期间使用单个标识符系列,似乎所有的CREATE语句(在我的情况下为33,160,527个)都需要在单个事务中运行。
我第一次尝试这样做时,服务器忙了36个小时也没有结果。我让neo4j-shell直接将数据加载到一个新的数据库目录中,而不是连接到服务器。新数据库目录中的数据文件从未显示出任何接收数据的迹象,并且消息日志显示了许多指示线程阻塞的消息。
我想知道将这些数据重新加载到数据库中的最佳方法是什么?我应该加载特定的配置文件吗?我需要分配大量的Java堆吗?有什么诀窍可以将如此大的转储文件加载到数据库中吗?
2个回答

4

dump命令并不适用于大规模的导出,原本有一个版本是可以的,但它没有被包含在产品中。

如果你还有旧的数据库,可以尝试以下一些方法:

  • 联系Neo4j支持来帮助您恢复数据
  • 使用我的store-utils将其复制到新的数据库中(它将跳过所有损坏的记录)
  • 使用Cypher查询数据并将结果导出为CSV
    • 你可以使用shell-import-tools完成这个任务
    • 然后使用shell工具或load csv命令或批量导入器从CSV中导入数据

我尝试修改POM文件以加载Neo4j 2.1.2,并编译store-utils,但由于Neo4j库的修改,该软件包无法编译。我有太多标签和属性要使用CSV进行转移。因此,最终我在Neoj4 shell中使用了graphml导出和导入命令。我在下面描述了这个过程。 - retrography

2

以下是我最终的做法:

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

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

export-graphml -o /home/mah/full.gml -t -r  match (n:Carriable) optional match (n)-[i]-(:Carriable) return n,i

这大约花了半个小时来生成一个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)并允许使用磁盘缓存。

最后,我删除了不必要的“可携带”标签并重新创建了约束条件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接