neo4j - 优化多个 neo4j 节点之间的关系构建
问题描述
我有一个包含两种特定节点类型的数据库:GenomicRange
和GeneModel
. GenomicRange
节点集包含约 8000 万个节点,同时包含GeneModel
约 45,000 个节点。
GenomicRange
节点包含一个posStart
以整数形式存储的属性。该GeneModel
节点包含两个特定的整数属性geneStart
和geneEnd
。这些坐标可chromosome
在两种节点类型中的属性上找到(例如1
,通过10
)。
我想做的是在这两个节点之间有效地创建关系(例如),如果(1)它们的染色体属性匹配,(2)如果in 的值落在节点上的and属性的范围内。[: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,染色体,geneEnd,geneStart。
`CREATE INDEX ON :GenomicRange(chromosome)`
增加堆内存:创建索引会增加内存使用量,因此将堆大小增加到内存的 50%。您可以在neo4j.conf
文件中配置它。
增加页面缓存:缓存大小越大,内存中缓存的数据就越多,这将有助于避免昂贵的磁盘访问。
在此处阅读有关内存配置的更多信息。
PS 如果在增加堆大小后仍然出现内存不足错误,请交换GenomicRange
并GeneModel
在第 1 行和第 3 行或使用APOC plugin
定期创建关系。
推荐阅读
- c# - 从另一个泛型类调用子变量,泛型是父类
- mysql - 排序规则的非法混合错误 - 所有表和列都是相同的集合
- ssh - 如何将 SSH 密钥从 Windows localhost 推送到 GCP 云外壳?
- android - 如何在通过android应用程序(使用phonegap/cordova创建)对服务器进行休息调用时删除原点:file://?
- css - 手机背景图不一样
- typescript - 尝试在 Outlook Online 上放弃更改新约会时出现此错误
- sql - SQL 查询选择支持票证的所有记录及其文件
- node.js - POST文件时如何在服务器上存储更多信息?
- perl - 为什么 cloc 只是一个大文件?
- python-3.x - 对于每个循环,如何将数据导出到 CSV 文件中的新行?