Cypher는 [[Neo4j]] 그래프 데이터베이스에서 사용되는 쿼리 언어로, 그래프 데이터를 직관적으로 조회하고 조작할 수 있게 설계되었습니다. 아래에서 Cypher의 기본 개념과 문법을 설명해 드리겠습니다. ## 기본 구조 Cypher는 패턴 매칭을 기반으로 하며, 노드와 관계를 시각적으로 표현합니다: - 노드(Node): 원형 괄호 `()` 로 표현 - 관계(Relationship): 대시와 화살표 `-[]->` 로 표현 - 속성(Property): 중괄호 `{}` 안에 키-값 쌍으로 표현 ## 주요 명령어 ### 1. MATCH 그래프에서 특정 패턴을 찾는 데 사용됩니다. ```cypher // 모든 Person 노드 찾기 MATCH (p:Person) RETURN p // 특정 속성을 가진 노드 찾기 MATCH (p:Person {name: 'John'}) RETURN p ``` ### 2. CREATE 새로운 노드나 관계를 생성합니다. ```cypher // 새 노드 생성 CREATE (p:Person {name: 'John', age: 30}) // 노드 간 관계 생성 MATCH (a:Person {name: 'John'}), (b:Person {name: 'Mary'}) CREATE (a)-[:FRIENDS_WITH]->(b) ``` ### 3. RETURN 쿼리 결과를 반환합니다. ```cypher MATCH (p:Person) RETURN p.name, p.age ``` ### 4. WHERE 조건을 지정합니다. ```cypher MATCH (p:Person) WHERE p.age > 25 RETURN p ``` ### 5. DELETE 노드나 관계를 삭제합니다. ```cypher // 관계 삭제 MATCH (a)-[r:FRIENDS_WITH]->(b) DELETE r // 노드 삭제 (연결된 모든 관계도 함께 삭제해야 함) MATCH (p:Person {name: 'John'}) DETACH DELETE p ``` ### 6. SET 속성을 설정하거나 업데이트합니다. ```cypher MATCH (p:Person {name: 'John'}) SET p.age = 31, p.updated = true ``` ## 복잡한 쿼리 예제 ### 관계 탐색 ```cypher // John의 친구들 찾기 MATCH (p:Person {name: 'John'})-[:FRIENDS_WITH]->(friend) RETURN friend.name // John의 친구의 친구 찾기 (2단계 관계) MATCH (p:Person {name: 'John'})-[:FRIENDS_WITH]->()-[:FRIENDS_WITH]->(fof) RETURN DISTINCT fof.name ``` ### 집계 함수 ```cypher // 각 사람의 친구 수 계산 MATCH (p:Person)-[:FRIENDS_WITH]->(friend) RETURN p.name, COUNT(friend) AS friendCount ORDER BY friendCount DESC ``` ### 경로 찾기 ```cypher // 두 사람 간의 최단 경로 찾기 MATCH p = shortestPath((a:Person {name: 'John'})-[*]-(b:Person {name: 'Mary'})) RETURN p ``` ## 실행 계획 확인 쿼리 최적화를 위해 실행 계획을 확인할 수 있습니다. ```cypher EXPLAIN MATCH (p:Person)-[:FRIENDS_WITH]->(friend) RETURN p.name, COUNT(friend) ``` Cypher는 SQL과 유사한 구조를 가지고 있지만, 그래프 데이터 모델에 맞게 설계되어 복잡한 관계 패턴을 쉽게 표현할 수 있다는 점이 큰 장점입니다. 이러한 특징으로 인해 연결된 데이터를 다루는 작업에서 매우 효과적입니다.