F.23. ltree-계층 적 트리와 같은 데이터 유형#

이 모듈은 데이터 유형을 구현합니다ltree계층 적 트리와 같은 구조에 저장된 데이터의 레이블을 나타냅니다. 라벨 나무를 통해 검색을위한 광범위한 시설이 제공됩니다.

이 모듈이 고려됩니다신뢰할 수있는Create현재 데이터베이스의 권한.

F.23.1. 정의#

a레이블는 영숫자, 밑줄 및 하이픈의 순서입니다. 유효한 영숫자 문자 범위는 데이터베이스 로케일에 따라 다릅니다. 예를 들어, C Locale에서 캐릭터a-za-z0-9_-허용됩니다. 레이블은 길이가 1000 자를 초과하지 않아야합니다.

예 :42, personal_services

a레이블 경로예를 들어 도트로 분리 된 0 개 이상의 레이블의 시퀀스l1.l2.l3, 계층 적 트리의 루트에서 특정 노드까지 경로를 나타냅니다. 레이블 경로의 길이는 65535 라벨을 초과 할 수 없습니다.

예 :top.countries.europe.russia

theltree모듈은 몇 가지 데이터 유형을 제공합니다.

  • ltree레이블 경로를 저장합니다.

  • LQuery롤 토토하는 일반적인 표현과 같은 패턴을 나타냅니다ltree값. 간단한 단어는 경로 내에서 해당 레이블과 롤 토토합니다. 별 기호 (*)는 0 이상의 레이블과 롤 토토합니다. 이들은 도트와 결합하여 전체 레이블 경로와 롤 토토 해야하는 패턴을 형성 할 수 있습니다. 예를 들어:

    foo정확한 레이블 경로 롤 토토foo*.foo.*레이블이 포함 된 라벨 경로 롤 토토foo*.foo마지막 레이블이있는 라벨 경로 롤 토토foo
    

    별 기호와 간단한 단어가 모두 정량화되어 롤 토토 할 수있는 레이블 수를 제한 할 수 있습니다.

    *n정확히 롤 토토n라벨*n,적어도 롤 토토n라벨*n,M적어도 롤 토토n하지만m라벨*,M최대 롤 토토M레이블 -*0,mn,M적어도 롤 토토n하지만M발생foofoo ,발생 롤 토토foo, 제로 포함
    

    명시적인 정량자가없는 경우 별 기호의 기본값은 여러 레이블과 롤 토토하는 것입니다 (즉,,14953_150301).

    비 스타의 끝에 넣을 수있는 몇 가지 수정자가 있습니다LQuery정확히 롤 토토하는 것 이상으로 롤 토토하는 항목 :

    @예를 들어 사례 비면적으로 롤 토토a@매치a
    *           예를 들어이 접두사와 라벨을 롤 토토시킵니다foo*매치foobar%초기 밑줄이 구분 된 단어 롤 토토
    

    행동%조금 복잡합니다. 전체 레이블이 아닌 단어와 롤 토토하려고합니다. 예를 들어foo_bar%매치foo_bar_baz하지만foo_barbaz. 와 결합 된 경우*, 접두사 매칭은 각 단어에 별도로 적용됩니다 (예 :foo_bar%*매치foo1_bar2_baz하지만FOO1_BR2_BAZ.

    또한 분리 된 몇 가지 수정 된 비 스타트 품목을 쓸 수 있습니다|(또는) 해당 항목과 롤 토토하려면!(NOT) 비 스타 그룹이 시작될 때 대안과 롤 토토하지 않는 레이블과 롤 토토합니다. 수량자는 그룹의 끝에갑니다. 그것은 그룹 전체에 대한 몇 가지 롤 토토를 의미합니다 (즉, 일부 레이블이 대안과 롤 토토하거나 롤 토토하지 않음)..

    여기에 주석이 달린 예는LQuery:

    TOP.*0,2 .Sport*@.! Football | Tennis 1,. Russ*| Spain
    에이.  비.     기음.      디.                   이자형.

    이 쿼리는 다음과 같은 라벨 경로와 롤 토토합니다.

    1. 레이블로 시작합니다TOP

    2. 그리고 다음은 이전에 0에서 두 개의 레이블이 있습니다

    3. 사례 감수성 접두사로 시작하는 레이블스포츠

    4. 그런 다음 하나 이상의 레이블이 있으며 그 중 어느 것도 롤 토토하지 않습니다FootballNOR테니스

    5. |Russ또는 정확히 롤 토토하는스페인.

  • ltxtQuery롤 토토하는 전체 텍스트 검색 패턴을 나타냅니다ltree값.ltxtQuery값은 수정 자와 함께 단어를 포함합니다@, *, %끝에; 수정자는와 동일한 의미를 갖습니다.LQuery. 단어는와 결합 할 수 있습니다.&(및),|(또는),!(아님) 및 괄호. 의 주요 차이점LQueryltxtQuery레이블 경로에서의 위치와 상관없이 단어와 롤 토토합니다.

    여기 예입니다ltxtQuery:

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

    이것은 레이블을 포함하는 경로와 롤 토토합니다유럽러시아(사례에 민감하지 않음) 라벨을 포함하는 경로는 아닙니다교통. 경로 내 에서이 단어의 위치는 중요하지 않습니다. 또한%사용됩니다.이 단어는 위치에 관계없이 라벨 내의 밑줄로 구분 된 단어와 롤 토토 할 수 있습니다.

참고 :ltxtQuery기호 사이에 공백을 허용하지만ltreeandLQuerydo not.

F.23.2. 운영자 및 기능#

Typeltree일반적인 비교 연산자가 있습니다=, <, <, , <=, =. 비교는 트리 트래버스 순서대로 정렬되며 노드의 어린이는 레이블 텍스트로 정렬됩니다. 또한에 표시된 전문 운영자테이블 F.13사용 가능합니다.

표 F.13. ltree운영자

운영자

설명

ltree @ ltree부울

왼쪽 인수는 오른쪽 (또는 평등)의 조상입니다.

ltree <@ ltree부울

오른쪽 (또는 평등)의 후손 인 왼쪽 논증입니다.

ltree ~ LQuery부울

LQuery ~ ltree부울

doltree매치LQuery?

ltree ? lQuery []부울

lQuery [] ? ltree부울

doltree롤 토토LQuery배열에서?

ltree @ ltxtQuery부울

ltxtQuery @ ltree부울

doltree매치ltxtQuery?

ltree || ltreeltree

연결ltreePaths.

ltree || 텍스트ltree

텍스트 || ltreeltree

텍스트 변환ltree및 연결.

ltree [] @ ltree부울

ltree <@ ltree []부울

배열은 조상이 포함되어 있습니다ltree?

ltree [] <@ ltree부울

ltree @ ltree []부울

배열은의 후손이 포함되어 있습니다ltree?

ltree [] ~ LQuery부울

LQuery ~ ltree []부울

배열은 모든 경로 롤 토토를 포함합니다LQuery?

ltree [] ? lQuery []부울

lQuery [] ? ltree []부울

doltree배열이 롤 토토하는 경로를 포함합니다LQuery?

ltree [] @ ltxtQuery부울

ltxtQuery @ ltree []부울

배열이 모든 경로 롤 토토가 포함되어 있습니까ltxtQuery?

ltree [] ?@ ltreeltree

조상 인 첫 번째 배열 항목을 반환합니다ltree또는NULL없음.

ltree [] ? <@ ltreeltree

후손 인 첫 번째 배열 항목을 반환합니다ltree또는NULL없음.

ltree [] ? ~ LQueryltree

롤 토토하는 첫 번째 배열 항목을 반환LQuery또는NULLIF NONE.

ltree [] ?@ ltxtQueryltree

롤 토토하는 첫 번째 배열 항목을 반환ltxtQuery또는NULL없음.


연산자<@, @, @~아날로그^<@, ^@, ^@, ^~, 인덱스를 사용하지 않는 것을 제외하고는 동일합니다. 테스트 목적으로 만 유용합니다.

가용 함수는에 표시됩니다.테이블 F.14.

표 F.14. ltree기능

function

설명

예제

Subltree(ltree, 시작 정수, END 정수) →ltree

reture subpathsltree위치에서시작위치END-1 (0에서 카운트).

subltree ( 'top.child1.child2', 1, 2)Child1

subpath(ltree, 오프셋 Integer, Len 정수) →ltree

reture subpaths를 반환합니다.ltree위치에서 시작오프셋, 길이Len. 만약에오프셋부정적이므로, 서브 포트는 경로 끝에서 멀리 떨어져 시작합니다. 만약에Len부정적이고 경로 끝에서 많은 레이블을 남겨 둡니다.

subpath ( 'top.child1.child2', 0, 2)top.child1

subpath(ltree, 오프셋 정수) →ltree

SubPaths의 반환ltree위치에서 시작오프셋, 경로 끝으로 확장. 만약에오프셋부정적입니다. Subpath는 경로 끝에서 멀리 떨어져 시작합니다.

subpath ( 'top.child1.child2', 1)child1.child2

nlevel(ltree) →Integer

경로에서 레이블 수를 반환합니다.

nlevel ( 'top.child1.child2')3

색인(a ltree, B ltree) →정수

첫 번째 발생 위치를 반환합니다Bina, 또는 -1 찾을 수없는 경우.

index ( '0.1.2.3.5.4.5.6.8.5.6.8', '5.6')6

색인(a ltree, B ltree, 오프셋 정수) →정수

첫 번째 발생 위치를 반환합니다Bina또는 -1을 찾을 수없는 경우. 검색은 위치에서 시작됩니다오프셋; 부정적인오프셋start-오프셋경로 끝의 레이블.

index ( '0.1.2.3.5.4.5.6.8.5.6.8', '5.6', -4)9

Text2ltree(텍스트) →ltree

캐스트텍스트toltree.

ltree2Text(ltree) →텍스트

캐스트ltreeto텍스트.

LCA(ltree[, ltree[, ...]]) →ltree

경로의 가장 긴 공통 조상을 계산합니다 (최대 8 개의 인수가 뒷받침됨)

LCA ( '1.2.3', '1.2.3.4.5.6')1.2

LCA(ltree []) →ltree

배열에서 경로의 가장 긴 공통 조상을 계산합니다.

LCA (배열 [ '1.2.3':: ltree, '1.2.3.4'])1.2


F.23.3. 인덱스#

ltree표시된 연산자 속도를 높일 수있는 여러 유형의 인덱스를 지원합니다.

  • B-Tree Index overltree: <, <=, =, =,

  • Gist Index overltree(gist_ltree_opsopclass) :<, <=, =, =, , @, <@, @, ~, ?

    gist_ltree_opsgist opclass는 경로 레이블 세트를 비트 맵 서명으로 근사합니다. 선택적 정수 매개 변수Siglen시그니처 길이를 바이트로 결정합니다. 기본 서명 길이는 8 바이트입니다. 길이는 긍정적 인 배수이어야합니다.int정렬 (대부분의 기계에서 4 바이트)) 최대 2024 년까지. 더 긴 서명이 더 정확한 검색으로 이어집니다 (더 큰 인덱스의 비용으로 더 적은 부분을 스캔하고 더 적은 힙 페이지를 스캔).

    기본 서명 길이 8 바이트를 갖는 인덱스 생성 예 :

    GIST (PATH)를 사용하여 테스트에서 인덱스 PATH_GIST_IDX 생성;

    서명 길이가 100 바이트 인 인덱스 생성의 예 :

    GIST를 사용하여 테스트시 인덱스 PATH_GIST_IDX 작성 (PATH GIST_LTREE_OPS (SIGLEN = 100));
  • Gist Index overltree [](gist__ltree_opsopclass) :ltree [] <@ ltree, ltree @ ltree [], @, ~, ?

    gist__ltree_opsGist Opclass는와 유사하게 작동합니다.gist_ltree_ops그리고 서명 길이를 매개 변수로 취합니다. 의 기본값Sigleningist__ltree_opsis 28 바이트입니다.

    기본 서명 길이 28 바이트로 이러한 인덱스 생성 예 :

    GIST (array_path)를 사용하여 테스트에서 인덱스 PATH_GIST_IDX 생성;

    서명 길이 100 바이트를 가진 인덱스 생성 예 :

    GIST (array_path gist__ltree_ops (siglen = 100));를 사용하여 테스트시 인덱스 PATH_GIST_IDX 작성;

    참고 :이 인덱스 유형은 손실됩니다.

