FILTER#
GQL 절 2.18에 추가
조건을 만족하는 행만 남깁니다. Cypher의 WITH … WHERE와 달리 투영이 필요하지 않은 독립적인
필터입니다.
개요#
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
설명#
FILTER는 조건이 참이 아닌 행을 모두 버리고, 그 밖의 어떤 것도 바꾸지 않습니다. 그 앞에서 유효
범위에 있던 컬럼이 그 뒤에서도 정확히 그대로입니다. 생략할 수 있는 WHERE는 군더더기 단어입니다.
FILTER x > 1과 FILTER WHERE x > 1은 같은 절로 파싱됩니다.
FILTER는 가운데 절입니다. 쿼리를 시작할 수도, 끝낼 수도 없습니다.앞의 절이 내놓은 것이 무엇이든 그것에 적용되며, 집계하는
WITH의 출력도 포함합니다. 그래서 Cypher 파이프라인의HAVING입니다.FILTER를 이어 쓰면 순서대로 적용되며, 각각 앞의 것이 남긴 행을 더 좁힙니다.조건이 null로 평가되는 행은 SQL에서와 마찬가지로 버려집니다.
매개변수#
- condition
유효 범위의 변수에 대한 조건입니다.
WHERE가 받는 불리언 표현식이면 무엇이든 되고,EXISTS { }나COUNT { }같은 서브쿼리 값 표현식도 됩니다. 조건은 불리언이어야 합니다. 숫자만 쓰면argument of FILTER must be type boolean, not type integer로 거부되고, 속성만 쓰면cannot cast 2003 (jsonb type numeric) to boolean으로 거부됩니다.
예제#
모든 예제는 예제 데이터셋에서 실행됩니다.
2014년부터의 영화만 남깁니다. 패턴 뒤의 FILTER와 거기 붙은 Cypher의 WHERE는 같은
검사입니다. 탭을 바꿔 비교해 보십시오:
MATCH (m:movie)
FILTER m.year >= 2014
RETURN m.title AS film, m.year AS year ORDER BY year;
MATCH (m:movie)
WHERE m.year >= 2014
RETURN m.title AS film, m.year AS year ORDER BY year;
film | year
----------------------------+------
"Interstellar" | 2014
"Blade Runner 2049" | 2017
"The Matrix Resurrections" | 2021
(3 rows)
두 형태는 실행 계획이 똑같습니다. movie 스캔에 붙는
Filter: (properties.'year' >= '2014'::jsonb)까지 같습니다.
집계를 걸러 내기#
WHERE는 집계하는 RETURN 뒤에 올 수 없고, WITH에 붙이면 투영을 다시 적어야 합니다. FILTER는
그 집계를 곧바로 검사합니다:
MATCH (p:person)-[:acted_in]->(m:movie)
WITH p.name AS actor, count(m) AS films
FILTER films >= 3
RETURN actor, films ORDER BY actor;
actor | films
-------------------------+-------
"Arnold Schwarzenegger" | 3
"Keanu Reeves" | 4
(2 rows)
두 단계로 행을 좁히기#
각 FILTER는 그 앞의 것이 남긴 행만 봅니다:
MATCH (m:movie)
FILTER m.genre = 'Sci-Fi'
FILTER m.year < 1998
RETURN m.title AS film ORDER BY film;
film
---------------------
"Blade Runner"
"Gattaca"
"The Fifth Element"
"Total Recall"
(4 rows)
쓰기 절이 내놓은 행을 걸러 내기#
쓰기 뒤의 FILTER는 쓰기를 먼저 실행하고, 그다음 흘러가는 행을 제한합니다. 아래에서는 SET이 그
영화에 손을 대고 FILTER가 그 행을 보고할지 결정합니다:
MATCH (m:movie {title: 'The Matrix'})
SET m.reviewed = true
FILTER m.year = 1999
RETURN m.title AS film, m.reviewed AS reviewed;
film | reviewed
--------------+----------
"The Matrix" | true
(1 row)
참고#
FILTER는 쿼리를 시작할 수 없으므로, 그것으로 시작하는 문장은 절 배치 오류가 아니라 구문
오류입니다:
FILTER true;
ERROR: syntax error at or near "FILTER"
LINE 1: FILTER true;
^
FILTER가 맨 앞에 오는 곳이 하나 있는데 NEXT 뒤이며, 거기서는 경계를 넘어 전달된
테이블에 대해 동작합니다. FILTER로 쿼리를 끝내면
Cypher query must end with RETURN, FINISH or update clause가 나옵니다.
filter는 예약되지 않은 키워드이므로, 변수·레이블·속성 이름으로 계속 쓸 수 있습니다.
호환성#
GQL 적합성
GQL의 FILTER 문장(ISO/IEC 39075:2024 §14.6), 기능 GQ08 “FILTER statement”를 구현합니다.
지원 — 표준이 정의하는 두 표기
FILTER <search condition>과FILTER WHERE <search condition>을, 맨 앞과 맨 끝이 아닌 모든 자리에서.미지원 — 이 하위 절에는 없습니다.
FILTER는 완전합니다.
진행 상황은 GQL 적합성 표에서 확인하십시오.
openCypher#
openCypher에는 FILTER 문장이 없습니다. 대응하는 것은 MATCH나 WITH에 붙인 WHERE이고,
AgensGraph는 그 둘을 그대로 받습니다. 이와 무관한 openCypher의 리스트 함수
filter(x IN list WHERE predicate)도 받지 않습니다. 괄호 안의 WHERE가 구문 오류입니다. 대신
리스트 컴프리헨션을 쓰십시오: [x IN m.embedding WHERE x > 0].