首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL中对齐一维阵列的掩蔽和映射

PostgreSQL中对齐一维阵列的掩蔽和映射
EN

Stack Overflow用户
提问于 2014-06-18 10:47:07
回答 1查看 292关注 0票数 0

我正在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上出现在哪里?

EN

回答 1

Stack Overflow用户

发布于 2014-06-18 11:19:40

有些函数可以写成:

代码语言:javascript
复制
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个字段)。但这可以是相对简单的代码。

你应该做性能测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24283559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档