이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : F.22. 토토-계층 적 트리와 같은 데이터 유형버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

F.21. l트리

이 모듈은 데이터 유형을 구현합니다.트리계층적 트리 구조에 저장된 데이터의 라벨을 표시합니다. 라벨 트리를 검색할 수 있는 광범위한 기능이 제공됩니다.

F.21.1. 정의

A 라벨은 일련의 영숫자와 밑줄입니다(예: C 로캘에서는 문자A-Za-z0-9_허용됩니다). 라벨은 256자(영문 기준) 미만이어야 합니다.

예:42, 개인_서비스

A 라벨 경로은 점으로 구분된 0개 이상의 라벨 시퀀스입니다. 예를 들어L1.L2.L3, 계층 트리의 루트에서 특정 노드까지의 경로를 나타냅니다. 라벨 경로의 길이는 65535개의 라벨을 초과할 수 없습니다.

예:상위.국가.유럽.러시아

트리모듈은 여러 데이터 유형을 제공합니다:

  • 트리라벨 경로를 저장합니다.

  • 쿼리정규식과 유사한 일치 패턴을 나타냅니다.트리값. 간단한 단어는 경로 내의 해당 레이블과 일치합니다. 별 기호(*)은 0개 이상의 라벨과 일치합니다. 예를 들면:

    foo정확한 라벨 경로 일치foo*.foo.*라벨이 포함된 라벨 경로와 일치foo*.foo마지막 라벨이 다음과 같은 라벨 경로와 일치합니다.foo
    

    별 기호는 수량화되어 일치할 수 있는 라벨 수를 제한할 수도 있습니다:

    *{n}        정확히 일치함n라벨
    *{n,}       적어도 일치n라벨
    *{n,m}      적어도 일치n그러나 그 이하m라벨
    *{,m}       최대 일치m라벨 — 동일 *{0,m}
    

    별표가 아닌 라벨 끝에 넣을 수 있는 몇 가지 수정자가 있습니다.쿼리완전히 일치하는 것 이상으로 일치시키려면:

    @           예를 들어 대소문자를 구분하지 않고 일치a@일치A
    *           예를 들어 이 접두사가 있는 라벨과 일치하십시오.foo*일치foobar
    %           초기 밑줄로 구분된 단어 일치
    

    다음의 행동%조금 복잡합니다. 전체 레이블이 아닌 단어를 일치시키려고 합니다. 예를 들어foo_bar%일치foo_bar_baz하지만 아님foo_barbaz. 와 결합된 경우*, 접두사 일치는 각 단어에 개별적으로 적용됩니다. 예를 들어foo_bar%*일치foo1_bar2_baz하지만 아님foo1_br2_baz.

    또한 수정되었을 수 있는 여러 개의 라벨을 다음과 같이 구분하여 작성할 수 있습니다.|(또는) 해당 라벨 중 하나와 일치하도록 하고 다음을 입력할 수 있습니다.!(NOT) 시작 시 대안과 일치하지 않는 모든 레이블과 일치합니다.

    여기에 주석이 달린 예가 있습니다.쿼리:

    톱.*0,2.sport*@.!football|tennis.Russ*|스페인
    가.  비.     기음.      디.               e.

    이 쿼리는 다음과 같은 모든 라벨 경로와 일치합니다:

    1. 라벨로 시작함상위

    2. 다음에는 이전에 0~2개의 라벨이 있습니다.

    3. 대소문자를 구분하지 않는 접두사로 시작하는 라벨스포츠

    4. 그러면 라벨이 일치하지 않습니다축구아니요테니스

    5. 그리고 다음으로 시작하는 라벨로 끝납니다.러스또는 정확히 일치함스페인.

  • ltxt쿼리일치에 대한 전체 텍스트 검색과 유사한 패턴을 나타냅니다.트리값. 안ltxt쿼리값에는 수정자가 있는 단어가 포함되어 있습니다.@, *, %끝에; 수식어는 에서와 동일한 의미를 갖습니다.쿼리. 단어는 다음과 결합될 수 있습니다.&(그리고),|(또는),!(NOT) 및 괄호. 의 주요 차이점쿼리그렇군요ltxt쿼리레이블 경로에서의 위치에 관계없이 단어를 일치시킵니다.

    예는 다음과 같습니다.ltxt쿼리:

    유럽 및 러시아*@ 및 !교통

    이것은 라벨을 포함하는 경로와 일치합니다유럽및로 시작하는 모든 라벨러시아(대소문자를 구분하지 않음), 그러나 라벨을 포함하는 경로는 제외교통. 경로 내에서 이러한 단어의 위치는 중요하지 않습니다. 또한 언제%을 사용하면 해당 단어는 위치에 관계없이 레이블 내의 밑줄로 구분된 모든 단어와 일치할 수 있습니다.

