2014-06-18 73 views
0

我正在尋找PostgreSQL中的支持來處理蛋白質序列,這些序列似乎是通用或足夠常見的任務,因此我懷疑我沒有應用正確的Google查詢術語或定義最佳問題辦法。我知道PostBIS和PostBio,但這些似乎更專注於檢測序列關係而不是應用它們。在PostgreSQL中屏蔽和映射對齊的1D陣列

,我最初尋找原始功能是沿着線:

掩蔽:給定字符的ARRAY1 1..N和ARRAY2的(布爾當量)1..N,返回ARRAY3這是由array2掩碼的array1(將array1中的列置零或拼接出array2爲'false'的列)。或者,array2可以是開始和結束位置,而不是完整的n列。

映射:給定array1 1..n,array2 1..m,以及一些映射,它告訴我,例如, array1中的第10列是array2中的第28列,返回在映射的array1位置具有array2值的array3。再次如上所述,映射實現可以是對齊段的開始和結束位置,而不是每個方向上的全部n和m列映射。

我可以設想在數據庫表中使用例如sequenceID,sequenceIndex和alignMap列,但似乎這會產生大量的行(每個序列位置)來索引和連接,當我的軟件訪問數據庫通常想要在全序列塊上工作時。

有沒有現有的模塊或方法我應該考慮?一個優雅的表達與unnest和array_agg(請概述)? PostgreSQL中的數組對我來說是新的,但我知道數據庫內的處理通常比外部處理要快。 perl的。我目前的PostgreSQL版本是9.1,但預計很快會轉移到9.2。

此應用將蛋白質序列A與結構Z對齊,因此A的特徵「x」在Z上出現在哪裏?

回答

1

一些函數可以寫成:

CREATE OR REPLACE FUNCTION mask(anyarray, boolean[]) 
RETURNS anyarray AS $$ SELECT ARRAY(SELECT $1[i] 
          FROM generate_subscripts($1,1) g(i) 
         WHERE $2[i])$$ LANGUAGE sql; 


postgres=# SELECT mask(ARRAY['A','B','C','D'], ARRAY[true, false, true, false]); 
mask 
------- 
{A,C} 
(1 row) 

CREATE OR REPLACE FUNCTION map(anyarray, int[]) 
RETURNS anyarray AS $$ SELECT ARRAY(SELECT $1[i] 
          FROM generate_subscripts($1,1) g(i) 
         ORDER BY $2[i])$$ LANGUAGE sql; 


postgres=# SELECT map(ARRAY['A','B','C','D'], ARRAY[4,3,2,1]); 
map  
----------- 
{D,C,B,A} 
(1 row) 

但我害怕所以它可能是無效的更長的陣列。更好的實施可以在準備好的9.4中完成。但是對於9.1和9.2,只有在C中的實現對於長數組(超過1000個字段)才能真正有效。但是這可以是相對非常簡單的代碼。

你應該做性能測試。