Neo4j / / 2026. 1. 12. 18:19

[Neo4j] MERGE

소개

MERGE 절(Clause)은 그래프에서 기존 노드 패턴(Pattern)을 매칭하고 그것들을 바인딩(binding)하거나, 존재하지 않으면 새 데이터를 생성해 바인딩합니다. 이런 방식으로 MATCHCREATE를 결합한 것처럼 동작하며, 지정된 데이터가 매칭되었는지 생성되었는지에 따라 특정 작업을 수행할 수 있게 합니다.

예를 들어 MERGE를 사용해 그래프에 Person 레이블과 특정 name 속성을 가진 노드가 반드시 있어야 한다고 지정할 수 있습니다. 특정 name 속성을 가진 노드가 없으면 그 name 속성을 가진 새 노드가 생성됩니다.

Note
성능상의 이유로 MERGE를 사용할 때 레이블 또는 속성에 대한 스키마 인덱스(schema index)를 생성하는 것을 강력히 권장합니다. 자세한 내용은 인덱스 생성, 표시, 삭제를 참고하세요.

전체 패턴에 MERGE를 사용할 때 동작은 전체 패턴이 매칭되거나, 전체 패턴이 생성되는 것입니다. MERGE는 기존 패턴을 부분적으로 사용하지 않습니다. 부분 매칭이 필요하다면 패턴을 여러 MERGE 절로 나눠서 처리할 수 있습니다.

Note
동시 업데이트 환경에서 MERGEMERGE 패턴의 존재만 보장하고, 유일성은 보장하지 않습니다. 특정 속성을 가진 노드의 유일성을 보장하려면 속성 유일성 제약조건(property uniqueness constraint)을 사용해야 합니다. MERGE에 속성 유일성 제약조건 사용을 참고하세요.

MATCH와 유사하게 MERGE는 패턴의 여러 발생을 매칭할 수 있습니다. 여러 매칭이 있으면 모두 쿼리의 이후 단계로 전달됩니다.

MERGE 절의 마지막 부분은 ON CREATE 및/또는 ON MATCH 연산자입니다. 이는 요소가 데이터베이스에서 매칭(MATCH)되었는지 또는 생성(CREATE)되었는지에 따라 노드나 관계의 속성에 대한 추가 변경을 표현할 수 있게 합니다.

예제 그래프

다음 그래프가 아래 예제에 사용됩니다:

Person과 Movie 노드를 연결하는 예제 그래프

그래프를 재현하려면 빈 Neo4j 데이터베이스에서 다음 쿼리를 실행하세요:

CREATE
  (charlie:Person {name: 'Charlie Sheen', bornIn: 'New York', chauffeurName: 'John Brown'}),
  (martin:Person {name: 'Martin Sheen', bornIn: 'Ohio', chauffeurName: 'Bob Brown'}),
  (michael:Person {name: 'Michael Douglas', bornIn: 'New Jersey', chauffeurName: 'John Brown'}),
  (oliver:Person {name: 'Oliver Stone', bornIn: 'New York', chauffeurName: 'Bill White'}),
  (rob:Person {name: 'Rob Reiner', bornIn: 'New York', chauffeurName: 'Ted Green'}),
  (wallStreet:Movie {title: 'Wall Street'}),
  (theAmericanPresident:Movie {title: 'The American President'}),
  (charlie)-[:ACTED_IN]->(wallStreet),
  (martin)-[:ACTED_IN]->(wallStreet),
  (michael)-[:ACTED_IN]->(wallStreet),
  (martin)-[:ACTED_IN]->(theAmericanPresident),
  (michael)-[:ACTED_IN]->(theAmericanPresident),
  (oliver)-[:DIRECTED]->(wallStreet),
  (rob)-[:DIRECTED]->(theAmericanPresident)

노드 병합

레이블이 있는 단일 노드 병합

특정 레이블이 있는 노드를 병합합니다:

쿼리

MERGE (robert:Critic)
RETURN labels(robert)

데이터베이스에 Critic 레이블의 노드가 없으므로 새 노드가 생성됩니다:

표 1. 결과

labels(robert)
["Critic"]

여러 레이블이 있는 단일 노드 병합

여러 레이블은 콜론으로 구분합니다:

쿼리

MERGE (robert:Critic:Viewer)
RETURN labels(robert)

데이터베이스에 CriticViewer가 모두 붙은 노드가 없으므로 새 노드가 생성됩니다:

표 2. 결과

