코드짜는 노인네

[Neo4j] 중복없이 노드, 관계를 생성해주는 Merge 쿼리문 본문

코딩 학습/Neo4j

[Neo4j] 중복없이 노드, 관계를 생성해주는 Merge 쿼리문

ikohong 2022. 9. 11. 09:51
728x90
반응형

[Neo4j] 중복없이 노드, 관계를 생성해주는 Merge 쿼리문


Neo4j를 처음 접하게 되었을때는, match, create, delete 기능만 사용했습니다. 특히, 노드를 생성할때는 기존에 저장되어있는 노드를 또 다시 생성하는 상황이 많이 발생하고, 신경써야될 부분이 많았습니다. 이럴경우, 'merge' 쿼리문을 사용하게 되면, 중복되는 노드 생성을 막아주는 역할을 합니다.


merge VS create


create

앞에서 언급했듯이, merge는 중복되는 노드 생성을 막아주는 역할을 하게 됩니다. 즉, 기존에 있는 노드의 레이블과 속성이 같다면, 노드는 생성되지 않습니다.

create (p:Person {name:"kim"})

 

일단 'Person'이라는 레이블에 name 속성에 'kim'이라는 속성값을 가진 노드를 생성하였습니다. 그리고 위의 코드를 다시한번 입력을 하면, 똑같은 레이블과 속성을 가진 노드가 생성이 됩니다.

merge

merge는 create랑 다르게 중복된 노드가 있을경우 생성을 하지 않습니다.

merge (p:Person {name:"kim"})

즉, 특정 속성값을 가지고 있는 노드를 하나만 DB에 저장을 해야될 경우, merge를 사용하면 됩니다.

또 다른 차이점이라고 하면, 관계를 생성할때의 차이입니다. create의 경우 관계를 가지고 있는 노드를 생성할 경우에 무조건 화살표가 들어가줘야합니다.

// 생성 실패
create (p:Person {name:"sung"})-[o:OWNS {count:1}]-(c:Computer {name:"MacBook"})

그러나, merge의 경우 화살표를 가질 필요없이 생성이 가능하며, 앞에 노드에서 뒤의 노드 방향으로 관게가 생성됩니다.

merge (p:Person {name:"sung"})-[o:OWNS {count:1}]-(c:Computer {name:"MacBook"})

 

반응형

merge를 이용한 관계 생성


이번에는 merge를 이용하여서 관계를 생성해보겠습니다. 위에서 생성한 노드는 유지한 상태로 아래의 코드를 실행해보겠습니다.

merge (p:Person {name:"kim"})-[o:OWNS {count:2}]-(c:Computer {name:"XNOTE"})

merge를 이용하여서 관계를 가지고 있는 노드를 생성하였습니다. 그런데, 결과를 보면, 2개의 노드가 생성되었습니다. 이론상, Person 레이블에 있는 name 속성에 'kim'이라는 속성값을 가진 노드를 생성하면, 안되지만, 정상적으로 생성되었습니다.

Person 레이블을 가진 노드를 찾아보면, 이전에 생성되어있던 노드는 따로 있으며, 새로운 관계가 생성된 모습을 볼 수 있습니다. 즉, 'kim'을 가진 노드를 생성하는것이 아닌, 'kim'이라는 노드에 'XNOTE'와 관계를 가지는 노드를 생성하는것으로, 새로 생성한다고 판단을 하는거 같습니다.

새로 다시 생성을 시도해보면, 더 이상 생성이 안되는 모습을 볼 수 있습니다. 그렇다면, 기존의 노드에 관계를 생성하는 방법은 어떻게 되는것일까요?

merge (p:Person {name:"kim"}) // 혹은 match (p:Person {name:"kim"}) 
merge (p)-[o:OWNS {count:3}]-(c:Computer {name:"Samsung Galaxybook"})

코드가 조금 길어지지만, 위의 코드와 같이, 기존 노드를 찾은 다음에, 그 노드에 관계를 생성해줘야 됩니다.


관계가 매핑되어있는데, 반대로 생성을 시도한다면?


merge (c:Computer {name:"Samsung Galaxybook"})
merge (c)-[o:OWNS {count:3}]-(p:Person {name:"kim"})

위에서 관계를 생성한 노드에, 반대로 매핑을 시도할 경우에는, 이미 생성이 되어있다 판단을 하여서, 더 이상 생성이 되지 않습니다.

728x90
반응형
Comments