【问题标题】:masking and mapping aligned 1D arrays in PostgreSQL在 PostgreSQL 中屏蔽和映射对齐的一维数组
【发布时间】:2014-06-18 19:19:40
【问题描述】:

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

我最初寻找的原始函数大致如下:

屏蔽:给定 array1 1..n 个字符和 array2 1..n 个(布尔等价物),返回 array3,它是由 array2 屏蔽的 array1(清空或拼接出 array1 中的列其中 array2 为“假”)。或者,array2 可以是开始和结束位置,而不是完整的 n 列。

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

我可以设想在数据库表中执行此操作,例如sequenceID、sequenceIndex 和 alignMap 列,但是当我的访问数据库的软件通常想要处理完整的序列块时,这似乎会生成大量行(每个序列位置)来索引和连接。

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

这方面的一个应用是蛋白质序列 A 与结构 Z 对齐,那么 A 的特征“x”出现在 Z 的什么位置?

【问题讨论】:

    标签: arrays postgresql mapping sequence bioinformatics


    【解决方案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 个字段)才真正有效。但这可以是相对非常简单的代码。

    您应该进行性能测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      相关资源
      最近更新 更多