1

我正在尝试在图形数据库中创建 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 个节点。这可以改进吗?谢谢

4

2 回答 2

0

通过 REST 单独批量加载 500k 节点并不理想。使用 Michael 的批处理加载程序或 Gremlin shell——有关如何从 Gremlin shell 执行此操作的示例,请参阅 Marko 的电影推荐博客文章。

于 2014-01-08T22:36:24.760 回答
0

我没有在其中看到任何交易代码、建立交易代码或发出交易成功的信号。你应该研究一下——如果你为每个节点创建做一个事务,那会很慢。您可能应该创建一个事务,插入数千个节点,然后提交整个批次。

我对灯泡不熟悉,所以我不能告诉你如何使用这个 python 框架来做到这一点,但这里是一个开始的地方:这个页面建议你可以使用这样的编码风格,以及一些 python/neo 绑定:

with db.transaction:
  foo()

此外,如果您尝试加载大量数据并且需要性能,则应查看此页面以获取有关批量导入的信息。在您自己的脚本中执行此操作不太可能是最高性能的。您可能会考虑使用您的脚本来生成密码查询,这些查询通过管道传输到 neo4j-shell。

最后要考虑的是索引。看起来您正在对 crsqid 进行索引 - 如果您摆脱该索引,创建速度可能会更快。我不知道您的 ID 是如何分布的,但最好将记录分成批次以测试它们是否存在,而不是使用 get_or_create() 模式。

于 2014-01-03T15:24:51.507 回答