【问题标题】:Migrating mysql data to neo4j database将mysql数据迁移到neo4j数据库
【发布时间】:2023-03-11 00:45:01
【问题描述】:

我想将数据从 Mysql 迁移到 neo4j。我在 64 位 Windows 机器上使用 Neo4j 2.1.2 64 位安装程序。 我关注了链接 http://maxdemarzi.com/2012/02/28/batch-importer-part-2/#more-660 中的博客,其中很好地解释了从 postgreSQL 迁移数据。

即使我采取了相同的示例并在 mysql 中创建了相同的表。在 mysql 中创建节点和关系表后,我将它们导出为 csv 文件。这样我就可以在batch import 命令中使用它们。 这里我所有的字段都是 varchar,row_number() 字段也是 varchar 字段。

我使用以下命令将mysql的关系表导出到myrels.csv文件(节点表也是如此):

SELECT  *
INTO OUTFILE 'D:/Tech_Explorations/BigData_Related/Neo4j/mqytoneo4j/myrels.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
FROM
(
SELECT 'start' AS `start`, 'end' AS `end`,'type' AS `type`,'status' AS `status`
UNION ALL

SELECT `start`, `end`,`type`,`status`
FROM `vouch_rels`
) `sub_query`;

使用以下查询加载 mynodes.csv 和 myrels.csv o neo4j:

java -server -Xms1024M -jar D:/Neo4j/target/batch-import-jar-with-dependencies.jar    
neo4j/data/graph.db mynodes.csv myrels.csv

当我执行上述批量导入查询时,它给了我一个错误提示

Exception in thread "main" java.lang.NumberFormatException: For input string: "1
,"1","python,confirmed"

其中 "1,"1","python,confirmed" 是 myrels.csv 中的行。

上述错误可能是由于某些数据类型或 csv 文件问题,但我无法弄清楚。即使我尝试在从 mysql 加载到 csv 文件时更改不同的 csv 加载选项。但仍然得到同样的错误。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    从 MySQL 到 Neo4j 的迁移并不是一个简单的导出加载问题。 Neo4j 的属性图需要清晰,并且应该与 MySQL 模式一致。据我所知,没有办法从 MySQL 模式自动生成 Neo4j 属性图。在 2 个模式定义好后,您可以使用任何编程语言编写自己的迁移。

    进行迁移的 python 方式

    py2neo 是一个 Python 库,可以轻松编写迁移,因为它提供了大量有用的函数、运行密码查询的选项、事务支持等。

    我在一个项目中使用 py2neo 将大约 100MB 的数据从 MySQL 迁移到 Neo4j。 Here 是与文档一起参考的示例代码。未提供数据,但给出了 MySQL 和 Neo4j 属性图的架构。

    P.S:我可能偏离了试图解决您的问题。但我写了这个答案,因为它可能会帮助那些希望使用 Python 解决 MySQL 到 Neo4j 迁移问题的读者。

    【讨论】:

      【解决方案2】:

      我建议查看LOAD CSV Cypher 选项。 Neo4j website上有详细的文档。

      基本上,您可以使用如下所示的 Cypher 查询来导入数据。

      USING PERIODIC COMMIT
      LOAD CSV WITH HEADERS FROM "file:/path/to/your.csv" AS csvLine
      MATCH (person:Person { id: toInt(csvLine.personId)}),(movie:Movie { id: toInt(csvLine.movieId)})
      CREATE (person)-[:PLAYED { role: csvLine.role }]->(movie)
      

      如果您希望继续使用 Java 批量导入工具,那么我认为您的文件需要制表符分隔而不是逗号分隔。

      【讨论】:

      • 我想使用 java 批量导入,因为我想将数据从 mysql 迁移到 neo4j。但是为什么 csv 文件应该用制表符分隔呢?有什么理由吗?
      • 它在 Github 页面github.com/jexp/batch-import#neo4j-csv-batch-importer 上以粗体显示“您提供一个制表符分隔的 csv 文件”。
      • 在链接http://stackoverflow.com/questions/20597702/how-to-import-csv-file-into-neo4j-numberformatexception?rq=1 中我也发现了同样的问题。如果我想使用逗号分隔的 csv 文件,那么我需要配置 batch_import.csv.delim=, my batch.properties。但是我在哪里可以找到 batch.properties 文件?我还发现一个 batch.properties 文件在运行批处理导入命令后变得模糊。在那个文件中我需要添加batch_import.csv.delim=,吗?
      • 嗨,在创建制表符分隔节点和关系 csv 后,我可以将节点和关系导入 neo4j。但是当我启动 Neo4j 服务器并更改数据库位置(更改的数据库位置指向新创建的节点和使用批量导入的 rels)时,neo4j 服务器没有启动。说Starting Neo4j Server failed: Error starting org.neo4j.kernel.EmbeddedGraphDatabase, D:\Neo4j\data\neo4j\data\graph.db
      • 我收到如下错误:o.neo4j.kernel.EmbeddedGraphDatabase - Startup failed: Component 'org.neo4j.kernel.impl.transaction.XaDataSourceManager@525c6957' was successfully initialized, but failed to start. Please see attached cause exception.: Component 'org.neo4j.kernel.impl.nioneo.xa.NeoStoreXaDataSource@49643715' was successfully initialized, but failed to start. Please see attached cause exception.: 'neostore.nodestore.db' has a store version number that we cannot upgrade from. Expected 'NodeStore v0.A.1' but file is version 'NodeStore v0.A.0'我正在使用批量导入创建数据库。
      猜你喜欢
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      相关资源
      最近更新 更多