참고:ltxt쿼리기호 사이에 공백을 허용하지만트리그리고쿼리하지 마세요.

F.21.2. 연산자 및 함수

유형트리일반적인 비교 연산자가 있습니다=, <, <, , <=, =. 비교는 트리 순회 순서로 정렬되며 노드의 하위 노드는 레이블 텍스트별로 정렬됩니다. 또한, 다음과 같은 전문 연산자를 사용합니다.표 F.13사용 가능합니다.

표 F.13. 트리연산자

운영자 반환 설명
트리 @ 트리 부울 왼쪽 인수는 오른쪽(또는 동등)의 조상입니까?
트리 <@ 트리 부울 왼쪽 인수는 오른쪽(또는 동등)의 자손입니까?
트리 ~ 쿼리 부울 그렇습니다트리일치쿼리?
쿼리 ~ 트리 부울 그렇습니다트리일치쿼리?
트리 ? l쿼리[] 부울 그렇습니다트리아무거나 일치쿼리배열로?
l쿼리[] ? 트리 부울 그렇습니다트리아무거나 일치쿼리배열로?
트리 @ ltxt쿼리 부울 그렇습니다트리일치ltxt쿼리?
ltxt쿼리 @ 트리 부울 합니다트리일치ltxt쿼리?
트리 || 트리 트리 연결트리경로
트리 || 텍스트 트리 텍스트를 다음으로 변환트리그리고 연결
텍스트 || 트리 트리 텍스트를 다음으로 변환트리그리고 연결
트리[] @ 트리 부울 배열에 다음의 조상이 포함되어 있습니까?트리?
트리 <@ 트리[] 부울 배열에 다음의 조상이 포함되어 있습니까?트리?
l트리[] <@ 트리 부울 배열에 다음의 하위 항목이 포함되어 있습니까?트리?
트리 @ 트리[] 부울 배열에 다음의 하위 항목이 포함되어 있습니까?트리?
트리[] ~ 쿼리 부울 배열에 일치하는 경로가 포함되어 있습니까쿼리?
쿼리 ~ 트리[] 부울 배열에 일치하는 경로가 포함되어 있습니까쿼리?
트리[] ? l쿼리[] 부울 그렇습니다트리배열에는 일치하는 모든 경로가 포함되어 있습니다.쿼리?
l쿼리[] ? 트리[] 부울 그렇습니다트리배열에는 일치하는 모든 경로가 포함되어 있습니다.쿼리?
트리[] @ ltxt쿼리 부울 배열에 일치하는 경로가 포함되어 있습니까ltxt쿼리?
ltxt쿼리 @ 트리[] 부울 배열에 일치하는 경로가 포함되어 있습니까ltxt쿼리?
트리[] ?@ 트리 트리 다음의 조상인 첫 번째 배열 항목트리; 없으면 NULL
트리[] ?<@ 트리 트리 다음의 하위인 첫 번째 배열 항목트리; 없으면 NULL
트리[] ?~ 쿼리 트리 일치하는 첫 번째 배열 항목쿼리; 없으면 NULL
트리[] ?@ ltxt쿼리 트리 일치하는 첫 번째 배열 항목ltxt쿼리; 없으면 NULL

운영자<@, @, @그리고~유사함^<@, ^@, ^@, ^~, 인덱스를 사용하지 않는다는 점만 제외하면 동일합니다. 이는 테스트 목적으로만 유용합니다.

