Work/GraphDB

Neo4j Cypher 구문 기본 - [Youtube] Neo4j (Graph Database) Crash Course

raeul0304 2025. 4. 24. 17:58

cypher 구문 기본을 익히기 위해 유튜브 영상을 보고 정리해보았다.

 

 

  • Fetching Nodes
    • MATCH(n) RETURN n
    • MATCH(n: 특정 레이블) RETURN n
    ⇒ 특정 레이블을 가진 노드를 가져올 수 있음
    • ex. MATCH (player : PLAYER) RETURN player
  • 별칭 활용
    • MATCH(player : PLAYER) RETURN player.name AS 별칭1, player.height AS 별칭2

이런 식으로 속성을 특정해서 받아올 수도 있다

 

 

Filtering nodes

  • 특정 하나의 노드를 가져오는 방법 → 속성을 활용한다
    • MATCH (player: PLAYER) WHERE player.name = “LeBron James” RETURN player
    • MATCH (player:PLAYER) WHERE (player.weight / (player.height* player.height)) ≥ 25 RETURN player
    • MATCH (player:PLAYER) WHERE player.weight ≥ 100 AND player.weight ≤ 2 RETURN player
    • MATCH (player:PLAYER) WHERE player.weight ≥ 100 AND player.weight ≤ 2 RETURN player LIMIT 2 ⇒ 상위 2개 결과를 출력
    • MATCH (player:PLAYER) WHERE player.weight ≥ 100 AND player.weight ≤ 2 RETURN player SKIP 4 LIMIT 2 ⇒ 첫 4개를 스킵하고 그 다음 상위 2개 결과를 출력
    • MATCH (player:PLAYER) WHERE player.height ≥ 2 RETURN player ORDER BY player.height ASC ⇒ 오름차순으로 정렬

전반적으로 sql 문과 유사하게 사용하면 되는듯

 

 

  • 여러개의 노드 filtering (like SELECT문 in SQL)
    • MATCH (player: PLAYER), (coach: COACH) WHERE player.height ≥ 2 RETURN player, coach
  • 노드 간 관계에 만족하는 노드 추출 : “ -[]→” 으로 표현
    • MATCH (player: PLAYER) -[:PLAYS_FOR]→ (team: TEAM) WHERE team.name = “LA Lakers” RETURN player ⇒ PLAYS_FOR 관계를 가진 노드들을 가져옴
    relationship에도 속성이 있는데 이를 활용해서 원하는 노드를 추출할 수 있다.
    예를 들어, PLAYS_FOR이라는 관계에 <id>와 salary라는 속성이 있다고 치면…
    • MATCH (player: PLAYER) - [contract:PLAYS_FOR] → (team: TEAM) WHERE contract.salary ≥ 35000000 RETURN player, team
    • MATCH (lebron: PLAYER {name : “LeBron James”}) -[contract:TEAMMATES] → (teammate:PLAYER) WHERE contract.salary ≥ 40000000 RETURN teammate


Aggregation

  • ex. player가 얼만큼의 팀과 경기를 했는가
    • MATCH (player:PLAYER) -[gamePlayed: PLAYED_AGAINST] → (:TEAM) RETURN player.name, COUNT(gamePlayed)
  • 관계가 가지는 속성을 가지고 연산을 수행할 수도 있다 ex. 경기 마다의 점수(points) 평균값
    • MATCH (player:PLAYER) -[gamePlayed: PLAYED_AGAINST] → (:TEAM) RETURN player.name, AVG(gamePlayed.points) AS ppg ORDER BY ppg DESC LIMIT 1 (최고 점수)


삭제하기

  • 노드 삭제하기
    • ‘Ja Morant’ 이름을 가진 노드를 삭제하기
      • 바로 지우려고 하면 다른 노드들과의 관계가 있기 때문에 에러가 난다 ⇒ detach를 해야함
      • MATCH (ja {name: “Ja Morant”}) DETACH DELETE ja
  • 관계 삭제하기
    • “Joel Embiid”가 팀 노드와 가진 “PLAYS_FOR”이라는 관계 삭제하기
      • MATCH (jeol {name: “Joel Embiid”}) - [rel:PLAYS_FOR] → (:TEAM) DELETE rel


생성하기

  • 노드 생성하기
    • ‘:’ 을 활용해 label를 부여하고, ‘{}’ 안에 속성을 정의한다
    • CREATE (lebron:PLAYER:COACH:GENERAL_MANAGER {name: “LeBron James”, height: 2.01}) RETURN lebron
  • 노드와 관계를 함께 생성하기
    • CREATE (:PLAYER) - [: PLAYS_FOR {salary: 34000000}] → (:TEAM {name: “LA Lakers”}) ⇒ 2개의 레이블, 2개의 노드, 2개의 속성, 1개의 관계가 생성된다
  • 이미 존재하는 노드들 간의 관계를 생성하기
    • MATCH (lebron: PLAYER {name: “LeBron James”}), (lakers:TEAM {name: “LA Lakers”}) CREATE (lebron) - [:PLAYS_FOR {salary: 4000000}] → (lakers)


업데이트하기

  • Updating nodes and relationships
    • 노드가 가진 속성을 활용해서 먼저 노드를 찾는다 (MATCH)
      • MATCH (anthony: PLAYER) WHERE ID(anthony) = 0 RETURN anthony
    • SET을 통해 속성을 부여/업데이트 한다
      • MATCH (anthony: PLAYER) WHERE ID(anthony) = 0 SET anthony.name = “Anthony Davis” RETURN anthony
    • example 2
      • MATCH (lebron:PLAYER) WHERE ID(lebron) =3 SET lebron.height = 2.02, lebron.age = 36
  • label 업데이트하기
    • MATCH (lebron:PLAYER) WHERE ID(lebron) = 3 SET lebron:REF RETURN lebron
    ⇒ REF라는 레이블이 추가됨
  • 관계 업데이트하기
    • MATCH (lebron {name : “LeBron James”}) - [contract:PLAYS_FOR] → (:TEAM) SET contract.salary = 6000000 RETURN lebron, team
  • 레이블 삭제하기
    • MATCH (lebron {name: “LeBron James”}) REMOVE lebron.REF RETURN lebron