{#set-set} # SET {bdg-primary-line}`GQL 절` 쿼리가 바인딩한 정점과 간선의 속성을 바꿉니다. {#set-synopsis} ## 개요
SET { target = expression | target += expression } [, ...]

굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.

{#set-description} ## 설명 `SET`은 앞선 절이 이미 바인딩한 요소에 속성을 씁니다. 그 효과는 연산자 왼쪽에 무엇이 있는지, 그리고 어느 연산자를 쓰는지에 달려 있습니다: | 적는 방식 | 효과 | | --- | --- | | `n.key = expression` | 속성 하나를 설정하고, 그 키가 없으면 추가합니다. | | `n.key = NULL` | 그 키를 지웁니다. | | `n = {…}` | `properties` 전체를 그 맵으로 **교체합니다.** 맵에 없는 키는 사라집니다. | | `n = other` | `n`의 `properties`를 `other`의 것으로 교체합니다. | | `n += {…}` | 맵을 `properties`에 **병합합니다.** 적은 키는 설정되고 나머지는 유지됩니다. | - 하나의 `SET` 안의 할당은 쉼표로 구분하며 왼쪽에서 오른쪽으로 적용됩니다. - `SET`은 들어오는 행마다 한 번 실행되므로, 정점 10개를 찾는 `MATCH`는 그 10개를 갱신합니다. - `SET`에는 바인딩된 변수가 필요합니다. 변수를 도입할 수 없고, 쿼리를 시작할 수도 없습니다. 항상 `MATCH`, `MERGE`, 또는 무언가를 바인딩하는 다른 절 뒤에 옵니다. - `SET`은 쿼리를 끝낼 수 있습니다. 결과를 보려면 [`RETURN`](return.md)을 붙이십시오. - `SET`은 속성만 씁니다. 레이블을 추가하거나 바꿀 수 없습니다. - [`MERGE`](merge.md)의 `ON CREATE SET`과 `ON MATCH SET`도 이와 같은 할당 구문을 받습니다. {#set-parameters} ## 매개변수 target : 속성 참조인 `variable.key`이며 `variable.key.subkey`처럼 중첩할 수도 있습니다. 또는 `properties` 전체를 교체하거나 병합할 때 쓰는 요소 변수 자체입니다. expression : 저장할 값입니다. Cypher 표현식이면 무엇이든 됩니다. 리터럴, 다른 요소의 속성, 산술 표현식이나 `CASE` 표현식, 리스트, 맵이 그렇습니다. `+=`와, 변수 자체에 대한 `=`의 경우에는 맵이거나 다른 그래프 요소여야 합니다. {#set-examples} ## 예제 모든 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다. The last example undoes them. {#set-set-one-property} ### 속성 하나 설정하기 ```cypher CREATE (:movie {title: 'Tenet', year: 2020, genre: 'Action'}); ``` ``` UPDATE 1 ``` ```cypher MATCH (m:movie {title: 'Tenet'}) SET m.runtime = 150 RETURN properties(m) AS props; ``` ``` props --------------------------------------------------------------------- {"year": 2020, "genre": "Action", "title": "Tenet", "runtime": 150} (1 row) ``` `properties()`는 `properties` 전체를 반환하며, `SET`이 무엇을 했는지 보는 가장 쉬운 방법입니다. {#set-set-several-properties-in-one-clause} ### 한 절에서 여러 속성 설정하기 ```cypher MATCH (m:movie {title: 'Tenet'}) SET m.genre = 'Sci-Fi', m.runtime = 151 RETURN properties(m) AS props; ``` ``` props --------------------------------------------------------------------- {"year": 2020, "genre": "Sci-Fi", "title": "Tenet", "runtime": 151} (1 row) ``` {#set-remove-a-property-with-null} ### NULL로 속성 지우기 null을 할당하면 null이 저장되는 것이 아니라 그 키가 지워집니다: ```cypher MATCH (m:movie {title: 'Tenet'}) SET m.runtime = NULL RETURN properties(m) AS props; ``` ``` props ----------------------------------------------------- {"year": 2020, "genre": "Sci-Fi", "title": "Tenet"} (1 row) ``` [`REMOVE`](remove.md)가 같은 것을 더 분명하게 표현합니다. {#set-merge-a-map-with-} ### += 로 맵 병합하기 `+=`는 맵에 적힌 키를 설정하고 나머지는 그대로 둡니다: ```cypher MATCH (m:movie {title: 'Tenet'}) SET m += {runtime: 150, imax: true} RETURN properties(m) AS props; ``` ``` props ----------------------------------------------------------------------------------- {"imax": true, "year": 2020, "genre": "Sci-Fi", "title": "Tenet", "runtime": 150} (1 row) ``` {#set-replace-the-whole-bag-with-} ### = 로 `properties` 전체 교체하기 변수 자체에 쓴 `=`는 맵에 없는 모든 것을 버립니다. `genre`, `runtime`, `imax`가 사라졌습니다: ```cypher MATCH (m:movie {title: 'Tenet'}) SET m = {title: 'Tenet', year: 2020} RETURN properties(m) AS props; ``` ``` props ---------------------------------- {"year": 2020, "title": "Tenet"} (1 row) ``` 이것이 두 연산자의 차이이고 조심해야 할 지점입니다. `=`는 교체이고 `+=`는 갱신입니다. {#set-copy-one-elements-properties-to-another} ### 한 요소의 속성을 다른 요소로 복사하기 오른쪽에 다른 요소를 둘 수 있고, 그러면 그 `properties` 전체가 복사됩니다: ```cypher CREATE (:person {name: 'Stand-in'}); ``` ``` UPDATE 1 ``` ```cypher MATCH (p:person {name: 'Stand-in'}), (k:person {name: 'Keanu Reeves'}) SET p = k RETURN properties(p) AS props; ``` ``` props ---------------------------------------- {"born": 1964, "name": "Keanu Reeves"} (1 row) ``` 이제 `name`이 `Keanu Reeves`인 정점이 둘입니다: ```cypher MATCH (p:person {name: 'Keanu Reeves'}) RETURN count(*) AS keanus; ``` ``` keanus -------- 2 (1 row) ``` `properties`를 복사하면 식별에 쓰이는 속성까지 복사됩니다. 간선은 복사되지 않고, 두 정점이 병합되지도 않습니다. {#set-set-a-property-on-an-edge} ### 간선에 속성 설정하기 간선은 정점과 똑같이 속성을 받습니다: ```cypher MATCH (:person {name: 'Keanu Reeves'})-[r:acted_in]->(:movie {title: 'The Matrix'}) SET r.credited = true RETURN properties(r) AS props; ``` ``` props ----------------------------------- {"role": "Neo", "credited": true} (1 row) ``` ```cypher MATCH (:person {name: 'Keanu Reeves'})-[r:acted_in]->(:movie {title: 'The Matrix'}) SET r.credited = NULL RETURN properties(r) AS props; ``` ``` props ----------------- {"role": "Neo"} (1 row) ``` 이 `MATCH`는 원래 Keanu Reeves에게 속한 간선 하나를 찾습니다. 위에서 만든 복사본에는 간선이 없기 때문입니다. {#set-empty-a-bag} ### `properties` 비우기 빈 맵은 모든 속성을 지우고 요소는 그 자리에 남깁니다: ```cypher MATCH (m:movie {title: 'Tenet'}) SET m = {} RETURN properties(m) AS props; ``` ``` props ------- {} (1 row) ``` 이제 그 정점에는 어떤 속성으로도 닿을 수 없습니다. 그래서 아래 정리 작업은 `Tenet`을 찾는 대신 `title`이 없는 것을 찾습니다. {#set-undo-the-examples} ### 예제 되돌리기 ```cypher MATCH (m:movie) WHERE m.title IS NULL DETACH DELETE m; MATCH (p:person) WHERE p.name = 'Keanu Reeves' AND NOT EXISTS { MATCH (p)-[]->() } DETACH DELETE p; ``` ``` UPDATE 1 UPDATE 1 ``` {#set-notes} ## 참고 기본 설정인 `allow_null_properties = off`은 `SET n.key = NULL`을 삭제로 만듭니다. 그것을 켜면 그 키가 JSON null 값과 함께 남습니다: ```cypher SET allow_null_properties = true; CREATE (m:movie {title: 'Tenet', year: 2020}) SET m.runtime = NULL RETURN properties(m) AS props; ``` ``` SET props --------------------------------------------------- {"year": 2020, "title": "Tenet", "runtime": null} (1 row) ``` ```cypher SET allow_null_properties = false; MATCH (m:movie {title: 'Tenet'}) DETACH DELETE m; ``` ``` SET UPDATE 1 ``` 저장된 null은 없는 키와 같지 않습니다. `m.runtime IS NULL`은 어느 쪽이든 참이지만, 그 키는 `properties()`와 `jsonb` 키 검사에 나타납니다. {#set-compatibility} ## 호환성 {#set-setting-a-label-isoiec-39075-133} ### 레이블 설정 (ISO/IEC 39075 §13.3) 표준의 ``은 요소에 레이블을 추가하며, `SET n:blockbuster` 또는 `SET n IS blockbuster`로 씁니다. AgensGraph는 둘 다 받지 않습니다: ```cypher MATCH (m:movie {title: 'Inception'}) SET m:blockbuster RETURN m.title; ``` ``` ERROR: syntax error at or near ":" LINE 1: MATCH (m:movie {title: 'Inception'}) SET m:blockbuster RETUR... ^ ``` 요소의 레이블은 그 요소가 사는 테이블이므로, 요소를 만들 때 정해집니다. 정점을 다른 레이블로 옮기려면 그쪽에 새로 만들고 원본을 지우십시오. {#set-see-also} ## 관련 항목 - [`REMOVE`](remove.md) — 이름으로 속성 지우기 - [`MERGE`](merge.md) — `ON CREATE SET`과 `ON MATCH SET` - [`MATCH`](match.md) — `SET`이 쓸 요소를 바인딩하기 - [`DELETE`](delete.md) — 속성이 아니라 요소를 지우기