사용 가능한 기능은 다음에 표시됩니다.표 F.14.

표 F.14. 트리기능

기능 반환 유형 설명 결과
sub무지개 토토(무지개 토토, int 시작, int 끝) 트리 하위 경로트리위치에서시작위치로-1 (0부터 계산) sub무지개 토토('Top.Child1.Child2',1,2) 아이1
하위 경로(ltree, int 오프셋, int len) 트리 하위 경로트리위치에서 시작오프셋, 길이len. 만일오프셋는 음수입니다. 하위 경로는 경로 끝에서 멀리 떨어진 곳에서 시작됩니다. 만일len음수이므로 경로 끝에 그만큼 많은 라벨이 남습니다. 하위 경로('Top.Child1.Child2',0,2) 상위.어린이1
하위 경로(ltree, int 오프셋) 트리 하위 경로트리위치에서 시작오프셋, 경로 끝까지 확장됩니다. 만일오프셋은 음수입니다. 하위 경로는 경로 끝에서 멀리 떨어진 곳에서 시작됩니다. 하위 경로('Top.Child1.Child2',1) 아이1.아이2
n레벨(무지개 토토) 정수 경로의 라벨 수 nlevel('Top.Child1.Child2') 3
색인(무지개 토토 a, 무지개 토토 b) 정수 첫 번째 발생 위치bina; -발견되지 않은 경우 -1 색인('0.1.2.3.5.4.5.6.8.5.6.8','5.6') 6
index(ltree a, ltree b, int 오프셋) 정수 첫 번째 발생 위치ba, 검색 시작 위치:오프셋; 부정오프셋시작을 의미함-오프셋경로 끝의 라벨 색인('0.1.2.3.5.4.5.6.8.5.6.8','5.6',-4) 9
text2ltree(텍스트) 트리 캐스트텍스트트리
무지개 토토2text(무지개 토토) 텍스트 캐스트트리텍스트
lca(무지개 토토, 무지개 토토, ...) 트리 경로의 가장 긴 공통 조상(최대 8개의 인수 지원) lca('1.2.3','1.2.3.4.5.6') 1.2
lca(무지개 토토[]) 트리 배열에 있는 경로의 가장 긴 공통 조상 lca(배열['1.2.3'::ltree,'1.2.3.4']) 1.2

F.21.3. 인덱스

트리표시된 연산자의 속도를 높일 수 있는 여러 유형의 색인을 지원합니다.

  • B-트리 인덱스 오버트리: <, <=, =, =,

  • GiST 인덱스 오버트리: <, <=, =, =, , @, <@, @, ~, ?

    그러한 색인 생성의 예:

    GIST(경로)를 사용하여 테스트할 때 INDEX path_gist_idx 생성;
  • GiST 인덱스 오버트리[]: ltree[] <@ ltree, 무지개 토토 @ 무지개 토토[], @, ~, ?

    그러한 색인 생성의 예:

    GIST(array_path)를 사용하여 테스트할 때 INDEX path_gist_idx 생성;

    참고: 이 색인 유형은 손실이 있습니다.

F.21.4. 예시

이 예에서는 다음 데이터를 사용합니다(파일에서도 사용 가능contrib/무지개 토토/무지개 토토test.sql소스 배포판에서):

CREATE TABLE 테스트(경로 ltree);
테스트 값에 삽입('상위');
테스트 값에 삽입('Top.Science');
테스트 값에 삽입('Top.Science.Astronomy');
테스트 값에 삽입('Top.Science.Astronomy.Asphysics');
테스트 값에 삽입('Top.Science.Astronomy.Cosmology');
테스트 값에 삽입('Top.Hobbies');
테스트 값에 삽입('Top.Hobbies.Amateurs_Astronomy');
테스트 값에 삽입('Top.Collections');
테스트 값에 삽입('Top.Collections.Pictures');
테스트 값에 삽입('Top.Collections.Pictures.Astronomy');
테스트 값에 삽입('Top.Collections.Pictures.Astronomy.Stars');
테스트 값에 삽입('Top.Collections.Pictures.Astronomy.Galaxies');
테스트 값에 삽입('Top.Collections.Pictures.Astronomy.Astronauts');
GIST(경로)를 사용하여 INDEX 생성 path_gist_idx ON 테스트;
BTREE(경로)를 사용하여 테스트할 때 INDEX path_idx 생성;

