我们正在将基于MySQL的Django应用程序迁移到Neo4j。在MySQL中,我们有一个提供者表和一个引用表。引荐表只有一个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}))
问题是py2neo正在使用Neo4j的RESTful接口来完成所有这些插入,这意味着它将一次执行一个,具体取决于您的neo4j版本。
您是否有机会使用批处理导入器,它将在初始加载时从CSV导入?如果没有,您是否可以使用 Java 为此编写自己的本机批处理导入器?