Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Configuration 如何为特定任务配置Neo4j_Configuration_Neo4j - Fatal编程技术网

Configuration 如何为特定任务配置Neo4j

Configuration 如何为特定任务配置Neo4j,configuration,neo4j,Configuration,Neo4j,我有一个非常简单的模式Neo4j。只有一种类型的节点和一种类型的关系可以绑定节点。每个节点有一个属性(索引),每个关系有四个属性。这些数字如下: neo4j-sh (?)$ dbinfo -g "Primitive count" { "NumberOfNodeIdsInUse": 19713210, "NumberOfPropertyIdsInUse": 109295019, "NumberOfRelationshipIdsInUse": 44903404, "NumberOfR

我有一个非常简单的模式Neo4j。只有一种类型的节点和一种类型的关系可以绑定节点。每个节点有一个属性(索引),每个关系有四个属性。这些数字如下:

neo4j-sh (?)$ dbinfo -g "Primitive count"
{
  "NumberOfNodeIdsInUse": 19713210,
  "NumberOfPropertyIdsInUse": 109295019,
  "NumberOfRelationshipIdsInUse": 44903404,
  "NumberOfRelationshipTypeIdsInUse": 1
}
我在带有Debian、7核和26GB RAM的虚拟机上运行这个数据库。这是我的Neo4j配置:

neo4j.特性:

neostore.nodestore.db.mapped_memory=3000M
neostore.relationshipstore.db.mapped_memory=4000M
neostore.propertystore.db.mapped_memory=4000M
neostore.propertystore.db.strings.mapped_memory=300M
neostore.propertystore.db.arrays.mapped_memory=300M
neo4j-wrapper.conf:

wrapper.java.additional=-XX:+UseParallelGC
#wrapper.java.additional=-XX:+UseConcMarkSweepGC
wrapper.java.additional=-XX:+CMSClassUnloadingEnabled
wrapper.java.initmemory=2000
wrapper.java.maxmemory=10000
我使用UseParallelGC而不是UseConcMarkSweepGC,因为我注意到使用UseConcMarkSweepGC时,在查询期间只使用一个CPU内核,当我更改为UseParallelGC时,所有内核都被使用。我不会并行运行任何查询。在neo4j shell中一次只能有一个,但主要涉及整个节点集,例如:

match (n:User)-->(k:User)
return n.id, count(k) as degree
order by degree desc limit 100;
执行它需要726230毫秒。我还尝试:

match (n:User)-->()-->(k:User)
return n.id, count(DISTINCT k) as degree
order by degree desc limit 100;
但很长一段时间后,服务器线程中出现了“仅获取”错误;嵌套异常为: java.lang.OutOfMemoryError:超出GC开销限制”。我没有尝试考虑关系属性的限制查询,但这也是计划中的。
我认为我的配置不是最优的。我注意到Neo4j在查询期间最多使用50%的系统内存,剩余内存是可用的。我可以通过在wrapper.java.maxmemory中设置更大的值来改变这一点,但我已经读到,我必须为映射的_内存设置保留一些内存。然而,我不确定它们是否被考虑在内,因为在查询过程中有大量的空闲内存。如何设置此类查询的配置

您的查询是随着数据量的增加而变慢的全局查询。对于每个用户节点,计算传出关系的数量,将其放入集合并按计数排序。这种操作消耗大量的CPU和内存。与其调整配置,不如重构图形模型


根据您的用例,考虑将用户的<代码>度<代码>存储在用户节点上的属性中。当然,任何为用户添加/删除关系的操作都需要反映在

degree
属性中。此外,您可能需要为
degree
属性编制索引。

我知道我的查询会消耗大量CPU和内存。但是,我的图形模型已经过优化,因为我没有将两个用户之间的每个通信事件存储为单独的关系。相反,我将它们聚合为一个关系,因此两个用户之间最多有两个关系。一个用于传出通信事件,一个用于输入。在我的用例中,在属性中存储学位不会有帮助。我想调整配置的原因是,即使在这种消耗性查询期间,我仍有大约10GB的可用内存。另一种方法可能是使用Neo4j的java API将该查询重构为非托管扩展。我在非托管扩展方面取得了一些很好的经验,它比cypher(尤其是cypher)快得多。对于大型查询,请参阅docs.neo4j.org/chunked/stable/server-unmanaged-extensions.html