## 예시 데이터 불러오기 : 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); ```