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 を使用する方が良いですか?

永続性は必要ありませんが、速度と同期は必須であることに注意してください。

編集: 必要に応じて、ここでプロジェクトを見ることができます。

4

2 に答える 2

0

データスキーマが「単純」に見えるため、速度が重要な場合は、「手動」ソリューションを実行できます。「絶対的な速度」よりも開発時間が重要な場合は、インメモリ RDBMS が適切なオプションです。永続性が必要ない場合、neo4jは永続性のために設計されており、データは「複雑なグラフ」よりも「リレーショナル」であるように見えるため、neo4jは避けます

速度が重要であり、Hsqldb のようなソリューションを使用しない場合、3 種類のオブジェクト (遺伝子、転写物、エクソン) を埋め、ハッシュマップを使用してそれらにインデックスを付けることが考えられます。

于 2012-07-07T10:05:33.367 に答える
0

Neo4J は、干し草の山から針を見つけたい場合、つまり大きなデータセットがある場合にうまく機能しますが、クエリを実行するときは、少量のデータのクエリのみに関心があります。たとえば、次のようなグラフがあるとします。

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

その場合、Neo4J は、「遺伝子 XLOC_002576 から始めて、そのすべての転写産物と、それらの転写産物に関連する他のすべての遺伝子も提供してください」などのクエリの実行に適しています。(トランスクリプトとエクソンが何であるかはわかりません。そのため、そのクエリはおそらく意味を成しませんが、アイデアはわかります)。

干し草の山から針を探しているのではなく、クエリごとにデータセット全体を処理している場合、Neo4J がその仕事のツールになる可能性は低くなります。データセットが本当に巨大な場合 (数百ギガバイトのように)、データセット全体を小さな答えに減らしていて、複数のマシンに処理を分散してもかまわない場合は、hadoop map reduce を使用して大きなテキストをアップロードします。 HDFSへのファイルはオプションかもしれません。

クエリ プロファイルについてもう少し情報を提供すると、より良い回答を提供するのに役立ちます。つまり、データに対して何をしていますか? 「検索」とはどういう意味ですか?

于 2012-07-18T23:27:11.383 に答える