F.23.4. 예#

이 예제는 다음 데이터를 사용합니다 (파일에서도 사용 가능Contrib/ltree/ltreetest.sql소스 분포에서) :

테이블 테스트 생성 (Path Ltree);
테스트 값에 삽입 ( 'TOP');
테스트 값에 삽입 ( 'top.science');
테스트 값에 삽입 ( 'top.science.astronomy');
테스트 값에 삽입 ( 'top.science.astronomy.astrophysics');
테스트 값에 삽입 ( '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 (PATH)를 사용하여 테스트시 인덱스 PATH_GIST_IDX를 만듭니다.
btree (path);을 사용하여 테스트에서 색인 path_idx를 만듭니다.

이제 테이블이 있습니다테스트아래 표시된 계층을 설명하는 데이터가 채워져 있습니다.

상단
                     / |  \
             과학 취미 컬렉션
                 / |              \
        천문학 Amateurs_astronomy 사진
           / \ |
천체 물리학 우주론 천문학
                                        / |    \
                                 은하의 스타 우주 비행사

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

ltreetest = 경로 <@ 'top.science'가있는 테스트에서 경로를 선택합니다.
                길
---------------------------------------
 상위. 과학
 Top.science.astronomy
 Top.science.astronomy.astrophysics
 top.science.astronomy.cosmology
(4 줄)

경로 롤 토토의 몇 가지 예는 다음과 같습니다.

ltreetest = 경로 ~ '*.astronomy.*';
                     길
-------------------------------------------------------
 Top.science.astronomy
 Top.science.astronomy.astrophysics
 top.science.astronomy.cosmology
 Top.collections.pictures.astronomy
 top.collections.pictures.astronomy.stars
 top.collections.pictures.astronomy.galaxies
 Top.Collections.pictures.astronomy.astronauts
(7 줄)

ltreetest = 경로 ~ '*.! pictures@.astronomy.*';
                길
---------------------------------------
 Top.science.astronomy
 Top.science.astronomy.astrophysics
 top.science.astronomy.cosmology
(3 줄)

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

ltreetest = 경로 @ 'astro*% &! pictures @';
                길
---------------------------------------
 Top.science.astronomy
 Top.science.astronomy.astrophysics
 top.science.astronomy.cosmology
 top.hobbies.amateurs_astronomy
(4 줄)

ltreetest = path @ 'astro* &! pictures @';
                길
---------------------------------------
 Top.science.astronomy
 Top.science.astronomy.astrophysics
 top.science.astronomy.cosmology
(3 줄)

함수 사용 경로 구성 :

ltreetest = subpath (path, 0,2) || 'space'|| subpath (path, 2)는 path <@ 'top.science.astronomy';
                 ?열?
-----------------------------------------------
 Top.science.space.astronomy
 top.science.space.astronomy.astrophysics
 top.science.space.astronomy.cosmology
(3 줄)

경로에서 지정된 위치에 레이블을 삽입하는 SQL 함수를 만들어이를 단순화 할 수 있습니다.

함수 생성 INS_LABEL (ltree, int, 텍스트)은 ltree를 반환합니다
    AS 'SELECT SUBPATH ($ 1,0, $ 2) || $ 3 || Subpath ($ 1, $ 2); '
    언어 SQL 불변;

ltreetest = select <@ 'top.science.astronomy'에서 테스트에서 ins_label (Path, 2, 'Space');
                INS_LABEL
-----------------------------------------------
 Top.science.space.astronomy
 top.science.space.astronomy.astrophysics
 top.science.space.astronomy.cosmology
(3 줄)

F.23.5. 변환#

theltree_plpython3u확장 도구ltreepl/python의 입력. 함수를 만들 때 설치 및 지정된 경우ltree값은 Python 목록에 매핑됩니다. (그러나 그 반대는 현재 지원되지 않습니다.)

주의

변환 확장을 동일한 스키마에 설치하는 것이 좋습니다ltree. 그렇지 않으면 Transform Extension의 스키마에 적대적인 사용자가 정의한 개체가 포함 된 경우 설치 시간 보안 위험이 있습니다.

F.23.6. 저자#

모든 작업은 Teodor Sigaev (에 의해 수행되었습니다.) 및 Oleg Bartunov (). 보다http : //www.sai.msu.su/~megera/postgres/gist/추가 정보. 저자는 유용한 토론에 대해 Eugeny Rodichev에게 감사의 말씀을 전합니다. 의견과 버그 보고서를 환영합니다.

정정 제출

문서에 올바른 것이 없다면 롤 토토하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면