labels(robert)
["Critic","Viewer"]

여러 레이블은 앰퍼샌드 &로도 구분할 수 있으며, 레이블 표현식에서 사용하는 방식과 동일합니다. 콜론 :과 앰퍼샌드 &는 같은 절에서 함께 사용할 수 없습니다.

쿼리

MERGE (robert:Critic&Viewer)
RETURN labels(robert)

데이터베이스에 CriticViewer가 모두 붙은 노드가 이미 있으므로 새 노드가 생성되지 않습니다:

표 3. 결과

labels(robert)
["Critic","Viewer"]

속성이 있는 단일 노드 병합

그래프의 기존 노드 속성과 다른 속성을 가진 노드를 병합하면 새 노드가 생성됩니다:

쿼리

MERGE (charlie {name: 'Charlie Sheen', age: 10})
RETURN charlie

기존의 Charlie Sheen 노드와 모든 속성이 일치하지 않으므로 Charlie Sheen 이름을 가진 새 노드가 생성됩니다:

표 4. 결과

charlie
(:Person {"name":"Charlie Sheen", "age":10})

Note
MERGE는 속성 값이 null인 노드에 사용할 수 없습니다. 예를 들어 다음 쿼리는 오류를 발생시킵니다:

쿼리

MERGE (martin:Person {name: 'Martin Sheen', age: null})
RETURN martin
Cannot merge the following node because of null property value for 'age': (:Person {age: null})

레이블과 속성을 모두 지정한 단일 노드 병합

레이블과 속성이 모두 기존 노드와 일치하는 단일 노드를 병합하면 새 노드가 생성되지 않습니다:

쿼리

MERGE (michael:Person {name: 'Michael Douglas'})
RETURN michael.name, michael.bornIn

Michael Douglas가 매칭되고 namebornIn 속성이 반환됩니다:

표 5. 결과

michael.name michael.bornIn
"Michael Douglas" "New Jersey"

기존 노드 속성에서 유래한 단일 노드 병합

기존 노드 속성을 사용해 노드를 병합할 수 있습니다:

쿼리

MATCH (person:Person)
MERGE (location:Location {name: person.bornIn})
RETURN person.name, person.bornIn, location

위 쿼리에서는 Location 레이블의 노드 3개가 생성되며, 각각 name 속성 값으로 New York, Ohio, New Jersey를 가집니다. MATCH 절로 바인딩된 노드 3개가 모두 bornIn 속성 값으로 New York를 갖더라도, 생성되는 New York 노드는 단 하나(즉, 이름이 New YorkLocation 노드)입니다. 첫 번째 바인딩된 노드에서는 New York 노드가 매칭되지 않아 생성됩니다. 그러나 새로 생성된 New York 노드는 두 번째와 세 번째 바인딩된 노드에서는 매칭되어 바인딩됩니다.

표 6. 결과

person.name person.bornIn location
"Charlie Sheen" "New York" {name:"New York"}
"Martin Sheen" "Ohio" {name:"Ohio"}
"Michael Douglas" "New Jersey" {name:"New Jersey"}
"Oliver Stone" "New York" {name:"New York"}
"Rob Reiner" "New York" {name:"New York"}

ON CREATEON MATCH 사용

ON CREATE로 병합

노드를 병합하고 노드를 생성해야 할 때 속성을 설정합니다:

쿼리

MERGE (keanu:Person {name: 'Keanu Reeves', bornIn: 'Beirut', chauffeurName: 'Eric Brown'})
ON CREATE
  SET keanu.created = timestamp()
RETURN keanu.name, keanu.created

쿼리는 Keanu Reeves라는 이름의 Person 노드를 생성하고, bornIn 속성에 Beirut, chauffeurName 속성에 Eric Brown을 설정합니다. 또한 created 속성에 타임스탬프를 설정합니다.

표 7. 결과

keanu.name keanu.created
"Keanu Reeves" 1655200898563

ON MATCH로 병합

노드를 병합하고 발견된 노드에 속성을 설정합니다:

쿼리

MERGE (person:Person)
ON MATCH
  SET person.found = true
RETURN person.name, person.found

쿼리는 모든 Person 노드를 찾고 속성을 설정한 뒤 반환합니다:

표 8. 결과

person.name person.found
"Charlie Sheen" true
"Martin Sheen" true
"Michael Douglas" true
"Oliver Stone" true
"Rob Reiner" true
"Keanu Reeves" true

