首页 > 解决方案 > 优化多个 neo4j 节点之间的关系构建

问题描述

我有一个包含两种特定节点类型的数据库:GenomicRangeGeneModel. GenomicRange节点集包含约 8000 万个节点,同时包含GeneModel约 45,000 个节点。

GenomicRange节点包含一个posStart以整数形式存储的属性。该GeneModel节点包含两个特定的整数属性geneStartgeneEnd。这些坐标可chromosome在两种节点类型中的属性上找到(例如1,通过10)。

我想做的是在这两个节点之间有效地创建关系(例如),如果(1)它们的染色体属性匹配,(2)如果in 的值落在节点上的and属性的范围内。[:RANGE_WITHIN]posStartGenomicRangegeneStartgeneEndGeneModel

我目前遇到的问题是我的查询/构建过程非常慢。有没有办法优化这段代码?

谢谢你的帮助!

MATCH (model:GeneModel)
WITH model
MATCH (range:GenomicRange)
WHERE range.chromosome = model.chromosome AND range.posStart >= model.geneStart AND range.posStart <= model.geneEnd
CREATE (range)-[:RANGE_WITHIN]->(model)

标签: neo4jcypher

解决方案


几点建议:

在您用于比较的属性上添加索引。

这里:posStart,染色体,geneEnd,geneStart。

`CREATE INDEX ON :GenomicRange(chromosome)`

增加堆内存:创建索引会增加内存使用量,因此将堆大小增加到内存的 50%。您可以在neo4j.conf文件中配置它。

增加页面缓存:缓存大小越大,内存中缓存的数据就越多,这将有助于避免昂贵的磁盘访问。

在此处阅读有关内存配置的更多信息。

PS 如果在增加堆大小后仍然出现内存不足错误,请交换GenomicRangeGeneModel在第 1 行和第 3 行或使用APOC plugin定期创建关系。


推荐阅读