图形数据库(neo4j)与关系型数据库的比较。需要在设计方面寻求帮助。

3
我是一名有帮助的助手,以下是您需要翻译的内容:

我需要与一个开源项目(biojava)合作,但对其中部分性能不满意,我想花些时间来改进它。

例如,我有一个以这种方式编码的文本数据库:

chrX    Cufflinks   exon    65175856    65175971    .   .   .   gene_id "XLOC_002576"; transcript_id "TCONS_00004217"; exon_number "1"; gene_name "RP6-159A1.2"; oId "CUFF.3698.1"; nearest_ref "ENST00000456392"; class_code "p"; tss_id "TSS3873";    
chrX    Cufflinks   exon    128986006   128986088   .   .   .   gene_id "XLOC_002577"; transcript_id "TCONS_00004218"; exon_number "1"; oId "CUFF.3750.1"; class_code "u"; tss_id "TSS3874";

并非每个字段都是必填的,每个gene_id可以与多个transcript_id(1..n)相关联,每个transcript_id具有1个或多个exon。
该库的行为是将整个文本文件加载到ArrayList中,并且对于每个搜索,必须迭代整个列表。这适用于小列表,但在我的情况下,我有10 ^ 10个查询和一个非常大的列表,这需要几天时间才能在良好的计算机上完成。
Neo4j是否是一个好选择?如何实现它?例如,创建仅为字符串的实体,并在它们之间建立关系是否不好?还是使用带有单个表的Hsqldb更好?
请注意,我不需要持久性,但速度和同步是必需的。
编辑:如果您愿意,可以查看项目here

(您应该在问题中标记“neo4j”和“hsqldb”,这样您的问题将更容易被看到) - cporte
2个回答

0

如果速度非常重要,因为您的数据模式似乎很"简单",您可以采用"手动"解决方案。如果开发时间更重要,而不是"绝对速度",则内存中的关系型数据库是一个不错的选择。 如果不需要持久性,我会避免使用neo4j,因为它更多地针对持久性设计,而您的数据似乎更多是"关系型"而不是"复杂图形"

如果速度至关重要,那么您可以考虑使用Hsqldb等解决方案,将三种对象(基因,转录本,外显子)填充,并使用哈希表对它们进行索引。


0

当你想在大数据集中查找针时,Neo4J表现良好,但当你运行查询时,你只对少量数据感兴趣。例如,如果你有一个类似于以下的图形:

(gene) -> (transcript) -> (exon)

如果你需要运行类似于“从基因XLOC_002576开始,给我所有的转录本以及与这些转录本相关的其他基因”的查询,那么Neo4J是一个很好的选择。(我不知道什么是转录本和外显子,所以这个查询可能没有意义,但你可以理解我的意思)。

如果你不是在大量数据中寻找特定信息,而是对整个数据集进行处理,那么Neo4J可能不是最适合的工具。如果数据集非常庞大(例如数百GB),并且你将整个数据集缩小到一个小答案,并且你不介意将处理分布在几台机器上,那么使用hadoop map reduce并将大型文本文件上传到HDFS可能是一个选项。

如果你提供更多关于查询配置文件的信息,那么就能更好地提供答案。例如,你正在对数据做什么?你所说的“搜索”是什么意思?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接