我正在PostgreSQL中寻找对蛋白质序列处理的支持,因为这些任务似乎是通用的或足够常见的,因此我怀疑我没有使用正确的谷歌查询术语,也没有以最好的方式定义问题。我知道PostBIS和PostBio,但它们似乎更侧重于检测序列关系,而不是应用它们。
我最初寻找的原语函数是这样的:
掩蔽:给定字符的array1 1..n和(bool等价物)的array2 1.n,返回由array2掩盖的array3 (在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上出现在哪里?
发布于 2014-06-18 11:19:40
有些函数可以写成:
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个字段)。但这可以是相对简单的代码。
你应该做性能测试。
https://stackoverflow.com/questions/24283559
复制相似问题