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

[Neo4j] OPTIONAL MATCH

소개

OPTIONAL MATCHMATCH와 마찬가지로 그래프 데이터베이스에서 패턴을 매칭합니다. 차이는 매칭이 발견되지 않으면 OPTIONAL MATCH가 패턴의 누락된 부분에 "null"을 사용한다는 것입니다. 따라서 OPTIONAL MATCH는 SQL의 외부 조인에 해당하는 Cypher®의 등가로 볼 수 있습니다.

OPTIONAL MATCH를 사용할 때는 전체 패턴이 매칭되거나 아무것도 매칭되지 않습니다. WHERE 절은 패턴 설명의 일부이며, 해당 조건은 매칭을 찾는 동안에 고려되고 이후에 고려되는 것이 아닙니다. 이는 여러(OPTIONAL) MATCH 절이 있는 경우 특히 중요한데, WHERE를 해당하는 MATCH와 함께 두는 것이 결정적입니다.

예제 그래프

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

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

그래프를 다시 만들려면 비어 있는 Neo4j 데이터베이스에서 다음 쿼리를 실행하세요:

Cypher

"CREATE (charlie:Person {name: 'Charlie Sheen'}), (martin:Person {name: 'Martin Sheen'}), (michael:Person {name: 'Michael Douglas'}), (oliver:Person {name: 'Oliver Stone'}), (rob:Person {name: 'Rob Reiner'}), (wallStreet:Movie {title: 'Wall Street'}), (charlie)-[:ACTED_IN]->(wallStreet), (martin)-[:ACTED_IN]->(wallStreet), (michael)-[:ACTED_IN]->(wallStreet), (oliver)-[:DIRECTED]->(wallStreet), (thePresident:Movie {title: 'The American President'}), (martin)-[:ACTED_IN]->(thePresident), (michael)-[:ACTED_IN]->(thePresident), (rob)-[:DIRECTED]->(thePresident), (martin)-[:FATHER_OF]->(charlie)"

OPTIONAL MATCH 자세히 보기

SQL과 마찬가지로 Cypher 쿼리는 다양한 절을 사용해 구성되며, 각 절은 서로 연결되어 중간 결과를 전달합니다. 예를 들어 하나의 MATCH 절에서 매칭된 변수는 다음 절이 존재하는 컨텍스트를 제공합니다. 그러나 Neo4j와 SQL에는 OPTIONAL MATCH를 더 자세히 설명하는 데 도움이 되는 두 가지 중요한 차이가 있습니다.

  • 인덱스와 제약 조건을 사용해 부분 스키마를 강제할 수 있고 그렇게 하는 것이 권장되지만, Neo4j는 관계형 데이터베이스보다 더 큰 스키마 유연성을 제공합니다. Neo4j 데이터베이스의 노드와 관계는 같은 그래프의 다른 노드나 관계가 해당 속성을 가지고 있다고 해서 특정 속성을 반드시 가져야 하는 것은 아닙니다(특정 속성에 대해 속성 존재 제약 조건이 생성되어 있지 않는 한).
  • Cypher의 쿼리는 파이프라인으로 실행됩니다. 어떤 절이 결과를 반환하지 않으면 이후 절이 실행할 데이터가 없으므로 쿼리가 사실상 종료됩니다.

예를 들어, 다음 쿼리는 결과를 반환하지 않습니다:

Cypher

"MATCH (a:Person {name: 'Martin Sheen'}) MATCH (a)-[r:DIRECTED]->() RETURN a.name, r"

결과

(no changes, no records)

이는 두 번째 MATCH 절이 RETURN 절에 전달할 데이터가 없기 때문입니다(그래프에서 Martin Sheen에 연결된 DIRECTED 관계가 없습니다).

그러나 두 번째 MATCH 절을 OPTIONAL MATCH로 바꾸면 결과가 반환됩니다. 이는 MATCH와 달리 OPTIONAL MATCH가 절 사이로 "null" 값을 전달할 수 있기 때문입니다.

Cypher

"MATCH (p:Person {name: 'Martin Sheen'}) OPTIONAL MATCH (p)-[r:DIRECTED]->() RETURN p.name, r"

표 1. 결과

p.name r
"Martin Sheen" <null>
행: 1

따라서 OPTIONAL MATCH는 그래프에서 누락된 값과 존재하는 값을 모두 확인하고, 데이터가 없는 행을 쿼리의 후속 절로 전달하는 데 사용할 수 있습니다.

선택적 관계

관계의 존재가 선택적이라면 OPTIONAL MATCH 절을 사용하세요. 관계가 존재하면 반환되고, 존재하지 않으면 그 자리에 "null"이 반환됩니다.

Cypher

"MATCH (a:Movie {title: 'Wall Street'}) OPTIONAL MATCH (a)-->(x) RETURN x"

Movie 노드 Wall Street에는 나가는 관계가 없으므로 "null"을 반환합니다.

표 2. 결과

x
<null>
행: 1

반면 다음 쿼리는 Person 노드 Charlie Sheen에 나가는 관계가 하나 있으므로 "null"을 반환하지 않습니다.

Cypher

"MATCH (a:Person {name: 'Charlie Sheen'}) OPTIONAL MATCH (a)-->(x) RETURN x"

표 3. 결과

x
{"title":"Wall Street"}
행: 2

선택적 요소의 속성

속성의 존재가 선택적이라면 OPTIONAL MATCH 절을 사용하세요. 지정된 속성이 존재하지 않으면 "null"이 반환됩니다.

Cypher

"MATCH (a:Movie {title: 'Wall Street'}) OPTIONAL MATCH (a)-->(x) RETURN x, x.name"

Movie 노드 Wall Street에는 나가는 관계가 없으므로 요소 x(이 쿼리에서는 "null")와 해당 name 속성에 대해 "null"을 반환합니다.

표 4. 결과

x x.name
<null> <null>
행: 1

다음 쿼리는 name 속성이 없는 노드에 대해서만 "null"을 반환합니다.

Cypher

"MATCH (a:Person {name: 'Martin Sheen'}) OPTIONAL MATCH (a)-->(x) RETURN x, x.name"

표 5. 결과

x x.name
{"title":"Wall Street"} <null>
{"name":"Charlie Sheen"} "Charlie Sheen"
{"title":"The American President"} <null>
행: 3

선택적 타입 및 이름 지정 관계

OPTIONAL MATCH를 사용할 때 특정 관계 유형을 찾는 것도 가능합니다:

Cypher

"MATCH (a:Movie {title: 'Wall Street'}) OPTIONAL MATCH (a)-[r:ACTED_IN]->() RETURN a.title, r"

이는 Movie 노드 Wall Street의 제목을 반환하며, 이 노드에는 나가는 ACTED_IN 관계가 없으므로 변수 r로 표시된 관계에 대해 "null"이 반환됩니다.

표 6. 결과

a.title r
"Wall Street" <null>
행: 1

하지만 다음 쿼리는 Movie 노드 Wall Street로 향하는 ACTED_IN 유형의 들어오는 관계를 찾고 있으므로 "null"을 반환하지 않습니다.

Cypher

"MATCH (a:Movie {title: 'Wall Street'}) OPTIONAL MATCH (x)-[r:ACTED_IN]->(a) RETURN a.title, x.name,"
type(r)

표 7. 결과

a.title x.name type(r)
"Wall Street" "Michael Douglas" "ACTED_IN"
"Wall Street" "Martin Sheen" "ACTED_IN"
"Wall Street" "Charlie Sheen" "ACTED_IN"
행: 3

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

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