【问题标题】:Graph database (neo4j) vs relational database. Need help in design图数据库(neo4j)与关系数据库。需要设计帮助
【发布时间】:2012-05-22 10:39:32
【问题描述】:

我必须与一个开源项目 (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”标记你的问题,你的问题会有更好的可见性)

标签: java database neo4j


【解决方案1】:

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

如果速度很关键,并且您不采用 Hsqldb 之类的解决方案,则想法是填充 3 种对象(基因、转录本、外显子),并使用哈希图对它们进行索引。

【讨论】:

    【解决方案2】:

    当您想大海捞针时,Neo4J 工作得很好,即当您有一个大数据集时,但是当您运行查询时,您只对查询少量数据感兴趣。例如,如果您有如下图表:

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

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

    如果您不是大海捞针,而是为每个查询处理整个数据集,那么 Neo4J 不太可能成为这项工作的工具。如果数据集真的很大(如数百 GB),您是否正在将整个数据集缩减为一个小答案,并且您不介意将处理分布在多台机器上,那么也许使用 hadoop map reduce 并上传您大文本文件到 HDFS 可能是一种选择。

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

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2010-11-11
      • 1970-01-01
      • 2011-07-17
      • 2011-03-25
      • 2011-07-23
      • 2011-05-14
      相关资源
      最近更新 更多