## 예시 데이터 불러오기 : Movie
```cypher
:play movie-graph
```
![[Pasted image 20240812111702.png]]
![[Pasted image 20240812135404.png]]
## WITH
```cypher
...
WITH [노드, 관계, 속성, 집계 함수] (AS [Alias])
...
```
- 표준 SQL의 `WITH`과는 용법이 조금 다르다.
- 표준 SQL의 `WITH`은 쿼리 앞 단에 쓰이지만, Cypher에서는 쿼리 중간에서도 쓰인다. 쿼리 중간에 쓰일 경우, `WITH`에서 명시하지 않은 변수는 이어지는 쿼리에서 사용할 수 없다.
- 집계 함수나 일반 value를 사용하는 경우, [[2. 그래프 데이터 모델 CRUD 익히기#READ|RETURN의 경우처럼]] 같이 쓰이는 노드, 관계, 속성을 기준으로 자동 Grouping되어 집계된다.([[3. 주요 Clauses 익히기#예시|예시]] 참조)
### 예시
```cypher
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WITH m, count(p) AS actor_count
WHERE actor_count > 2
RETURN *
```
![[Pasted image 20240812150343.png]]
![[Pasted image 20240812151301.png]]
- 따로 Grouping에 대한 내용이 없지만, `count(p)`를 집계할 때 자동으로 m(Movie)를 기준으로 집계가 되는 걸 볼 수 있다.
## FOREACH
```cypher
FOREACH([Item] IN [List] | [쿼리])
```
- Neo4j에서는 [리스트 자료형](https://neo4j.com/docs/cypher-cheat-sheet/5/auradb-enterprise/#_lists)이 존재하고 in-line 방식의 선언이나 브라켓 표기법(`[i]`)을 지원하기 때문에 표준 SQL보다 반복문 쿼리를 돌리기 편하다.
- 리스트 선언을 할 때 그래프 패턴을 통한 리스트 선언도 가능하다.
### 예시
```cypher
WITH
range(2000, 2024) AS years,
range(1, 12) AS months
FOREACH(year IN years |
CREATE (y:Year:Time {value: year})
FOREACH(month IN months |
CREATE (y)-[:HAS]->(m:Month:Time {value: month})
FOREACH(day IN
CASE
WHEN month IN [1, 3, 5, 7, 8, 10, 12] THEN range(1, 31)
WHEN month IN [4, 6, 9, 11] THEN range(1, 30)
WHEN month = 2 AND (year % 4 = 0 AND (year % 100 <> 0 OR year % 400 = 0)) THEN range(1, 29)
ELSE range(1, 28)
END |
CREATE (m)-[:HAS]->(d:Day:Time {
value: day,
date: date({ year: year, month: month, day: day })
})
)
)
)
```
- 2000년부터 2024년까지 `Year`, `Month`, `Day` 노드를 트리 구조로 생성한다. 총 9457개의 노드가 생성된다.
![[Pasted image 20240821101555.png]]
![[Pasted image 20240821101543.png]]
```cypher
MATCH (n:Time)
RETURN n
```
- 위 쿼리를 실행해도 위와 같은 그래프가 나오지 않는데, 웹 인터페이스에는 `LIMIT`와 별개로 시각화되는 노드에 대한 설정이 따로 존재하기 때문이다. `Initial Node Display` 설정을 올리면 위와 같은 그래프가 생성된다.
##
![[Pasted image 20240821093931.png]]
```cypher
MATCH (y:Year {value : 2020}) -->* (t:Time)
RETURN *
```
- `-->*`는 관계와 depth에 대한 조건 없이 후손인 경우를 의미한다. 2020년의 후손 노드는 `Month`와 `Day`이므로 위 쿼리는 1월 1일부터 12월 31일까지 날짜를 트리 구조로 반환한다.
```cypher
CREATE INDEX date_index FOR (d:Day) ON (d.date);
```