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

时间:2012-05-22 10:39:33

标签: java database 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都有一个或多个exon。< / p>

库行为是将整个文本文件加载到ArrayList中,对于每个搜索,必须迭代列表。这适用于小型列表,但在我的情况下,我有10 ^ 10个带有非常大的列表的查询,并且在一台好的计算机上需要几天时间。

Neo4j会是个不错的选择吗?实施它的好方法是什么?例如,创建一个只有String的实体并在它们之间建立关系是不是很糟糕?或者将Hsqldb与单个表一起使用会更好吗?

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

编辑:如果需要,您可以查看项目here

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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

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