Neo4j中亚秒查询延迟的最佳配置是什么?

时间:2015-04-07 02:13:27

标签: neo4j

我使用批处理导入程序脚本导入了nodes.tsv(350MB,18M行,3列)和rels.tsv(5GB,150M行,2列)。 这些是我的batch.properties文件条目

  • •neostore.nodestore.db.mapped_memory = 250M •neostore.relationshipstore.db.mapped_memory = 1000M •neostore.relationshipgroupstore.db.mapped_memory = 10M •neostore.propertystore.db.mapped_memory = 500M •neostore.propertystore.db.strings.mapped_memory = 500M •neostore.propertystore.db.arrays.mapped_memory = 215M •dump_configuration = true

我在ne04j.properties中打开了自动更新和自动索引,如下所示

  • •allow_store_upgrade = true•node_auto_indexing = true •node_keys_indexable = name,title•relationship_auto_indexing = true •relationship_keys_indexable = sent_date,has_read

我在64位Windows服务器上使用neo4j 2.2版本,该服务器具有1 TB SSD和256 GB RAM。 批量导入器和neo4j服务器的配置是什么,我应该用于最大查询和数据加载性能? 此ex:的查询在浏览器中超时

MATCH ()-[r:BELONGS_TO]->() RETURN r

2 个答案:

答案 0 :(得分:2)

如果你有那么多RAM:

您的内存映射配置对于2.2

是错误的

仅使用此设置: `dbms.pagecache.memory = 20G``

然后在neo4j-wrapper.conf中为neo4j提供24G堆

使用可以更好地扩展的Neo4j企业。

禁用自动索引,它们不会用于您正在执行的操作。

您的查询对任何用例都没有意义:

MATCH ()-[r:BELONGS_TO]->() RETURN r

亚秒图形查询始终从一组具体的起始点开始(通过索引查找检索),然后从这些起点遍历。

像你这样的全局扫描查询只会将所有数据存储在内存中,并且无效地处理它。

ESP。如果您返回如此多的数据,则无法承担亚秒级性能。仅数据量就会扼杀它。

因此,找出你想要开始的标签+属性值,然后编写从这些起点遍历的查询。

如果你想在你正在做的事情上得到亚秒,你必须转到Java API并在那里聚合,例如使用服务器扩展:

int counter=0;
for (Relationship r : GlobalGraphOperations.at(db)) {
   if (r.hasType(Types.BELONGS_TO)) counter++;
}
return counter;

答案 1 :(得分:1)

有数百万个节点,无论你做什么,查询都可能很慢,但是如果有可用的内存量,那么这可能不是什么大问题。这是计算内存设置的好指南:

http://neo4j.com/developer/guide-performance-tuning/

在您正在播放时,我会在服务器上设置查询超时,以便您的查询不会堵塞服务器并迫使您需要重新启动它:

http://neo4j.com/docs/stable/server-configuration.html

您可以尝试从查询的LIMIT条开始,以便了解LIMIT增加时性能如何降低。

如果您可以找到一种方法来限制基于节点选择的查询,这也会有所帮助,特别是如果您可以通过标签或标签/属性组合(您可以索引)来执行此操作。

最后,我会尝试在网络控制台中使用EXPLAIN来了解您的查询将如何执行:

http://neo4j.com/docs/2.2.0/how-do-i-profile-a-query.html

此外,您可以使用PROFILE,但这会运行查询,因此您需要在那里更加小心。你也可以在这里使用LIMIT来玩,看看事情是如何运作的