UNWIND#
리스트를 행으로 바꿉니다. 요소 하나마다 작업 행 하나입니다.
개요#
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
설명#
UNWIND는 리스트를 파이프라인으로 펼칩니다. 요소마다 행 하나를 내놓고 variable을 그 요소에
바인딩하며, 이미 유효 범위에 있던 나머지는 그대로 함께 이어집니다. collect()의 역이고, 리스트를
담은 한 행에서 그 조각들을 담은 여러 행으로 가는 방법입니다.
AS variable은 필수입니다. 이름 없는 형태는 없습니다.리스트는 리터럴, 리스트 값을 가진 속성,
collect()가 만든 변수, 또는 jsonb 배열이나 PostgreSQL 배열을 내놓는 표현식이면 됩니다. 스칼라는 거부됩니다.빈 리스트는 행을 내놓지 않으므로, 입력 행 전체가 사라집니다.
리스트 안의 null도 다른 요소와 같은 요소이고 행을 만듭니다.
UNWIND는 들어오는 행마다 한 번 실행되고, 내놓는 행은 곱해집니다. 입력 행 셋에 요소 둘인 리스트면 여섯 행입니다.UNWIND는 쿼리를 시작하거나 다른 절 뒤에 올 수 있습니다. 쿼리를 끝낼 수는 없습니다.리스트의 리스트를 펼치려면
UNWIND절 두 개를 겹쳐 쓰십시오.
FOR가 GQL의 대응 절이고 같은 일을 하며, 순번을 선택적으로 함께 줍니다.
매개변수#
- list_expression
jsonb 배열이나 PostgreSQL 배열을 내놓는 표현식입니다.
- variable
각 요소에 바인딩되는 이름입니다. 이 절 뒤의 모든 절에서 보입니다.
예제#
모든 예제는 예제 데이터셋에서 실행됩니다.
리스트 리터럴 펼치기#
UNWIND [1, 91, 203, 1, 7, 91] AS n
RETURN n;
n
-----
1
91
203
1
7
91
(6 rows)
리스트 순서대로 여섯 행이며, 중복도 포함됩니다.
리스트를 중복 제거하고 정렬하기#
리스트를 제자리에서 DISTINCT 처리하는 방법은 없습니다. 그것을 펼치고, 행의 중복을 없애고, 다시
모으십시오:
UNWIND [1, 91, 203, 1, 7, 91] AS n
WITH DISTINCT n
ORDER BY n
RETURN collect(n) AS uniq;
uniq
-----------------
[1, 7, 91, 203]
(1 row)
리스트로 MATCH를 돌리기#
요소마다 행 하나이고, 각각 차례로 일치됩니다:
UNWIND ['The Matrix', 'Inception'] AS t
MATCH (m:movie {title: t})
RETURN m.title AS film, m.year AS year;
film | year
--------------+------
"The Matrix" | 1999
"Inception" | 2010
(2 rows)
클라이언트가 준 키 목록에 대해 쿼리를 실행하는 흔한 방법이 이것이며, 그 목록은 매개변수 하나로 넘깁니다.
리스트 값을 가진 속성 펼치기#
속성이 리스트를 담을 수 있고, UNWIND가 그것을 엽니다:
MATCH (m:movie {title: 'The Matrix'})
UNWIND m.embedding AS component
RETURN component;
component
-------------
-0.07594558
0.04081754
0.29592122
-0.11921061
(4 rows)
collect 되돌리기#
collect()는 행을 리스트로 접고, UNWIND는 그것을 다시 펼칩니다. 집계한 다음 행으로 돌아가는
방법이 이 짝입니다:
MATCH (p:person)-[:acted_in]->(m:movie)
WITH collect(DISTINCT m.genre) AS genres
UNWIND genres AS genre
RETURN genre
ORDER BY genre;
genre
-------------
"Action"
"Adventure"
"Sci-Fi"
(3 rows)
리스트의 리스트 펼치기#
UNWIND 절 두 개이고, 두 번째는 첫 번째가 바인딩한 변수를 대상으로 합니다:
UNWIND [[1, 2], [3]] AS pair
UNWIND pair AS x
RETURN pair, x;
pair | x
--------+---
[1, 2] | 1
[1, 2] | 2
[3] | 3
(3 rows)
빈 리스트 펼치기#
행이 하나도 나오지 않고, 입력 행도 함께 사라집니다:
UNWIND [] AS x RETURN x;
x
---
(0 rows)
빈 리스트에서도 행이 살아남아야 한다면 OPTIONAL MATCH나 CASE 보호 장치를
쓰십시오.
null을 남기기#
null인 요소도 요소입니다:
UNWIND [1, NULL, 3] AS x RETURN x;
x
------
1
null
3
(3 rows)
값이 null로 출력되는 것은 출력 컬럼이 jsonb이고, jsonb의 null은 없는 것이 아니라 하나의 값이기
때문입니다.
참고#
UNWIND에는 리스트가 필요합니다. 스칼라도, NULL만 쓴 것도 요소 하나짜리나 요소 없는 리스트로
취급되지 않습니다:
UNWIND 3 AS x RETURN x;
ERROR: expression must be jsonb or array, but integer
LINE 1: UNWIND 3 AS x RETURN x;
^
UNWIND NULL AS x RETURN x;
ERROR: expression must be jsonb or array, but unknown
LINE 1: UNWIND NULL AS x RETURN x;
^
속성이 반드시 있다고 보장되지 않는다면, UNWIND coalesce(m.tags, []) AS tag처럼 리스트가 아닐 수
있는 값을 감싸십시오.
호환성#
UNWIND는 GQL 절이 아니다#
ISO/IEC 39075에는 UNWIND가 없습니다. 리스트를 펼치는 표준의 문장은 <for statement>(§14.8)이고,
AgensGraph는 그것도 FOR로 구현하고 있습니다. FOR에는 각 요소에 0부터 시작하는 위치를
주는 WITH OFFSET 절이 있는데, UNWIND는 그것을 할 수 없습니다.