2014-06-18 6 views
0

PostgreSQL에서 일반적인 Google 검색 조건을 적용하지 않았거나 문제를 가장 잘 정의하지 못하는 것으로 보입니다. 방법. 저는 PostBIS와 PostBio에 대해 알고 있습니다. 그러나 이것들은 서열 관계를 적용하는 것이 아니라 서열 관계를 찾는 데 더 중점을 두는 것 같습니다.PostgreSQL에서 정렬 된 1D 배열을 마스킹하고 매핑하기

마스킹 : 내가 처음을 찾고

원시적 인 기능의 라인을 따라있는 배열 1의 문자의 1..N과 (부울 당량)의 1..N를 array2는 주어진 인 array3를 반환 array2에 의해 마스킹 된 array1 (array2의 'array'가 'false'인 곳에서 array1의 열을 제거하거나 연결하는 것). array2는 전체 n 개의 열 대신 시작 및 끝 위치 일 수 있습니다.

매핑 : 주어진 array1 1..n, array2 1..m 및 몇 가지 매핑. array1의 열 10은 array2의 열 28이고, 반환 된 배열 3은 매핑 된 array1 위치에 배열 2 값을가집니다. 다시 위와 같이 매핑 구현은 각 방향으로 전체 n 및 m 열 맵 대신 정렬 된 세그먼트의 시작 및 끝 위치가 될 수 있습니다.

예를 들어 다음과 같은 데이터베이스 테이블에서이를 수행 할 수 있습니다. sequenceID, sequenceIndex 및 alignMap 열이 있지만 데이터베이스에 액세스하는 소프트웨어가 대개 전체 시퀀스 청크에서 작업하기를 원할 때 인덱싱 및 조인 할 수있는 방대한 수의 행 (시퀀스 위치 당)이 생성되는 것처럼 보입니다.

내가 고려해야 할 기존 모듈 또는 접근법이 있습니까? 불충분하고 array_agg가있는 우아한 표현 (윤곽을 말하십시오)? PostgreSQL의 배열은 새로운 것이지만, 데이터베이스 내부의 처리가 종종 예를 들어 외부보다 빠르다는 것을 배우고 있습니다. 펄 내 현재 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 개 필드 이상)에 실제로 효과적 일 수 있습니다. 그러나 이것은 상대적으로 매우 간단한 코드 일 수 있습니다.

성능 테스트를 수행해야합니다.

관련 문제