SET#
GQL 절
쿼리가 바인딩한 정점과 간선의 속성을 바꿉니다.
개요#
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
설명#
SET은 앞선 절이 이미 바인딩한 요소에 속성을 씁니다. 그 효과는 연산자 왼쪽에 무엇이 있는지, 그리고
어느 연산자를 쓰는지에 달려 있습니다:
적는 방식 |
효과 |
|---|---|
|
속성 하나를 설정하고, 그 키가 없으면 추가합니다. |
|
그 키를 지웁니다. |
|
|
|
|
|
맵을 |
하나의
SET안의 할당은 쉼표로 구분하며 왼쪽에서 오른쪽으로 적용됩니다.SET은 들어오는 행마다 한 번 실행되므로, 정점 10개를 찾는MATCH는 그 10개를 갱신합니다.SET에는 바인딩된 변수가 필요합니다. 변수를 도입할 수 없고, 쿼리를 시작할 수도 없습니다. 항상MATCH,MERGE, 또는 무언가를 바인딩하는 다른 절 뒤에 옵니다.SET은 쿼리를 끝낼 수 있습니다. 결과를 보려면RETURN을 붙이십시오.SET은 속성만 씁니다. 레이블을 추가하거나 바꿀 수 없습니다.MERGE의ON CREATE SET과ON MATCH SET도 이와 같은 할당 구문을 받습니다.
매개변수#
- target
속성 참조인
variable.key이며variable.key.subkey처럼 중첩할 수도 있습니다. 또는properties전체를 교체하거나 병합할 때 쓰는 요소 변수 자체입니다.- expression
저장할 값입니다. Cypher 표현식이면 무엇이든 됩니다. 리터럴, 다른 요소의 속성, 산술 표현식이나
CASE표현식, 리스트, 맵이 그렇습니다.+=와, 변수 자체에 대한=의 경우에는 맵이거나 다른 그래프 요소여야 합니다.
예제#
모든 예제는 예제 데이터셋에서 실행됩니다. The last example undoes them.
속성 하나 설정하기#
CREATE (:movie {title: 'Tenet', year: 2020, genre: 'Action'});
UPDATE 1
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이 무엇을 했는지 보는 가장 쉬운 방법입니다.
한 절에서 여러 속성 설정하기#
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)
NULL로 속성 지우기#
null을 할당하면 null이 저장되는 것이 아니라 그 키가 지워집니다:
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가 같은 것을 더 분명하게 표현합니다.
+= 로 맵 병합하기#
+=는 맵에 적힌 키를 설정하고 나머지는 그대로 둡니다:
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)
= 로 properties 전체 교체하기#
변수 자체에 쓴 =는 맵에 없는 모든 것을 버립니다. genre, runtime, imax가 사라졌습니다:
MATCH (m:movie {title: 'Tenet'})
SET m = {title: 'Tenet', year: 2020}
RETURN properties(m) AS props;
props
----------------------------------
{"year": 2020, "title": "Tenet"}
(1 row)
이것이 두 연산자의 차이이고 조심해야 할 지점입니다. =는 교체이고 +=는 갱신입니다.
한 요소의 속성을 다른 요소로 복사하기#
오른쪽에 다른 요소를 둘 수 있고, 그러면 그 properties 전체가 복사됩니다:
CREATE (:person {name: 'Stand-in'});
UPDATE 1
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인 정점이 둘입니다:
MATCH (p:person {name: 'Keanu Reeves'}) RETURN count(*) AS keanus;
keanus
--------
2
(1 row)
properties를 복사하면 식별에 쓰이는 속성까지 복사됩니다. 간선은 복사되지 않고, 두 정점이 병합되지도
않습니다.
간선에 속성 설정하기#
간선은 정점과 똑같이 속성을 받습니다:
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)
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에게 속한 간선 하나를 찾습니다. 위에서 만든 복사본에는 간선이 없기
때문입니다.
properties 비우기#
빈 맵은 모든 속성을 지우고 요소는 그 자리에 남깁니다:
MATCH (m:movie {title: 'Tenet'})
SET m = {}
RETURN properties(m) AS props;
props
-------
{}
(1 row)
이제 그 정점에는 어떤 속성으로도 닿을 수 없습니다. 그래서 아래 정리 작업은 Tenet을 찾는 대신
title이 없는 것을 찾습니다.
예제 되돌리기#
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
참고#
기본 설정인 allow_null_properties = off은 SET n.key = NULL을 삭제로 만듭니다. 그것을 켜면
그 키가 JSON null 값과 함께 남습니다:
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)
SET allow_null_properties = false;
MATCH (m:movie {title: 'Tenet'}) DETACH DELETE m;
SET
UPDATE 1
저장된 null은 없는 키와 같지 않습니다. m.runtime IS NULL은 어느 쪽이든 참이지만, 그 키는
properties()와 jsonb 키 검사에 나타납니다.
호환성#
레이블 설정 (ISO/IEC 39075 §13.3)#
표준의 <set label item>은 요소에 레이블을 추가하며, SET n:blockbuster 또는
SET n IS blockbuster로 씁니다. AgensGraph는 둘 다 받지 않습니다:
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...
^
요소의 레이블은 그 요소가 사는 테이블이므로, 요소를 만들 때 정해집니다. 정점을 다른 레이블로 옮기려면 그쪽에 새로 만들고 원본을 지우십시오.