데이터베이스 Database/그래프DB_Neo4j

[Neo4j] 기본적인 표기법과 기초 함수 (노드, 관계, MERGE, CREATE, DELETE, SET)

H 에이치 2023. 2. 6. 18:24
반응형

기본 표기법

 

(NodeName)

노드는 괄호로 표기 (Node)

 

(:LabelName)

레이블 표시를 위해서는 콜론(:) 사용 (:Person)

 

--

관계는 더블하이픈(--)으로 표기 (:Person)--(:Movie)

 

-->

방향은 < 또는 >로 표기 (:Person)-->(:Movie)

  • Neo4j에서 관계를 생성할 때는 방향이 꼭 설정되어야 함
  • 명시하지 않을 시에는 좌-->우로 설정됨
 

[:RELATIONSHIP_NAME]

The type of the relationship is written using the square brackets between the two dashes: [ and ], for example [:ACTED_IN]

 

{}

 

JSON와 마찬가지로 중괄호로 괄호를 표시함

  • 속성의 키-값 페어는 다음과 같이 표기함 {name: 'Tom Hanks'}.
 

Alias

 

Alias 뒤에 노드 이름을 생략할 수 있음

아래의 경우 ACTED_IN 관계로 Person과 이어진 노드가 Movie 뿐이라면
(m:Movie)는 (m)과 같은 결과 값을 리턴함

MATCH (p:Person)-[r:ACTED_IN]->(m)

MATCH (p:Person)-[r:ACTED_IN]->(m:Movie)
 

Alias는 Where절에 명시해도 됨

아래 두 쿼리는 같은 의미임

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WHERE m.title='The Matrix'
RETURN p.name
MATCH (p)-[:ACTED_IN]->(m)
WHERE p:Person AND m:Movie AND m.title='The Matrix'
RETURN p.name

질문❓ Cypher의 실행 순서? Where➡️Match➡️Return

 

함수

 

STARTS WITH / ENDS WITH

 

MERGE vs. CREATE

  • Merge
    • 노드, 관계 생성
    • 노드 중복을 허용하지 않음
  • Create
    • 노드 생성
    • 노드 생성 시 primary key 검토를 하지 않음
    • 더 빠름
 

MERGE

 

Merge Relationships

MERGE (p:Person {name: 'Chadwick Boseman'}) 
MERGE (m:Movie {title: 'Black Panther'}) 
MERGE (p)-[:ACTED_IN]->(m)

Direction 생략시 암묵적으로 좌➡️우 방향으로 생성됨

MERGE (p:Person {name: 'Chadwick Boseman'}) 
MERGE (m:Movie {title: 'Black Panther'}) 
MERGE (p)-[:ACTED_IN]-(m)

하나의 Merge문으로 노드와 관계를 생성할 수 있음

MERGE (p:Person {name: 'Emily Blunt'})
	-[:ACTED_IN]-> (m:Movie {title: 'A Quiet Place'})
RETURN p, m
 

MERGE, SET

 

MERGE

Relation은 ['String'] 형식으로 감싸줘야 함

MERGE (p:Person {name: 'Michael Cain'})
MERGE (m:Movie {title: 'Batman Begins'})
MERGE (p)-[:ACTED_IN {roles: ['Alfred Penny']}]->(m)
RETURN p,m
 

SET

Property를 업데이트함
SET 구문은 ,로 구분해야 함
AND를 쓸 수 없음

MATCH (p:Person)-[r:ACTED_IN]->(m:Movie)
WHERE p.name = 'Michael Cain' AND m.title = 'The Dark Knight'
SET r.roles = ['Alfred Penny'], r.year = 2008
RETURN p, r, m
 

ON CREATE/MATCH SET

MERGE (m:Movie {title: 'Rocketman'})
ON MATCH SET m.matchedAt = datetime()
ON CREATE SET m.createdAt = datetime()
SET m.updatedAt = datetime()
RETURN m
 
결과
 
"m"
{  
"title":, "Rocketman"
"createdAt": "2023-01-11T22:06:43.719000000Z",
"matchedAt": "2023-01-11T22:13:00.177000000Z",
"updatedAt": "2023-01-11T22:13:00.177000000Z"
}  

#질문❓ ON MATCH SET과 SET의 차이가 뭐지?

 

DELETE - Node, Relationship 삭제

 데이터베이스의 데이터 삭제를 위해서는 우선 해당 대상을 탐색부터 해야 함
관계를 가진 노드를 그냥 DELETE하면 에러가 발생하게 됨
  • 노드 없이 남겨지는 관계가 없도록 하기 위함임
 

노드 / 관계 삭제

MATCH (p:Person) 
WHERE p.name = 'Jane Doe' 
DELETE p
//
MATCH (p:Person {name: 'Jane Doe'})-[r:ACTED_IN]->(m:Movie {title: 'The Matrix'})
DELETE r
RETURN p, m
 

DETACH DELETE

노드에 딸린 관계까지 함께 삭제함

MATCH (p:Person {name: 'Jane Doe'}) 
DETACH DELETE p

모든 노드 삭제하기

  • 메모리 사용량이 큰 쿼리임
    You should only do this on relatively small databases as trying to do this on a large database will exhaust memory.
MATCH (n)
DETACH DELETE n
 

REMOVE - Label 삭제

1과 2는 같은 node를 반환함.

/1/
MATCH (p:Person {name: 'Jane Doe'})
/2/
MATCH (p:Person:Developer {name: 'Jane Doe'})

REMOVE p:Developer 
RETURN p
 

CALL

label 리스트 확인

CALL db.labels()
 

참고자료: Neo4j 그래프아카데미, Neo4j Fundamentals https://graphacademy.neo4j.com/courses/neo4j-fundamentals/

 

반응형