260831

u·2026년 8월 31일

TIL

목록 보기
11/30

Cypher 심화

1. WITH + 집계

WITH s, sum(p.cnt) AS 곡재생
→ s별로 집계하고 다음 단계에는 s, 곡재생만 전달한다.

WITH other, 공유청취자수, count(DISTINCT x) AS 전체청취자수
→ 이전에 만든 변수도 다음 단계에서 쓰려면 WITH에 다시 적어야 한다.

WITH s, sum(p.cnt) AS 곡재생 → WITH 장르, 곡재생 → RETURN 장르, sum(곡재생)
→ 곡별 집계 후 장르별 집계처럼 그룹 기준이 바뀌면 2단계 집계한다.

RETURN 장르, count(*) AS 곡수, sum(곡재생) AS 총재생
→ 집계함수와 같이 있는 일반 변수 장르가 자동으로 그룹핑 기준이 된다.

2. 그룹핑 / 중복

WITH m, sum(x.qty) AS 총주문수
→ 여러 주문 관계를 메뉴별로 먼저 묶어 메뉴별 총 주문량을 만든다.

count(DISTINCT l)
→ 같은 대상이 여러 번 매칭될 수 있을 때 중복을 제거하고 센다.

WITH a, max(곡재생) AS 최고재생
→ 곡별 재생수를 먼저 계산한 뒤 아티스트별 최고 재생수를 구한다.

3. collect / UNWIND

WITH a, collect(s.title) AS 곡목록
→ 아티스트별 여러 곡을 하나의 리스트로 묶는다.

size(곡목록)
→ collect()로 만든 리스트의 원소 개수를 센다.

UNWIND 곡목록 AS 곡
→ 리스트를 다시 원소 하나당 한 행으로 펼친다.

collect(a.name)
→ 그룹 기준까지 collect()하면 문자열이 아닌 리스트가 되므로 주의한다.

4. 문자열 가공

trim(split(s.tag, '|')[0])
→ | 기준 첫 번째 값을 꺼내고 앞뒤 공백을 제거한다.

toInteger(trim(split(s.tag, '|')[1]))
→ 두 번째 값을 꺼내 공백을 제거한 뒤 정수로 변환한다.

WITH s, toInteger(...) AS 연도 WHERE 연도 >= 2022
→ 가공한 값을 WITH에서 변수로 만든 뒤 WHERE 조건에 사용할 수 있다.

5. 속성 vs 계산 변수

WITH s, sum(p.cnt) AS 합
→ 합은 DB 속성이 아니라 쿼리에서 만든 변수이므로 그냥 합으로 사용한다.

SET s.is_hit = (합 >= 100)
→ 계산 결과를 노드 속성으로 저장할 때는 노드.속성으로 지정한다.

6. 인덱스

CREATE INDEX customer_name_idx IF NOT EXISTS FOR (c:Customer) ON (c.name)
→ Customer.name 검색용 RANGE 인덱스를 생성한다.

CREATE TEXT INDEX song_title_text IF NOT EXISTS FOR (s:Song) ON (s.title)
→ CONTAINS 같은 문자열 검색에 적합한 TEXT 인덱스를 생성한다.

CALL db.awaitIndexes()
→ 생성한 인덱스가 사용 가능한 상태가 될 때까지 기다린다.

SHOW INDEXES YIELD name, type
→ 인덱스 이름과 종류를 조회한다.

WHERE type <> 'LOOKUP'
→ 기본 LOOKUP 인덱스를 제외한다.

WHERE name = 'song_title_text' RETURN type
→ 특정 인덱스의 종류를 조회한다.

MATCH (l:Listener {name:'하늘'})
→ 특정 라벨에 만든 인덱스를 활용하려면 조회에서도 해당 라벨을 명시해야 한다.

7. 제약 + 인덱스

CREATE CONSTRAINT ... REQUIRE s.title IS UNIQUE
→ UNIQUE 제약은 중복을 막고 이를 지원하는 RANGE 인덱스가 함께 생성될 수 있다.

SHOW INDEXES YIELD name, type, owningConstraint
→ owningConstraint로 제약에 의해 만들어진 인덱스인지 확인할 수 있다.

8. 랭킹 / 정렬

ORDER BY 총재생 DESC, 곡 LIMIT 3
→ 총재생 내림차순 → 동률이면 곡 이름 오름차순 → 상위 3개만 조회한다.

WITH a, max(곡재생) AS 최고재생
→ 그룹별 대표값을 먼저 만든 뒤 그 값을 기준으로 순위를 매길 수 있다.


WITH 그룹기준, 집계함수(...) AS 결과
→ 집계함수 옆에 남아 있는 일반 변수가 그룹핑 기준이다.

WITH a, b
→ WITH에 적지 않은 변수는 다음 단계에서 사라진다.

곡별 sum → 장르별 sum
→ 그룹 기준이 바뀌면 1차 집계 후 다시 2차 집계한다.

collect() → UNWIND
→ collect는 여러 행을 리스트로 접고 UNWIND는 리스트를 여러 행으로 펼친다.

변수.속성
→ DB에 저장된 속성에 접근한다.

WITH ... AS 변수명
→ 쿼리 중간에 만든 값은 . 없이 변수명 그대로 사용한다.

0개의 댓글