图数据库(neo4j)与关系数据库。 需要设计方面的帮助

我必须使用开源项目( 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会是个不错的选择吗? 实施它的好方法是什么? 例如,创建一个只有String的实体并在它们之间建立关系是不是很糟糕? 或者将Hsqldb与单个表一起使用会更好吗?

请注意我不需要持久性,但速度和同步是强制性的。

编辑:如果你愿意,你可以在这里查看项目。

如果速度很关键,因为您的数据模式看起来“简单”,您可以执行“手动”解决方案。 如果开发时间比“绝对速度”更重要,那么内存中的RDBMS是一个不错的选择。 如果不需要持久性,我会避免使用neo4j,因为它更专为持久性而设计,你的数据似乎更“关系”,然后是“复杂的图形”

如果速度至关重要而且你不采用像Hsqldb这样的解决方案,那么我们的想法是填充3种对象(基因,转录本,外显子),并使用散列图来索引它们。

当您想要在干草堆中找到针时,Neo4J运行良好,即当您有大型数据集时,但是当您运行查询时,您只对查询少量数据感兴趣。 例如,如果您有一个图形:

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

然后Neo4J擅长运行查询,例如“从基因XLOC_002576开始,给我所有的成绩单,并给我所有其他与这些成绩单相关的基因”。 (我不知道什么是成绩单和外显子,所以查询可能没有意义,但你明白了)。

如果您不是在大海捞针中寻找针,而是为每个查询处理整个数据集,那么Neo4J不太可能成为工作的工具。 如果数据集非常庞大(如数百GB),那么您将整个数据集缩减为一个小答案,并且您不介意将处理分布在多台计算机上,那么可能使用hadoop map减少并上传大文本文件到HDFS可能是一个选项。

如果您提供有关查询配置文件的更多信息,则有助于提供更好的答案。 即你对数据做了什么? “搜索”是什么意思?