【问题标题】:Transferring data from MySQL to Neo4j将数据从 MySQL 传输到 Neo4j
【发布时间】:2013-11-07 16:27:37
【问题描述】:

我们正在将基于 MySQL 的 Django 应用程序迁移到 Neo4j。在 MySQL 中,我们有一个 Providers 表和一个 Referrals 表。推荐表只有一个 provider_from_id、provider_to_id 和一个计数列。它代表从一个提供者到另一个提供者的推荐。

我们所有 4+ 百万个提供商都已转移到 Neo4j。我们计划将引用表示为 Neo4j 中不同提供程序节点之间的关系。

这就是问题所在,有超过 40,000,000 行的推荐,而 Neo4j 似乎在创建关系时表现非常糟糕。这是我们用来创建关系的脚本。以它运行的速度,需要2个多月的时间。有没有更好的方法来传输这些数据?

graph_db = neo4j.GraphDatabaseService()

# Link to providers index
providers_index = graph_db.get_or_create_index(neo4j.Node, "Providers")

# Let's start transferring!
while True:
    total_so_far = num_transferred + num_orphaned
    referrals = Referral.objects.all().order_by('id')[total_so_far:total_so_far+1000000]
        if not referrals:
            break

        for referral in referrals:
            # We need to get the nodes for both providers (assuming they exist)
            provider_from = providers_index.get("npi", referral.provider_from_id)
            provider_to = providers_index.get("npi", referral.provider_to_id)

            if provider_from and provider_to:
                # We have matches for both providers, let's create the relationship
                graph_db.create((provider_from[0], "REFERRED", provider_to[0], {"count": referral.num_referrals}))

【问题讨论】:

    标签: python mysql django neo4j py2neo


    【解决方案1】:

    问题在于 py2neo 使用 Neo4j 的 RESTful 接口来执行所有这些插入操作,这意味着它将一次执行一个,具体取决于您的 neo4j 版本。

    您是否有机会使用Batch Importer,它将在您的初始加载时从 CSV 导入?如果没有,您是否可以使用 Java 为此编写自己的本机批处理导入器?

    【讨论】:

    • 我确实重做了它以使用 Py2Neo 的批处理接口。这样,我一次发送 3500 个请求,并且我不会先检查这两个提供程序是否确实存在。不过,这仍然需要一段时间。我查找了有关 Neo4j 和 CSV 的文档,但我真的找不到任何东西。是否可以从 CSV 导入并创建关系?
    • 我的意思是,批量导入器旨在为这些节点创建节点和关系。我可以只传递关系 csv 文件吗?它还需要通过索引查找节点,我似乎在文档中找不到。
    • 我的答案中有链接,但是是的,它是作为初始导入的一次性加载,它从 CSV 文件中读取。
    猜你喜欢
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多