2012-05-22 105 views
3

我必須使用開源項目(biojava),但我對某些性能不滿意,我想花一些時間來改進它。圖形數據庫(neo4j)vs關係數據庫。需要設計幫助

例如,我有一個文本數據庫以這種方式編碼:

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

+0

(你應該用「neo4j」和「hsqldb」來標記你的問題,你的問題會有更好的可見性) – cporte

回答

0

如果速度很關鍵,因爲您的數據架構看起來「很簡單」,您可以通過「手動」解決方案。如果開發時間比「絕對速度」更重要,那麼內存中的RDBMS是一個不錯的選擇。 如果不需要持久性,我會避免neo4j,因爲它是更持久的設計和你的數據似乎更「關係」,然後「複雜的圖」

如果速度是關鍵,他們你不採取解決方案像Hsqldb,這個想法是填充3種對象(基因,轉錄本,外顯子),並用hashmaps來索引它們。

0

當你想在乾草堆裏找到針時,即當你有一個大的數據集,但是當你運行查詢時,你只需要查詢少量的數據,Neo4J就能很好地工作。舉例來說,如果你有一個像圖:

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

然後Neo4j的將是一件好事,在運行的查詢,如與基因XLOC_002576「開始,給我所有它的成績單,給我所有的其他基因也涉及到這些謄」。 (我不知道什麼成績單和外顯子,所以查詢可能沒有意義,但你明白了)。

如果您不是在乾草堆裏尋找針,而是爲每個查詢處理整個數據集,那麼Neo4J不太可能成爲這項工作的工具。如果數據集真的非常龐大(如數百GB),那麼您是將整個數據集縮減爲一個小的答案,並且您不介意將處理分佈在多臺機器上,那麼可能使用hadoop地圖縮小並上傳大文本文件到HDFS可能是一個選項。

如果您提供了關於您的查詢配置文件的更多信息,它將有助於提供更好的答案。即你對數據做了什麼? 「搜索」是什麼意思?