패턴은 하나이상의 노드 or 엣지의 조합으로 나타내며 패턴을 어떻게 작성하는지는 그래프에서 매우 중요한 부분이다.
노드(Node)
노드는 괄호()를 이용하여 표현하며 레이블(vlabel), 속성(property), 변수(variable)을 이용하여 더욱 구체화 할 수 있다.
1. 기본 노드 패턴
()
괄호 안에 레이블, 속성 등을 표기하지 않는 패턴은 모든 노드를 의미한다.
2. 레이블(vlabel) 추가 노드 패턴
(:person)
노드에 레이블을 표현하고자하면 괄호 안에 (:vlabel_name)으로 표기한다. 위의 예는 person이라는 vlabel을 갖고 있는 노드를 의미한다.
3. 변수(variable) 추가 노드 패턴
(v) (var) (v:person)
노드에 변수(variable)을 부여하고자 한다면 (variable_name)으로 표기한다. 변수는 알파벳(a~z), 숫자(0~9), 언더바(_)의 조합으로 명명할 수 있다.(숫자로 시작 x) 노드에 변수와 레이블을 동시에 나타내고자 할 때는 (variable_name:vlabel_name)으로 표기한다.
노드와 엣지 각각의 패턴 표현과 마찬가지로 노드&엣지 패턴에서도 레이블, 변수, 속성을 추가하여 패턴을 구체화할 수 있다.
3. 패턴 전체에 변수(variable) 추가 노드&엣지 패턴
p = (:person)-[:knows]->(:person)
변수는 노드와 엣지 각각에도 부여할 수 있지만 패턴 전체를 대상으로도 부여할 수 있다. 패턴 전체에 변수를 부여하고자 한다면 =를 이용한다. 위 예제에서 p는 변수(variable)이고, =을 이용하여 패턴 전체를 대상으로 변수를 적용하였다.
Path
패턴 내에서 노드와 엣지의 개수는 지속적으로 증가할 수 있다. 이러한 과정에서 패턴 내 일련 경로의 단위를 path라고 한다.
(a)-[]->( )-[]->(c) (a)-[*2]->(c)
(a)-[]->( )-[]->( )-[]->(d) (a)-[*3]->(d)
(a)-[]->( )-[]->( )-[]->( )-[]->(e) (a)-[*4]->(e)
길이가 긴 path의 경우, 가독성을 높이고 작성의 편의성을 위해 축약된 형태로 바꿀 수 있다. 노드 n개가 엣지를 n-1번 거쳐서 간다면 대괄호 내에 별표(*)와 함께 n-1을 표기하면 된다. 위의 첫번째 예제에서 a노드는 c노드까지 2번을거쳐 가므로 대괄호 안에 별표와 함께 2를 표기하여 표기하였다.
Flexible Length
패턴을 작성하다보면 상황에 따라 한 질의 내에서 거쳐야 하는 엣지의 수에 동적인 변화를 줘야하는 경우가 생길 수 있다.
이전에 적재한 그래프 정보에서 이름이 '박OO'인 사람의 나이와 '박OO'이 '이OO'에게 남긴 좋아요 수 속성 값을 새로 설정해보록 한다.
속성 값을 수정하는 질의는 다음과 같다.
MATCH (v:n_user{name:'박OO'})-[r:e_follow{like:0}]->(v2:n_user{name:'이OO'})
SET v.age = 31, r.like = 1;
우선 MATCH절로 '박OO'와 '이OO'의 관계를 나타내는 패턴을 표기하여 원하는 그래프를 찾는다. 그리고 SET절을 이용하여 변수v에 해당하는 사용자 '박OO'의 나이 속성 값을 31로 변수 r에 해당하는 '박OO'과 '이OO' 팔로우 관계의좋아요 수속성 값을 1로 변경한다.
쿼리의 결과는 다음과 같다.
쿼리를 실행하면 'UPDATE 2' 알림을 통해 속성 값 두가지가 업데이트 됨을 알 수 있다.
이제 새로 설정한 속성 값이 잘 변경이 되었는지 조회를 통해 확인하도록 한다.
MATCH (v:n_user{name:'박OO'})-[r:e_follow]->(v2:n_user{name:'이OO'})
RETURN *;
마찬가지로 MATCH절을 통해 '박OO'와 '이OO'의 관계를 나타내는 패턴을 표기하여 원하는 그래프를 찾고, RETURN절을 통해 모든 속성 값들을 조회하여 새로 설정한 값들이 잘 변경되었는지 확인한다.
조회의 쿼리를 실행한 결과는 다음과 같다.
위의 결과를 통해 사용자 '박OO'의 나이가 31, '박OO'이 '이OO'에게 남긴 좋아요 수가 1로 변경이 된것을 확인할 수 있다.
이것으로 이번 포스팅에서는 Cypher를 이용하여 그래프를 수정하는 방법을 알아보았다.
다음 포스팅에서는 이전의 포스팅들에서 많이 언급이 되었던 그래프를 표현하는 방법, 패턴에대해 알아보도록한다.
CREATE절은노드&엣지를생성하는 명령이며 생성할 노드 혹은 엣지를 패턴으로 작성하여 사용한다. 패턴을 표현하는 방법에 대해서는 다음의 포스팅을 참고하도록 한다.
노드&엣지 제거하기(DELETE Node&Edge)
노드와 엣지를 만들었으니 이제 삭제하는 방법에 대해 알아본다.
노드와 엣지를 삭제하는 쿼리는 다음과 같다.
-- Delete Node
MATCH (v:vlabel_name {property:'property_name'})
DELETE v;
-- Delete Edge
MATCH (v:vlabel_name {property:'property_name'})-[r:elabel_name]->(v2:vlabel_name {property:'property_name2'})
DELETE l;
DELETE절은 노드 or 엣지를 제거하는 절이며MATCH절을 통해 제거하고자 하는 노드 or 엣지를 찾고 DELETE절에 variable을 표기하여 해당 노드 or 엣지를 제거한다. 단, 제거하려는 노드가 다른 노드와 엣지로 연결되어 있다면 해당 엣지를 먼저 제거해야 노드가 제거된다.
예시
이전 포스팅에서 GDB 설명 포스팅의 예시 그래프를 이용하여 sns_network라는 이름의 그래프를 만들고, n_user, e_follow라는 레이블을 생성했다. 다음으로각 노드와 엣지를 생성해야 한다.
위의 그래프에서노드의 정보는사용자 정보이고엣지의 정보는팔로우 정보이므로 사용자 정보 테이블을 이용하여 노드를 생성하고 팔로우 정보 테이블을 이용하여 엣지를 생성한다.
엣지를 생성할 때 CREATE절만 사용하면 row마다 새로운 노드와 엣지가 생성되므로 노드가 중복이 되어 생성된다. 따라서, MATCH절을 이용하여 엣지를 생성할 노드들을 정해준 후 엣지를 생성해야 한다.
노드와 엣지를 한번에 생성한 쿼리를 실행한 결과는 다음과 같다.
작성한 쿼리를 선택한 후 1번의 실행 버튼을 누르면 밑에 쿼리가 성공적으로 실행됨을 알려주고, 다음으로 노드와 엣지의 데이터의 수 count_rows를 선택하면 데이터가 생성된 것을 알 수 있다.
지금까지 사용자 정보 테이블을 이용하여 노드, 팔로우 정보 테이블을 이용하여 엣지를 생성하였다.
이를 DELETE절을 이용하여 제거해주도록 한다.
-- Delete Edge
MATCH (v:n_user{name:'김OO'})-[r:e_follow{like:3}]->(v2:n_user{name:'이OO'})
DELETE r;
MATCH (v:n_user{name:'이OO'})-[r:e_follow{like:2}]->(v2:n_user{name:'김OO'})
DELETE r;
MATCH (v:n_user{name:'박OO'})-[r:e_follow{like:0}]->(v2:n_user{name:'이OO'})
DELETE r;
-- Delete Node
MATCH (v:n_user{name:'김OO'})
DELETE v;
MATCH (v:n_user{name:'이OO'})
DELETE v;
MATCH (v:n_user{name:'박OO'})
DELETE v;
위에서 설명한바와 같이 제거하려는 노드가 다른 노드와 엣지로 연결되어 있다면 해당 엣지를 먼저 제거해야 노드가 제거되므로 엣지를 먼저 제거한 후 노드를 제거한다.
노드와 엣지를 제거하는 쿼리를 실행한 결과는 다음과 같다.
작성한 쿼리를 선택하여 1번 버튼으로 실행하면 아래의 메시지를 통해 노드와 엣지가 제거된 것을 알 수 있고, 2번을 통해 노드와 엣지의 데이터의 수 count_rows를 선택하면 데이터가 제거된 것을 알 수 있다.
이것으로 이번 포스팅에서는Cypher를 이용하여 노드와 엣지를 생성하고 제거하는 방법을 알아보았다.
다음 포스팅에서는 그래프 질의를 통해 데이터를 조회하는 방법을 다뤄보며 이번시간에 적재한 데이터가 잘 적재되었는지도 확인 해보도록 한다.