ON CREATEON MATCH로 병합

쿼리

MERGE (keanu:Person {name: 'Keanu Reeves'})
ON CREATE
  SET keanu.created = timestamp()
ON MATCH
  SET keanu.lastSeen = timestamp()
RETURN keanu.name, keanu.created, keanu.lastSeen

Keanu Reeves라는 Person 노드가 이미 존재하므로 이 쿼리는 새 노드를 생성하지 않습니다. 대신 lastSeen 속성에 타임스탬프를 추가합니다.

표 9. 결과

keanu.name keanu.created keanu.lastSeen
"Keanu Reeves" 1655200902354 1674655352124

ON MATCH에서 여러 속성 설정

여러 속성을 설정해야 한다면 쉼표로 구분합니다:

쿼리

MERGE (person:Person)
ON MATCH
  SET
    person.found = true,
    person.lastAccessed = timestamp()
RETURN person.name, person.found, person.lastAccessed

표 10. 결과

person.name person.found person.lastAccessed
"Charlie Sheen" true 1655200903558
"Martin Sheen" true 1655200903558
"Michael Douglas" true 1655200903558
"Oliver Stone" true 1655200903558
"Rob Reiner" true 1655200903558
"Keanu Reeves" true 1655200903558

관계 병합

관계에서 병합

MERGE를 사용해 관계를 매칭하거나 생성할 수 있습니다:

쿼리

MATCH
  (charlie:Person {name: 'Charlie Sheen'}),
  (wallStreet:Movie {title: 'Wall Street'})
MERGE (charlie)-[r:ACTED_IN]->(wallStreet)
RETURN charlie.name, type(r), wallStreet.title

Charlie Sheen이 이미 Wall Street에 출연한 것으로 표시되어 있으므로 기존 관계가 찾아져 반환됩니다. MERGE로 관계를 매칭하거나 생성하려면 최소 한 개의 바인딩된 노드를 지정해야 하며, 위 예제에서는 MATCH 절로 이를 수행합니다.

표 11. 결과

charlie.name type(r) wallStreet.title
"Charlie Sheen" "ACTED_IN" "Wall Street"

Note
MERGE는 속성 값이 null인 관계에 사용할 수 없습니다. 예를 들어 다음 쿼리는 오류를 발생시킵니다:

쿼리

MERGE (martin:Person {name: 'Martin Sheen'})-[r:FATHER_OF {since: null}]->(charlie:Person {name: 'Charlie Sheen'})
RETURN type(r)
Cannot merge the following relationship because of null property value for 'since': (martin)-[:FATHER_OF {since: null}]->(charlie)

Note
같은 MERGE 절 안에서 다른 엔티티의 속성을 참조해 엔티티(노드 또는 관계)의 속성을 지정하는 것은 허용되지 않습니다.

예를 들어 oliver.bornIn의 속성 정의에서 charlie.bornIn을 참조하는 것은 허용되지 않습니다.

쿼리

MERGE (charlie:Person {name: 'Charlie Sheen', bornIn: 'New York'})-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(oliver:Person {name: 'Oliver Stone', bornIn: charlie.bornIn})
RETURN movie

오류 메시지

The Node variable 'charlie' is referencing a Node that is created in the same MERGE clause which is not allowed. Please only reference variables created in earlier clauses

여러 관계에서 병합

쿼리

MATCH
  (oliver:Person {name: 'Oliver Stone'}),
  (reiner:Person {name: 'Rob Reiner'})
MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:DIRECTED]-(reiner)
RETURN movie

예제 그래프에서 Oliver StoneRob Reiner는 함께 작업한 적이 없습니다. 이들 사이에 Movie 노드를 MERGE하려 하면 Neo4j는 어느 한 사람과 이미 연결된 기존 Movie 노드를 사용하지 않습니다. 대신 새 Movie 노드를 생성합니다.

표 12. 결과

movie
(:Movie)

방향이 없는 관계에서 병합

MERGE는 관계의 방향을 지정하지 않고도 사용할 수 있습니다. Cypher®는 먼저 양 방향으로 관계 매칭을 시도합니다. 어느 방향에도 관계가 없으면 왼쪽에서 오른쪽으로 관계를 생성합니다.

쿼리

MATCH
  (charlie:Person {name: 'Charlie Sheen'}),
  (oliver:Person {name: 'Oliver Stone'})
MERGE (charlie)-[r:KNOWS]-(oliver)
RETURN r

