반응형
기본 표기법
(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/
반응형
'데이터베이스 Database > 그래프DB_Neo4j' 카테고리의 다른 글
[Neo4j 기초] CSV 파일 임포트해오기 (1) | 2023.02.21 |
---|---|
[Neo4j 기초] 그래프 DB 모델링 - 중복 데이터 생성/삭제 (1) | 2023.02.14 |
[Neo4j 기초] 그래프 DB 모델링 - 노드/관계 생성 (0) | 2023.02.09 |