https://neo4j.com/docs/getting-started/cypher/
Neo4j’s declarative and GQL conformant query language
Neo4j의 Cypher 설명란에 가보면 Cypher는 GQL 형식 쿼리 언어라고 기재되어 있다. 그렇다면 GQL은 무엇일까?
GQL (Graph Query Language) is a standardized ISO/IEC 39075 language released in April 2024 designed for querying property graph databases. It offers a SQL-like, declarative syntax for intuitive pattern matching to analyze complex relationships, similar to Neo4j's Cypher. Note: GQL is distinct from GraphQL, which is for API data fetching.
GQL은 그래프 데이터베이스를 위해 만들어진 쿼리 언어이고 Cypher는 그런 GQL형식과 비슷하지만 Neo4j에 맞추어 만든 언어임을 알 수 있었다.
Cypher는 ASCII-art 타입의 문법을 가지고 있다고 하는데, 아스키 아트 타입이라는 건 대체 또 무엇일까?
ASCII-art 타입의 문법
(:nodes)-[:ARE_CONNECTED_TO]->(:otherNodes)
() 괄호는 (:Nodes)를 나타내기 위해 쓰이며, [] 괄호는 노드사이의 관계를 나타내기 위해 쓰인다. 이 쿼리 문법을 이용하여 Create, read, update, delete (CRUD) 작업을 할 수 있다.
Cypher는 일반언어와 비슷한 구조를 가지며 문법 또한 그래프와 시각적으로 닮도록 만들어졌다.

"Sally likes Graphs. Sally is friends with John. Sally works for Neo4j."
(:Sally)-[:LIKES]->(:Graphs)
(:Sally)-[:IS_FRIENDS_WITH]->(:John)
(:Sally)-[:WORKS_FOR]->(:Neo4j)
모든 Person이라는 라벨을 가진 모드를 p라는 변수에 연결시키고 싶은 경우
(p:Person)
모든 Person 노드 조회
MATCH (p:Person)
RETURN p
관계
Cypher에서 관계는 [] 괄호로 표현되며 화살표(화살표는 필수가 아니라 선택사항이다)는 방향을 가리킨다. (예: (Node1) - [] - (Node2))
화살표는 왼쪽이나 오른쪽으로 방향을 가르키는 것이 가능하다.
(p:Person)-[:LIKES]->(t:Technology)
(p:Person)<-[:LIKES]-(t:Technology)
혹은 방향을 가르키지 않는 것도 가능하다.
MATCH (p:Person)-[:LIKES]-(t:Technology)
방향을 가르키지 않는 관계
방향을 가르키지 않는 관계는 방향이 없다는 것을 의미하는 것은 아니고, 양방향으로 움직일 수 있다는 것을 의미한다. 방향을 모를 시의 쿼리에 이 방향을 가르키지 않는 관계를 사용할 수 있다. 그러면 Cypher는 특정된 관계 타입으로 연결되어 있는 노드들을 방향을 가리지 않고 체크하게 된다.
관계의 종류

위의 그래프에서 관계는:
[:LIKES] - communicates that Sally (a node) likes graphs (another node).
[:IS_FRIENDS_WITH] - communicates that Sally is friends with John.
[:WORKS_FOR] - communicates that Sally works for Neo4j.
관계 변수
아래에서 p,r,t와 같은 것들이 변수이고, 설정 뒤에는 그 뒤의 쿼리문에서 사용할 수 있다.
MATCH (p:Person)-[r:LIKES]->(t:Technology)
RETURN p,r,t
This query specifies variables for both the node labels (p for Person and t for Technology) and the relationship type (r for :LIKES). In the return clause, you can then use the variables (i.e. p, r, and t) to return the bound entities.
결과:

프로퍼티
Value와 type에 대한 자세한 설명은: https://neo4j.com/docs/cypher-manual/current/values-and-types/

Sally와 john은 Person 노드의 변수(variable)이며 name 프로퍼티와 "Sally"와 "John" 이라는 프로퍼티 값을 갖는다.
이러한 내용을 그래프에 추가하려면:
CREATE (sally:Person {name:'Sally'})-[r:IS_FRIENDS_WITH]->(john:Person {name:'John'})
RETURN sally, r, john
프로퍼티는 {} 괄호로 감싸지며 키 다음에 콜론이 따라온다. 그리고 값(value)은 한따옴표나 쌍따옴표로 감싸지게 된다.
만약에 이미 Sally와 John이 존재하지만 바꾸고 싶을 때는 리팩토링(Refactoring)이 필요하다.
패턴
It is the mechanism used to navigate, describe, and extract data from a graph by applying a declarative pattern.
(sally:Person {name:'Sally'})-[l:LIKES]->(g:Technology {type: "Graphs"})
패턴을 구문으로 만들어 각각 다른 용도로 사용할 수 있다.
만약에 CREATE과 같이 사용하려면:
CREATE (sally:Person {name: "Sally"})-[r:LIKES]->(t:Technology {type: "Graphs"})
만들어진 뒤 조회:
MATCH (sally:Person {name: "Sally"})-[r:LIKES]->(t:Technology {type: "Graphs"})
RETURN sally,r,t
패턴 변수
노드와 관계와 마찬가지로 변수를 사용할 수 있다.
MATCH p = (sally:Person {name: "Sally"})-[r:LIKES]->(t:Technology {type: "Graphs"})
RETURN p
Neo4j는 1시간 짜리 Cypher 코스를 제공한다. 다음에 neo4j를 사용할 기회가 있다면 들어보는 것도 좋겠다.