Arrays 在PostgreSQL中屏蔽和映射对齐的一维数组

Arrays 在PostgreSQL中屏蔽和映射对齐的一维数组,arrays,postgresql,mapping,sequence,bioinformatics,Arrays,Postgresql,Mapping,Sequence,Bioinformatics,我正在PostgreSQL中搜索支持来处理蛋白质序列的任务,这些任务似乎很普通,以至于我怀疑我没有应用正确的Google查询词,也没有以最佳方式定义问题。我知道PostBIS和PostBio,但它们似乎更侧重于检测序列关系,而不是应用它们 我最初寻找的基本函数大致如下: 屏蔽:给定array1..n个字符和array2 1..n个(bool等价物),返回由array2屏蔽的array3(在array1中,如果array2为'false',则为空或拼接列)。或者,array2可以是起始和结束位置,

我正在PostgreSQL中搜索支持来处理蛋白质序列的任务,这些任务似乎很普通,以至于我怀疑我没有应用正确的Google查询词,也没有以最佳方式定义问题。我知道PostBIS和PostBio,但它们似乎更侧重于检测序列关系,而不是应用它们

我最初寻找的基本函数大致如下:

屏蔽:给定array1..n个字符和array2 1..n个(bool等价物),返回由array2屏蔽的array3(在array1中,如果array2为'false',则为空或拼接列)。或者,array2可以是起始和结束位置,而不是完整的n列

映射:给定array1..n,array2 1..m,以及一些告诉我的映射,例如array1中的第10列是array2中的第28列,返回array3,其在映射的array1位置具有array2值。同样如上所述,映射实现可以是对齐段的开始和结束位置,而不是每个方向上的完整n和m列映射

我可以设想在数据库表中使用sequenceID、sequenceIndex和alignMap列来执行此操作,但这似乎会生成大量行(每个序列位置)来进行索引和连接,而我的软件访问数据库时通常希望处理全序列块

我是否应该考虑现有的模块或方法?带unnest和array_agg的优雅表达式(请概述)?PostgreSQL中的数组对我来说是新的,但我了解到,使用例如perl,数据库内部的处理通常比外部的处理快。我目前的PostgreSQL版本是9.1,但预计很快会升级到9.2


这一点的一个应用是蛋白质序列A与结构Z对齐,因此A的特征“x”出现在Z上的什么地方?

一些功能可以写入:

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个字段)。但这可能是相对非常简单的代码

你应该做一些性能测试