예제 그래프에서 Charlie SheenOliver Stone은 서로 알지 못하므로, 이 MERGE 쿼리는 둘 사이에 KNOWS 관계를 생성합니다. 생성된 관계의 방향은 왼쪽에서 오른쪽입니다.

표 13. 결과

r
[:KNOWS]

기존 노드 두 개 사이의 관계에서 병합

MERGE는 앞선 MATCHMERGE 절과 함께 사용하여 바인딩된 두 노드 mn 사이의 관계를 생성할 수 있습니다. 여기서 mMATCH로 반환되고, n은 앞선 MERGE에서 생성되거나 매칭됩니다.

쿼리

MATCH (person:Person)
MERGE (location:Location {name: person.bornIn})
MERGE (person)-[r:BORN_IN]->(location)
RETURN person.name, person.bornIn, location

이는 기존 노드 속성에서 유래한 단일 노드 병합 예제를 확장한 것입니다. 두 번째 MERGE는 각 사람과 그 사람의 bornIn 속성 값에 해당하는 위치 사이에 BORN_IN 관계를 생성합니다. Charlie Sheen, Rob Reiner, Oliver Stone은 모두 동일한 Location 노드(New York)와 BORN_IN 관계를 갖습니다.

표 14. 결과

person.name person.bornIn location
"Charlie Sheen" "New York" (:Location {name:"New York"})
"Martin Sheen" "Ohio" (:Location {name:"Ohio"})
"Michael Douglas" "New Jersey" (:Location {name:"New Jersey"})
"Oliver Stone" "New York" (:Location {name:"New York"})
"Rob Reiner" "New York" (:Location {name:"New York"})
"Keanu Reeves" "Beirut" (:Location {name:"Beirut"})

기존 노드와 노드 속성에서 유래한 병합 노드 사이의 관계에서 병합

MERGE를 사용해 새 노드 n과 바인딩된 노드 mn 사이의 관계를 동시에 생성할 수 있습니다:

쿼리

MATCH (person:Person)
MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur {name: person.chauffeurName})
RETURN person.name, person.chauffeurName, chauffeur

MERGE가 매칭을 찾지 못했기 때문에(예제 그래프에는 Chauffeur 레이블의 노드와 HAS_CHAUFFEUR 관계가 없습니다) MERGEChauffeur 레이블의 노드 6개를 생성하고, 각 노드의 name 속성은 매칭된 각 Person 노드의 chauffeurName 속성 값과 동일합니다. 또한 MERGE는 각 Person 노드와 새로 생성된 해당 Chauffeur 노드 사이에 HAS_CHAUFFEUR 관계를 생성합니다. Charlie SheenMichael Douglas는 모두 같은 이름인 John Brown이라는 운전기사(chauffeur)를 갖고 있으므로, 각 경우에 새 노드가 생성되어 nameJohn BrownChauffeur 노드가 두 개 생깁니다. 이는 name 속성이 동일하더라도 서로 다른 사람임을 정확히 나타냅니다. 이는 앞서 기존 노드 두 개 사이의 관계에서 병합 예제와 대비되는데, 그 예제에서는 첫 번째 MERGELocation 노드를 바인딩해 두 번째 MERGE에서 다시 생성(중복)되지 않도록 했습니다.

표 15. 결과

person.name person.chauffeurName chauffeur
"Charlie Sheen" "John Brown" (:Person {name:"John Brown"})
"Martin Sheen" "Bob Brown" (:Person {name:"Bob Brown"})
"Michael Douglas" "John Brown" (:Person {name:"John Brown"})
"Oliver Stone" "Bill White" (:Person {name:"Bill White"})
"Rob Reiner" "Ted Green" (:Person {name:"Ted Green"})
"Keanu Reeves" "Eric Brown" (:Person {name:"Eric Brown"})

MERGE에 노드 속성 유일성 제약조건 사용

Cypher는 속성 유일성 제약조건을 포함하는 패턴을 사용할 때 MERGE로 인한 충돌 결과가 발생하지 않도록 합니다. 이 경우 해당 패턴과 매칭되는 노드는 최대 한 개여야 합니다.

예를 들어 :Person(id):Person(ssn)에 대한 속성 유일성 제약조건이 있을 때, MERGE (n:Person {id: 12, ssn: 437}) 같은 쿼리는 (하나는 id 12, 다른 하나는 ssn 437을 가진) 서로 다른 노드가 두 개 있을 경우 실패합니다. 또는 한 개의 노드가 하나의 속성만 가지고 있는 경우에도 실패합니다. 즉, 패턴과 일치하는 노드가 정확히 한 개이거나, 일치하는 노드가 없어야 합니다.

