【问题标题】:What is the most powerful way to import data into a Neo4J database?将数据导入 Neo4J 数据库的最强大方法是什么?
【发布时间】:2021-12-13 09:39:30
【问题描述】:

目前我有 150 个约 3M 行的 Mysql 表,每行仅超过 200 列(数量只会增加), 我想将我的表转移到单个 Neo4J 数据库中,每个字段都是一个节点, 所以上面的数字是:

  • 150 => 表数
  • 3M => 行数
  • 200 => 字段数
  • 10 => 平均每个字段中可能值的数量

所以 (150 * 3000000) + (200 * 10)= 大约 450'002'000 个节点

哪种方法最适合导入如此多的节点和关系? 知道有 6 个特定节点用作唯一标识符,因此必须合并它们以避免重复。

我认为 MATCH 非常重,所以我想应该尽可能避免它,您认为使用一种方法来知道节点是否存在而不是询问 Neo4J(例如 MongoDB)是否有用为了避免 MATCH,是个好主意吗?

提前谢谢你。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    在大多数导入数据的场景中,您使用MERGE 而不是MATCH,这允许您创建和重复使用唯一实体。在开始导入之前,请确保您的 CONSTRAINTS 设置正确。 This 是开始阅读的好地方。

    【讨论】:

    • 我确认这个链接很好,测试节点和关系的CSV导入非常快,但我想知道是否有生成csv文件的提示,避免合并等...
    • 你绝对不想避免 MERGE :) 。但您也可以阅读:neo4j.com/developer/relational-to-graph-import
    【解决方案2】:

    对于您将要导入的行数,您可以考虑apoc.periodic.iterate。如果存在短时锁定,它会分批加载并重试。此外,考虑可以在事务日志中累积的垃圾(以 gB 为单位)。我在配置文件中添加了几行以保持清理:

    dbms.checkpoint.interval.time=30s
    dbms.checkpoint.interval.tx=1
    dbms.tx_log.rotation.retention_policy=false
    dbms.tx_log.rotation.size=1M
    dbms.transaction.timeout=30m
    

    正如 Graphileon 所提到的,确保在加载之前对节点和关系进行索引;否则你会有很长的加载时间。另外,请记住,即使使用 MERGE,任何属性更改都会产生重复。

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      相关资源
      最近更新 更多