본문 바로가기

DKE/Neo4j

[Neo4j] MATCH (Relationships in depth) / 2023.02.07

https://neo4j.com/docs/cypher-manual/current/clauses/match/

 

MATCH - Cypher Manual

The `MATCH` clause is used to search for the pattern described in it.

neo4j.com

*Example Graph

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 {role: 'Bud Fox'}]->(wallStreet),
  (martin)-[:ACTED_IN {role: 'Carl Fox'}]->(wallStreet),
  (michael)-[:ACTED_IN {role: 'Gordon Gekko'}]->(wallStreet),
  (oliver)-[:DIRECTED]->(wallStreet),
  (thePresident:Movie {title: 'The American President'}),
  (martin)-[:ACTED_IN {role: 'A.J. MacInerney'}]->(thePresident),
  (michael)-[:ACTED_IN {role: 'President Andrew Shepherd'}]->(thePresident),
  (rob)-[:DIRECTED]->(thePresident),
  (martin)-[:FATHER_OF]->(charlie)

 

1. Relationship types with uncommon characters

관계는 영문자가 아닌 문자 또는 공백을 포함할 수 있음 -> ` 를 사용하여 생성

#Example Graph의 Martin Sheen과 Rob Reiner 사이에 공백 (OLD FRIENDS) 을 포함하는 관계 생성
match
(martin:Person {name: 'Martin Sheen'}),
(rob:Person {name: 'Rob Reiner'})
create (rob)-[:`OLD FRIENDS`]->(martin)

Example Graph

#관계 생성 확인
MATCH (n {name: 'Rob Reiner'})-[r:`OLD FRIENDS`]->()
RETURN type(r)

2. Multiple relationships

관계는 ()--() 형식을 사용하여 여러 관계를 표현할 수 있음

MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)
RETURN movie.title, director.name

3. Variable length relationships

노드와 직접 연결되어 있는 노드 및 그렇지 않은 노드 탐색

여기서 Hop은 그래프 상에서 노드와 노드사이의 관계 직선? (아마도,,,)

사용법 : [:TYPE*minHops..maxHops]

minHop와 maxHops의 기본값은 각각 1과 무한대

maxHops값이 주어지지 않으면 점 생략 가능

 

#Charlie Sheen과 1~3홉내에 ACTED_IN 관계로 연결된 Movie 노드
MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN*1..3]-(movie:Movie)
RETURN movie.title

4. Variable length relationships with multiple relationship types

여러 관계 type 활용

#Charlie Sheen과 2홉 내에 ACTED_IN 또는 DIRECTED 관계로 연결된 Person 노드
MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN|DIRECTED*2]-(person:Person)
RETURN person.name

5. Relationship variable in variable length relationships

#Charlie Sheen과 2홉 내에 ACTED_IN 관계로 연결된 노드
MATCH p = (actor {name: 'Charlie Sheen'})-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)

6. Match with properties on a variable length path

예제를 보기에 앞서 데이터 추가

MATCH
  (charlie:Person {name: 'Charlie Sheen'}),
  (martin:Person {name: 'Martin Sheen'})
CREATE (charlie)-[:ACTED_IN {role: 'Bud', lead: true}]->(:Movie {title: 'Free Money'})<-[:ACTED_IN {role:'New Warden', lead: false}]-(martin),
(charlie)-[:ACTED_IN {role: 'Jake Peterson', lead: true}]->(:Movie {title: 'No Code of Conduct'})<-[:ACTED_IN {role: 'Bill Peterson', lead: true}]-(martin)

Example Graph

관계의 속성이 지정되어 있으면 노드 사이의 모든 관계의 속성이 지정된 값으로 설정되어 있어야 함

#Chralie Sheen과 Martin Sheen사이의 관계 중 속성 lead의 값이 true인 노드만 반환
MATCH p = (charlie:Person)-[* {lead: true}]-(martin:Person)
WHERE charlie.name = 'Charlie Sheen' AND martin.name = 'Martin Sheen'
RETURN p

7. Zero length paths

minHops이 0이라는 것은 곧 자기자신 노드를 뜻함

#Wall Street과 관계된 1홉 이내의 노드 중 actors과 directors를 비롯해 자기자신도 반환
MATCH (wallstreet:Movie {title: 'Wall Street'})-[*0..1]-(x)
RETURN x

8. Named paths

경로가 정해진 관계

#Michael Douglas로부터 나가는 방향과 관계된 노드
MATCH p = (michael {name: 'Michael Douglas'})-->()
RETURN p