다음 예제는 아래처럼 생성된 속성 유일성 제약조건이 존재한다고 가정합니다:

CREATE CONSTRAINT FOR (n:Person) REQUIRE n.name IS UNIQUE;
CREATE CONSTRAINT FOR (n:Person) REQUIRE n.role IS UNIQUE;

속성 유일성 제약조건으로 노드 병합 시, 노드가 없으면 새 노드 생성

모든 Person 노드의 name 속성에 대한 노드 속성 유일성 제약조건이 있을 때, 아래 쿼리는 name 속성이 Laurence Fishburne인 새 Person을 생성합니다. Laurence Fishburne 노드가 이미 존재한다면 MERGE는 기존 노드를 매칭합니다.

쿼리

MERGE (laurence:Person {name: 'Laurence Fishburne'})
RETURN laurence.name

표 16. 결과

laurence.name
"Laurence Fishburne"

노드 속성 유일성 제약조건으로 병합하면 기존 노드를 매칭

모든 Person 노드의 name 속성에 대한 속성 유일성 제약조건이 있을 때, 아래 쿼리는 name 속성이 Oliver Stone인 기존 Person 노드를 매칭합니다.

쿼리

MERGE (oliver:Person {name: 'Oliver Stone'})
RETURN oliver.name, oliver.bornIn

표 17. 결과

oliver.name oliver.bornIn
"Oliver Stone" "New York"

속성 유일성 제약조건과 부분 매칭

속성 유일성 제약조건을 사용한 병합은 부분 매칭을 찾을 때 실패합니다:

쿼리

MERGE (michael:Person {name: 'Michael Douglas', role: 'Gordon Gekko'})
RETURN michael

이름이 Michael Douglas인 고유한 Person 노드가 매칭되지만, 역할이 Gordon Gekko인 고유한 노드는 없으므로 MERGE는 매칭에 실패합니다.

오류 메시지

Node already exists with label `Person` and property `name` = 'Michael Douglas'

Gordon GekkoroleMichael Douglas에 설정하려면 대신 SET 절을 사용하세요:

쿼리

MERGE (michael:Person {name: 'Michael Douglas'})
SET michael.role = 'Gordon Gekko'

결과

Set 1 property

속성 유일성 제약조건과 충돌 매칭

속성 유일성 제약조건을 사용한 병합은 충돌 매칭을 찾을 때 실패합니다:

쿼리

MERGE (oliver:Person {name: 'Oliver Stone', role: 'Gordon Gekko'})
RETURN oliver

이름이 Oliver Stone인 고유한 Person 노드가 매칭되지만, 역할이 Gordon Gekko인 고유한 Person 노드도 존재하므로 MERGE는 매칭에 실패합니다.

오류 메시지

Node already exists with label `Person` and property `name` = 'Oliver Stone'

MERGE에 관계 속성 유일성 제약조건 사용

노드 유일성 제약조건에 대해 위에서 설명한 내용은 관계 유일성 제약조건에도 동일하게 적용됩니다. 다만 관계 유일성 제약조건에는 추가로 고려할 사항이 있습니다.

예를 들어 ()-[:ACTED_IN(year)]-()에 대한 관계 유일성 제약조건이 존재한다면, 패턴의 모든 노드를 바인딩하지 않은 다음 쿼리는 실패합니다:

쿼리

MERGE (charlie:Person {name: 'Charlie Sheen'})-[r:ACTED_IN {year: 1987}]->(wallStreet:Movie {title: 'Wall Street'})
RETURN charlie.name, type(r), wallStreet.title

이는 MERGE의 all-or-nothing 의미론 때문에, year 속성이 있는 관계가 존재하지만 전체 패턴에 대한 매칭이 없으면 쿼리가 실패하기 때문입니다. 이 예제에서는 패턴에 대한 매칭이 없으므로 MERGE{year: 1987} 관계를 포함한 전체 패턴을 생성하려고 하며, 이는 제약조건 위반 오류로 이어집니다.

따라서 관계 유일성 제약조건이 존재하는 경우에는 특히 MERGE 패턴에 항상 바인딩된 노드를 사용하는 것이 좋습니다. 따라서 다음과 같이 쿼리를 구성하는 것이 더 적절합니다:

쿼리

