{#list-list-functions} # 리스트 함수 리스트와 맵에 대한 함수들입니다. Cypher의 리스트는 `jsonb` 배열이므로, 이 함수들은 `jsonb`를 받고 `jsonb`를 반환합니다. 그래프 요소에 대한 `collect()`는 그 대신 네이티브 배열을 만들고, 배열 오버로드가 있는 함수는 둘 다에서 동작합니다. Cypher는 리스트의 첨자를 0부터 세고, 슬라이스 `list[a..b]`는 상한을 포함하지 않습니다. 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다. {#list-array_size} ## array_size ``` array_size ( list jsonb ) -> integer array_size ( list json ) -> integer array_size ( list anyarray ) -> integer ``` 배열의 요소 개수를 반환합니다. **고려할 점** - 배열만 받습니다. [`cardinality`](#list-cardinality)와 달리 맵의 키는 세지 않습니다. - 오버로드 세 개가 있어서 같은 이름이 Cypher 리스트, `json` 값, PostgreSQL 배열에서 모두 동작합니다. ```cypher RETURN array_size([1,2,3]) AS n; ``` ``` n --- 3 ``` {#list-cardinality} ## cardinality {bdg-secondary-line}`2.18에 추가` ``` cardinality ( value jsonb ) -> jsonb cardinality ( p graphpath ) -> jsonb ``` 리스트의 요소 수, 맵의 항목 수, 또는 경로의 정점과 간선 수를 반환합니다. **고려할 점** - 문자열은 거부됩니다. 문자열에는 [`length`](#scalar-length)를 쓰십시오. ```cypher RETURN cardinality('abc'); ``` ``` ERROR: cardinality(): list or map is expected but "abc" ``` - 경로에 대해서는 정점*과* 간선을 함께 세므로, 간선 하나인 경로는 3을 주고 같은 경로에 대한 [`length`](#path-length)는 1을 줍니다. - PostgreSQL 자신의 `cardinality(anyarray)`도 네이티브 배열에 그대로 적용되며, `jsonb`가 아니라 `integer`를 반환합니다. ```cypher RETURN cardinality([1,2,3]) AS list, cardinality({a:1,b:2}) AS map; ``` ``` list | map ------+----- 3 | 2 ``` ```cypher MATCH p=(:person {name:'Christopher Nolan'})-[:directed]->(:movie {title:'Inception'}) RETURN cardinality(p) AS elements; ``` ``` elements ---------- 3 ``` {#list-head} ## head ``` head ( list jsonb ) -> jsonb head ( list anyarray ) -> anyelement ``` 리스트의 첫 요소를 반환합니다. **고려할 점** - 빈 리스트는 오류를 내지 않고 null을 반환합니다. - 배열 오버로드는 요소 자신의 타입을 반환하므로, 정점에 대한 `head(collect(n))`은 `vertex`를 반환합니다. ```cypher RETURN head([10,20,30]) AS first, last([10,20,30]) AS final, tail([10,20,30]) AS rest; ``` ``` first | final | rest -------+-------+---------- 10 | 30 | [20, 30] ``` {#list-keys} ## keys ``` keys ( map jsonb ) -> jsonb ``` 맵의 키 이름 목록, 또는 그래프 요소의 속성 이름 목록을 반환합니다. **고려할 점** - 순서는 `jsonb` 자신의 키 순서입니다. 키 길이순, 그다음 바이트순입니다. 삽입 순서도, 알파벳 순서도 아닙니다. 고정된 순서가 필요하면 결과를 정렬하십시오. - 정점이나 간선을 인자로 줄 수 있습니다. 그것이 자기 속성 맵으로 변환되기 때문입니다. ```cypher MATCH (p:person {name:'Keanu Reeves'}) RETURN keys(p) AS property_names; ``` ``` property_names ------------------ ["born", "name"] ``` ```cypher RETURN keys({title:'Inception', year:2010}) AS map_keys; ``` ``` map_keys ------------------- ["year", "title"] ``` {#list-last} ## last ``` last ( list jsonb ) -> jsonb last ( list anyarray ) -> anyelement ``` 리스트의 마지막 요소를 반환합니다. 빈 리스트는 null을 반환합니다. 실제 예제는 [`head`](#list-head)를 참고하십시오. {#list-range} ## range ``` range ( start integer, stop integer ) -> jsonb range ( start integer, stop integer, step integer ) -> jsonb ``` `start`부터 `stop`까지의 정수 목록을 반환하며, 양 끝을 포함합니다. | 이름 | 타입 | 설명 | | --- | --- | --- | | `start` | `integer` | 목록의 첫 값입니다. | | `stop` | `integer` | 목록이 도달할 수 있는 마지막 값입니다. 걸음이 그 값에 떨어질 때 포함됩니다. | | `step` | `integer` | 증가량입니다. 생략하면 올라갈 때는 1, 내려갈 때는 −1입니다. | **고려할 점** - 결과는 PostgreSQL 배열이 아니라 `jsonb`이므로, 다른 Cypher 리스트와 마찬가지로 첨자를 붙이고 훑을 수 있습니다. - 양 끝이 포함됩니다. `stop`은 걸음이 그 값에 떨어질 때만 목록에 나타납니다. `range(1,10,3)`은 10에서 끝나지만 `range(1,9,3)`은 7에서 끝납니다. - `stop`이 `start`보다 작으면 음수 걸음 없이도 내려가며 셉니다. ```cypher RETURN range(1,5) AS up, range(1,10,3) AS step, range(5,1) AS down, range(5,1,-2) AS down_step; ``` ``` up | step | down | down_step -----------------+---------------+-----------------+----------- [1, 2, 3, 4, 5] | [1, 4, 7, 10] | [5, 4, 3, 2, 1] | [5, 3, 1] ``` {#list-tail} ## tail ``` tail ( list jsonb ) -> jsonb tail ( list anyarray ) -> anyarray ``` 리스트의 첫 요소를 뺀 나머지 전부를 반환합니다. **고려할 점** - `head`와 `last`와 달리, 빈 리스트는 null이 아니라 빈 리스트를 반환합니다. ```cypher RETURN head([]) AS first, tail([]) AS rest; ``` ``` first | rest -------+------ | [] ``` {#list-unnest} ## unnest {bdg-secondary-line}`2.18에 추가` ``` unnest ( from_json jsonb ) -> setof jsonb ``` 리스트를 요소마다 한 행으로 펼칩니다. **고려할 점** - 집합 반환 함수입니다. Cypher에서는 자기가 놓인 절의 행을 곱합니다. `FOR x IN list`가 같은 생각의 절 형태이고, 요소를 이름에 바인딩해야 할 때는 그쪽이 읽기 쉽습니다. - 출력 컬럼의 이름은 `value`이므로, SQL에서는 `SELECT value FROM unnest(...)`로 씁니다. - PostgreSQL의 `unnest(anyarray)`도 네이티브 배열에 그대로 적용됩니다. ```cypher MATCH (m:movie {title:'The Matrix'}) RETURN unnest(m.embedding) AS component; ``` ``` component ------------- -0.07594558 0.04081754 0.29592122 -0.11921061 ``` {#list-reversing-and-splitting} ## 뒤집기와 쪼개기 리스트를 내놓는 함수 두 개는 그것이 나온 문자열 쪽에 문서화돼 있습니다. 문자열뿐 아니라 리스트도 뒤집는 [`reverse`](#string-reverse), 그리고 문자열을 리스트로 자르는 [`split`](#string-split)입니다. 리스트 타입의 변환 세 가지는 타입 변환 페이지에 있습니다. [`toStringList`](#type-conversion-tostringlist), [`toIntegerList`](#type-conversion-tointegerlist), [`toFloatList`](#type-conversion-tofloatlist)입니다. {#list-compatibility} ## 호환성 {#list-opencypher} ### openCypher 여기서 `range()`는 openCypher에서와 마찬가지로 `stop`을 포함합니다. openCypher의 `reduce()`는 지원되지 않습니다. 리스트 컴프리헨션이나 `FOR`를 쓰십시오. 패턴 컴프리헨션은 지원되지 않습니다. {#list-see-also} ## 관련 항목 - [모든 함수](all-functions.md) — 모든 함수를 한 표에 - [집계 함수](aggregate.md) — 리스트를 만드는 `collect` - [조건 함수](predicate.md) — `all`, `any`, `none`, `single`, `isEmpty` - [jsonb 연산자와 함수](jsonb.md) — 리스트 아래에 있는 연산자들