我有一个包含两个特定节点类型的数据库:GenomicRange
和GeneModel
。 GenomicRange
节点集包含约8,000万个节点,而GeneModel
包含约45,000个节点。
GenomicRange
节点包含属性posStart
,它存储为整数。 GeneModel
节点包含两个特定的整数属性geneStart
和geneEnd
。这些坐标位于两种节点类型中的chromosome
属性上(例如1
到10
)。
如果(1)它们的染色体属性匹配,(2)如果[:RANGE_WITHIN]
中的posStart
值落在GenomicRange
节点上的geneStart
和geneEnd
属性的范围内,我想要做的是在这两个节点之间有效地创建关系(例如GeneModel
)。 。
我目前遇到的问题是我的查询/构建过程非常缓慢。有没有办法优化这段代码?
谢谢你的帮助!
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)
几点建议:
在您用于比较的属性上添加索引。
这里:posStart,chromosome,geneEnd,geneStart。
`CREATE INDEX ON :GenomicRange(chromosome)`
增加堆内存:创建索引会增加内存使用量,因此可以将堆大小增加到内存的50%。您可以在neo4j.conf
文件中进行配置。
增加页面缓存:缓存大小越多,缓存在内存中的数据越多,这将有助于避免昂贵的磁盘访问。
阅读有关内存配置here的更多信息。
附:如果在增加堆大小后仍然出现内存不足错误,请在第1行和第3行交换GenomicRange
和GeneModel
或使用APOC plugin
定期创建关系。