이제 테이블이 생겼습니다테스트아래 표시된 계층 구조를 설명하는 데이터로 채워집니다.

맨 위
                     / |  \
             과학 취미 컬렉션
                 / |              \
        천문학 아마추어_천문학 사진
           / \ |
천체물리학 우주론 천문학
                                        / |    \
                                 은하계 별 우주 비행사

우리는 상속을 할 수 있습니다:

ltreetest= 테스트 WHERE 경로에서 경로 선택 <@ 'Top.Science';
                경로
-----------------------
 탑사이언스
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
(4행)

다음은 경로 일치의 몇 가지 예입니다:

ltreetest= 테스트 WHERE 경로에서 경로 선택 ~ '*.Astronomy.*';
                     경로
----------------------------------
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
 상위.컬렉션.사진.천문학
 상위.컬렉션.사진.천문학.별
 Top.Collections.Pictures.Astronomy.Galaxies
 상위.컬렉션.사진.천문학.우주비행사
(7열)

ltreetest= 테스트 위치에서 경로 선택 경로 ~ '*.!pictures@.*.Astronomy.*';
                경로
-----------------------
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
(3행)

다음은 전체 텍스트 검색의 몇 가지 예입니다:

ltreetest= 테스트 위치에서 경로 선택 경로 @ 'Astro*% & !pictures@';
                경로
-----------------------
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
 탑.취미.아마추어_천문학
(4열)

ltreetest= 테스트 위치에서 경로 선택 path @ 'Astro* & !pictures@';
                경로
-----------------------
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
(3행)

함수를 사용한 경로 구성:

ltreetest= SELECT subpath(path,0,2)||'Space'||subpath(path,2) FROM test WHERE path <@ 'Top.Science.Astronomy';
                 ?열?
-----------------------------
 상위.과학.우주.천문학
 상위.과학.우주.천문학.천체물리학
 상위.과학.우주.천문학.우주론
(3행)

경로의 지정된 위치에 라벨을 삽입하는 SQL 함수를 생성하여 이를 단순화할 수 있습니다.

함수 생성 ins_label(ltree, int, text) 반환 ltree
    AS '선택 하위 경로($1,0,$2) || $3 || 하위 경로($1,$2);'
    언어 SQL은 변경할 수 없습니다.

ltreetest= SELECT ins_label(path,2,'Space') FROM 테스트 WHERE 경로 <@ 'Top.Science.Astronomy';
                ins_label
-----------------------------
 상위.과학.우주.천문학
 상위.과학.우주.천문학.천체물리학
 상위.과학.우주.천문학.우주론
(3행)

F.21.5. 변환

다음에 대한 변환을 구현하는 추가 확장을 사용할 수 있습니다.트리40067_40116무지개 토토_plpythonu, 무지개 토토_plpython2u무지개 토토_plpython3u(참조PostgreSQL : 문서 : 11 : 46.1. 스포츠 토토 사이트 2 vs. 스포츠 토토 사이트 3PL/Python 명명 규칙의 경우). 이러한 변환을 설치하고 함수 생성 시 지정하면,트리값은 Python 목록에 매핑됩니다. (단, 그 반대는 현재 지원되지 않습니다.)

주의

변환 확장을 다음과 동일한 스키마에 설치하는 것이 좋습니다.트리. 그렇지 않고 변환 확장의 스키마에 적대적인 사용자가 정의한 개체가 포함되어 있으면 설치 시 보안 위험이 있습니다.

F.21.6. 저자

모든 작업은 Teodor Sigaev에 의해 수행되었습니다. () 및 Oleg Bartunov(). 참조http://www.sai.msu.su/~megera/postgres/gist/추가 정보를 확인하세요. 저자들은 유용한 토론을 해준 Eugeny Rodichev에게 감사를 표하고 싶습니다. 의견과 버그 신고를 환영합니다.