{#predicate-predicate-functions} # 조건 함수 예·아니요로 답하는 함수들입니다. 리스트 수량자 네 개, `all`·`any`·`none`·`single`은 평범한 호출이 아니라 문법 형태입니다. 각각 변수, 리스트, `WHERE` 절을 받습니다. 각각 요소별 결과를 삼치 논리로 줄이므로, null을 담은 리스트는 답을 거짓이 아니라 null로 만들 수 있습니다. 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다. {#predicate-all} ## all ``` all ( variable IN list WHERE predicate ) -> boolean ``` 리스트의 모든 요소에 대해 조건이 성립하면 참을 반환합니다. **고려할 점** - 빈 리스트는 참을 반환합니다. - 어떤 요소에서 조건이 null이고 나머지 전부에서 참이면 결과는 null입니다. 거짓인 요소가 하나 있으면 다른 것이 null이든 결과는 거짓입니다. - 조건은 모든 요소에 대해 평가되며, 조기에 끊는 것이 없습니다. - 이 호출은 `cypher_all()`로 컴파일됩니다. 조건 안에서 나온 오류 메시지에는 그 이름이 실립니다. ```cypher MATCH (m:movie) WHERE all(x IN m.embedding WHERE x > -0.1) RETURN m.title ORDER BY m.title; ``` ``` title --------------------- "Blade Runner 2049" ``` {#predicate-any} ## any ``` any ( variable IN list WHERE predicate ) -> boolean ``` 리스트의 요소 중 적어도 하나에 대해 조건이 성립하면 참을 반환합니다. **고려할 점** - 빈 리스트는 거짓을 반환합니다. - 참인 요소가 하나 있으면 다른 요소가 null이어도 결과는 참입니다. - 참인 요소가 없고 null인 것이 하나라도 있으면 결과는 null입니다. ```cypher MATCH (p:person)-[:acted_in]->(m:movie) WITH p, collect(m.genre) AS genres WHERE any(g IN genres WHERE g = 'Adventure') RETURN p.name AS actor; ``` ``` actor ------------- "Sam Neill" ``` {#predicate-exists} ## exists ``` exists ( pattern ) -> boolean exists ( property_reference ) -> boolean ``` 패턴을 주면 그 패턴이 적어도 한 번 일치할 때 참을 반환합니다. 속성 참조를 주면 그 속성이 있고 null이 아닐 때 참을 반환합니다. **고려할 점** - 두 형태는 하나의 함수의 오버로드가 아니라 서로 다른 구문입니다. 패턴 형태는 `EXISTS` 서브쿼리가 되고, 속성 형태는 `IS NOT NULL` 검사가 됩니다. - 속성 형태의 인자는 `m.year` 같은 속성 참조여야 합니다. 임의의 표현식은 패턴으로 읽혀 파싱에 실패합니다. - `exists()` 안의 패턴은 아래의 `(p)`처럼 감싸는 쿼리의 변수를 바인딩할 수 있지만, 그것이 도입하는 변수는 밖에서 보이지 않습니다. ```cypher MATCH (m:movie {title:'Inception'}) RETURN exists(m.year) AS has_year, exists(m.budget) AS has_budget; ``` ``` has_year | has_budget ----------+------------ t | f ``` ```cypher MATCH (p:person) WHERE exists((p)-[:directed]->()) RETURN p.name ORDER BY p.name LIMIT 3; ``` ``` name --------------------- "Andrew Niccol" "Christopher Nolan" "Denis Villeneuve" ``` {#predicate-isempty} ## isEmpty ``` isEmpty ( value jsonb ) -> boolean ``` 리스트에 요소가 없거나 맵에 키가 없으면 참을 반환합니다. **고려할 점** - 인자는 `jsonb`로 해석돼야 합니다. 문자열 리터럴만 쓰면 그것은 `unknown`이고 range·multirange의 `isempty`에도 일치합니다: ```cypher RETURN isEmpty(''); ``` ``` ERROR: function isempty(unknown) is not unique LINE 1: RETURN isEmpty(''); ^ HINT: Could not choose a best candidate function. You might need to add explicit type casts. ``` 형 변환을 하십시오: `isEmpty(''::jsonb)`. - 속성 참조는 이미 `jsonb`이므로 `isEmpty(n.tags)`에는 형 변환이 필요하지 않습니다. - 빈 문자열에 대해 참을 반환합니다. 그것이 빈 `jsonb` 스칼라입니다. ```cypher RETURN isEmpty([]) AS empty_list, isEmpty([1]) AS one_element, isEmpty({}) AS empty_map; ``` ``` empty_list | one_element | empty_map ------------+-------------+----------- t | f | t ``` {#predicate-none} ## none ``` none ( variable IN list WHERE predicate ) -> boolean ``` 리스트의 어떤 요소에 대해서도 조건이 성립하지 않으면 참을 반환합니다. [`any`](#predicate-any)의 부정입니다. **고려할 점** - 빈 리스트는 참을 반환합니다. - 참인 요소가 하나 있으면 결과는 거짓입니다. 참인 요소가 없고 null인 것이 하나라도 있으면 결과는 null입니다. ```cypher MATCH (m:movie) WHERE none(x IN m.embedding WHERE x > 0.4) RETURN count(*) AS films; ``` ``` films ------- 15 ``` {#predicate-single} ## single ``` single ( variable IN list WHERE predicate ) -> boolean ``` 리스트의 요소 중 정확히 하나에 대해 조건이 성립하면 참을 반환합니다. **고려할 점** - 빈 리스트는 거짓을 반환합니다. - 어떤 요소에서든 결과가 null이면 답 전체가 null입니다. 그 null이 두 번째 일치였을 수도 있기 때문입니다. ```cypher MATCH (p:person)-[:directed]->(m:movie) WITH p, collect(m.year) AS years WHERE single(y IN years WHERE y > 2010) RETURN p.name AS director, years ORDER BY p.name; ``` ``` director | years ---------------------+-------------------------- "Christopher Nolan" | [2010, 2014] "Denis Villeneuve" | [2017] "Joss Whedon" | [2012] "Lana Wachowski" | [2003, 1999, 2021, 2003] "Neill Blomkamp" | [2013] ``` {#predicate-three-valued-results-side-by-side} ## 삼치 결과 나란히 보기 수량자들의 차이는 리스트가 null을 담고 있을 때와 리스트가 비어 있을 때 가장 크게 드러납니다. 아래 두 행은 실제 출력입니다: ```cypher RETURN all(x IN [1, null] WHERE x > 0) AS every, any(x IN [1, null] WHERE x > 0) AS some, none(x IN [null] WHERE x > 0) AS not_any, single(x IN [1, null] WHERE x > 0) AS exactly_one; ``` ``` every | some | not_any | exactly_one -------+------+---------+------------- | t | | ``` ```cypher RETURN all(x IN [] WHERE x = 0) AS every, any(x IN [] WHERE x = 0) AS some, none(x IN [] WHERE x = 0) AS not_any, single(x IN [] WHERE x = 0) AS exactly_one; ``` ``` every | some | not_any | exactly_one -------+------+---------+------------- t | f | t | f ``` `RETURN`은 불리언 컬럼을 `jsonb`로 감싸지 않고 `boolean`으로 둡니다. 그래서 이것들은 `true`·`false`· `null`이 아니라 `t`·`f`와 null에 해당하는 빈 칸으로 출력됩니다. {#predicate-compatibility} ## 호환성 {#predicate-opencypher} ### openCypher 속성에 대한 `exists()`는 `IS NOT NULL`의 openCypher 옛 표기입니다. 패턴 컴프리헨션과 `exists { ... }` 블록 형태는 지원되지 않습니다. 위의 패턴 형태나 [서브쿼리 표현식](../clauses/subquery-expressions.md)을 쓰십시오. {#predicate-see-also} ## 관련 항목 - [모든 함수](all-functions.md) — 모든 함수를 한 표에 - [서브쿼리 표현식](../clauses/subquery-expressions.md) — `EXISTS`, `COUNT`, `COLLECT` - [리스트 함수](list.md) — 이 수량자들이 대상으로 삼는 리스트 만들기