【发布时间】:2015-06-03 00:22:47
【问题描述】:
我正在使用 py2neo 导入数十万个节点。我创建了一个 defaultdict 来将社区映射到城市。一个动机是更有效地导入这些使用Neo4j's load tool 失败的关系。
因为batch documentation 建议避免使用它,所以我偏离了this post 的OP 之类的实现。相反,文档建议我使用 Cypher。但是,我喜欢能够从我创建的 defaultdict 创建节点。另外,正如first link 演示的那样,我发现导入这些信息太困难了。
为了降低导入速度,我应该创建一个Cypher transaction(并且每 10,00 提交一次)而不是下面的循环吗?
for city_name, neighborhood_names in city_neighborhood_map.iteritems():
city_node = graph.find_one(label="City", property_key="Name", property_value=city_name)
for neighborhood_name in neighborhood_names:
neighborhood_node = Node("Neighborhood", Name=neighborhood_name)
rel = Relationship(neighborhood_node, "IN", city_node)
graph.create(rel)
我遇到了超时,当我执行以下操作时它似乎很慢。即使我将事务分解为每 1000 个社区提交一次,它的处理速度仍然非常缓慢。
tx = graph.cypher.begin()
statement = "MERGE (city {Name:{City_Name}}) CREATE (neighborhood { Name : {Neighborhood_Name}}) CREATE (neighborhood)-[:IN]->(city)"
for city_name, neighborhood_names in city_neighborhood_map.iteritems():
for neighborhood_name in neighborhood_names:
tx.append(statement, {"City_Name": city_name, "Neighborhood_Name": neighborhood_name})
tx.commit()
保存指向每个城市的指针会很棒,所以我不需要每次合并时都查找它。
【问题讨论】:
标签: python neo4j graph-databases py2neo