我正在使用批处理插件来创建一个拥有大约10亿个节点和100亿个关系的数据库。我在多个地方读过,最好按照min(from,to)(我没有做)的顺序对关系进行排序,但我还没有理解为什么这种做法是最优的。我原本以为这只是辅助插入速度,但是当我打开数据库时,遍历非常慢。我意识到可能有很多原因,特别是对于这样大小的数据库,但我希望能够排除我存储关系的方式。
主要问题:它会以非常“随机”的顺序插入关系,因为它们将存储在磁盘上的位置会阻止遍历速度吗?我想也许当它试图遍历节点时,关系太分散了。我希望有人可以告诉我是否会出现这种情况。
更新:
用例几乎是Neo4j朋友的基本朋友,使用Cypher通过REST API进行查询。
每个节点(人)都是独一无二的,并且对于他们所知道的人有一堆“知道”关系。虽然我有十亿个节点,但所有100亿个关系都来自大约3000万个节点。因此,对于我在查询中使用的任何起始节点,它平均有大约330个关系。
在我的初步测试中,即使得到4个未订购的朋友朋友,结果也非常缓慢(平均超过100秒)。当然,在为每个查询预测缓存后,它相当快,但是图表非常随机,我不能将整个关系存储在内存中。
我的一些系统细节,如果需要: - Neo4j 1.9.RC1 - 在Linux服务器上运行,128GB RAM,8核机器,非SSD HD
答案 0 :(得分:1)
我没有在如此大规模的Neo4J上工作,但据我所知,这对速度没有太大影响。你能否提供任何说明插入顺序的链接。
在这种情况下,如果关系是否被缓存,重要的是什么。在缓存相当充足之前,性能将会变慢。您还应该在创建索引后立即设置an appropriate cache size。
您应该阅读this link on regarding neo4j performance。
如果您还没有阅读批量插入内容,请阅读the neo4j documentation on batch insert和these SO questions获取有关批量插入的帮助。