MATCH
  (charlie:Person {name: 'Charlie Sheen'}),
  (wallStreet:Movie {title: 'Wall Street'})
MERGE (charlie)-[r:ACTED_IN {year: 1987}]->(wallStreet)
RETURN charlie.name, type(r), wallStreet.title

MERGE에서 맵 매개변수 사용

MERGECREATE와 동일한 방식으로 맵 매개변수를 지원하지 않습니다. MERGE에서 맵 매개변수를 사용하려면, 아래 예제처럼 기대하는 속성을 명시적으로 사용해야 합니다. 매개변수에 대한 자세한 내용은 매개변수를 참고하세요.

매개변수

{
  "param": {
    "name": "Keanu Reeves",
    "bornIn": "Beirut",
    "chauffeurName": "Eric Brown"
  }
}

쿼리

MERGE (person:Person {name: $param.name, bornIn: $param.bornIn, chauffeurName: $param.chauffeurName})
RETURN person.name, person.bornIn, person.chauffeurName

표 18. 결과

person.name person.bornIn person.chauffeurName
"Keanu Reeves" "Beirut" "Eric Brown"

동적 노드 레이블과 관계 유형을 사용하는 MERGE

노드를 병합하거나 관계를 병합할 때 노드 레이블과 관계 유형은 표현식, 매개변수, 변수에서 동적으로 참조할 수 있습니다. 이는 더 유연한 쿼리를 가능하게 하고 Cypher 인젝션 위험을 줄입니다. (Cypher 인젝션에 대한 자세한 내용은 Neo4j Knowledge Base → Cypher 인젝션 방어를 참고하세요.)

노드 및 관계를 동적으로 병합하는 구문

MERGE (n:$(<expr>))
MERGE ()-[r:$(<expr>)]->()

표현식은 STRING NOT NULL | LIST<STRING NOT NULL> NOT NULL 값을 평가해야 합니다. 동적 관계 유형을 사용해 관계를 병합할 때 항목이 2개 이상인 LIST<STRING>을 사용하면 실패합니다. 이는 관계가 정확히 하나의 유형만 가질 수 있기 때문입니다.

매개변수

{
  "nodeLabels": ["Person", "Director"],
  "relType": "DIRECTED",
  "movies": ["Ladybird", "Little Women", "Barbie"]
}

동적 노드 레이블 및 관계 유형을 사용해 노드와 관계 병합

MERGE (greta:$($nodeLabels) {name: 'Greta Gerwig'})
WITH greta
UNWIND $movies AS movieTitle
MERGE (greta)-[rel:$($relType)]->(m:Movie {title: movieTitle})
RETURN greta.name AS name, labels(greta) AS labels, type(rel) AS relType, collect(m.title) AS movies

표 19. 결과

name labels relType movies
"Greta Gerwig" ["Person", "Director"] "DIRECTED" ["Ladybird", "Little Women", "Barbie"]

Rows: 1

성능 유의사항

동적 값을 사용하는 MERGE 쿼리는 정적 값을 사용하는 쿼리만큼 성능이 좋지 않을 수 있습니다. Neo4j는 이러한 쿼리의 성능을 개선하기 위해 적극적으로 작업 중입니다. 아래 표는 특정 Neo4j 버전에 대한 성능 유의사항을 정리한 것입니다.

표 20. Neo4j 버전 및 성능 유의사항

Neo4j 버전 성능 유의사항
5.26 — 2025.07 Cypher planner인덱스인덱스 스캔 또는 시크와 함께 활용하지 못하며, 대신 모든 노드를 읽는 AllNodesScan 연산자를 사용해야 하므로 비용이 더 큽니다.
2025.08 — 현재 Cypher planner는 노드 레이블과 관계 유형을 동적으로 매칭할 때 토큰 룩업 인덱스를 활용할 수 있습니다. 이는 세 가지 새로운 쿼리 플랜 연산자 도입으로 가능해졌습니다: DynamicLabelNodeLookup, DynamicDirectedRelationshipTypeLookup, DynamicUndirectedRelationshipTypeLookup. 다만 속성 값에 대한 인덱스는 사용할 수 없습니다. 예를 들어 MERGE (n:$(Label) {foo: bar})n.foo에 대한 인덱스를 사용하지 않지만, $(label)에 대해서는 DynamicLabelNodeLookup을 사용할 수 있습니다.

출처: https://neo4j.com/docs/cypher-manual/25/clauses/merge/

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유