我正在尝试在图形数据库中创建500,000个节点。我计划稍后根据我的要求添加边缘。我有一个包含500,000行的文本文件,表示要存储在每个节点中的数据。
from bulbs.neo4jserver import Graph, Config, NEO4J_URI
config = Config(NEO4J_URI)
g = Graph(config)
def get_or_create_node(text, crsqid):
v = g.vertices.index.lookup(crsqid=crsqid)
if v==None:
v = g.vertices.create(crsqid=crsqid)
print text + " - node created"
v.text = text
v.save()
return v
然后我循环遍历文本文件中的每一行
count = 1
with open('titles-sorted.txt') as f:
for line in f:
get_or_create_node(line, count)
count += 1
这非常慢。这在10分钟内给了我5000个节点。这可以改善吗?感谢
答案 0 :(得分:0)
我没有看到任何交易代码,建立一个或信号交易成功。你应该研究一下 - 如果你为每个节点创建做一个事务,那就会很慢。您应该创建一个事务,插入数千个节点,然后提交整个批处理。
我不熟悉灯泡,所以我不能告诉你如何用这个python框架做到这一点,但这里有一个开始的地方:this page建议你可以使用这样的编码风格,与一些python / neo绑定:
with db.transaction:
foo()
另外,如果您尝试加载大量数据并且需要性能,则应check this page获取有关批量导入的信息。在您自己的脚本中执行此操作不太可能是最高效的。您可以考虑使用您的脚本来生成cypher查询,这些查询将通过管道传输到neo4j-shell。
最后需要考虑的是索引。看起来你在crsqid上索引 - 如果你摆脱了那个索引,创建可能会更快。我不知道你的ID是如何分配的,但最好将记录分成几组来测试它们是否存在,而不是使用get_or_create()模式。
答案 1 :(得分:0)
通过REST单独批量加载500k节点并不理想。使用Michael的批处理加载程序或Gremlin shell - 请参阅Marko的电影推荐博客文章,了解如何从Gremlin shell执行此操作。