

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Neptune에 적용되는 openCypher 사양 규정 준수
<a name="feature-opencypher-compliance"></a>

openCypher의 Amazon Neptune 릴리스는 일반적으로 현재 openCypher 사양([Cypher 쿼리 언어 참조 버전 9](https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf))에 정의된 절, 연산자, 표현식, 함수 및 구문을 지원합니다. openCypher에 대한 Neptune 지원의 한계와 차이점은 다음과 같습니다.

 Amazon Neptune은 openCypher 사양 범위를 벗어나는 여러 기능도 지원합니다. 자세한 내용은 [Amazon Neptune의 openCypher 확장](access-graph-opencypher-extensions.md) 섹션을 참조하세요.

**참고**  
Cypher의 현재 구현된 Neo4j에는 위에서 언급한 openCypher 사양에서 지원하지 않는 기능이 포함되어 있습니다. 현재 Cypher 코드를 Neptune으로 마이그레이션하는 경우 자세한 내용은 [Neo4j에 대한 Neptune의 호환성](migration-compatibility.md) 및 [Neptune의 OpenCypher에서 실행되도록 Cypher 쿼리를 재작성](migration-opencypher-rewrites.md)을 참조하세요.

## Neptune의 openCypher 절 지원
<a name="opencypher-compliance-clauses"></a>

Neptune은 별다른 언급이 없으면 다음 절을 지원합니다.
+ `MATCH`   –   지원되며, *`shortestPath()`* 및 *`allShortestPaths()`*는 현재 지원되지 않습니다.
+ `OPTIONAL MATCH`
+ *`MANDATORY MATCH`*   –   현재 Neptune에서는 지원되지 **않습니다**. 하지만 Neptune은 `MATCH` 쿼리에서 [사용자 지정 ID 값](access-graph-opencypher-extensions.md#opencypher-compliance-custom-ids)을 지원합니다.
+ `RETURN`   –   지원되지만, `SKIP` 또는 `LIMIT`에 대해 정적이 아닌 값과 함께 사용하는 경우는 예외입니다. 예를 들어, 다음은 현재 작동하지 않습니다.

  ```
  MATCH (n)
  RETURN n LIMIT toInteger(rand())    // Does NOT work!
  ```
+ `WITH`   –   지원되지만, `SKIP` 또는 `LIMIT`에 대해 정적이 아닌 값과 함께 사용하는 경우는 예외입니다. 예를 들어, 다음은 현재 작동하지 않습니다.

  ```
  MATCH (n)
  WITH n SKIP toInteger(rand())
  WITH count() AS count
  RETURN count > 0 AS nonEmpty    // Does NOT work!
  ```
+ `UNWIND`
+ `WHERE`
+ `ORDER BY`
+ `SKIP`
+ `LIMIT`
+ `CREATE`   –   Neptune을 사용하면 `CREATE` 쿼리에 [사용자 지정 ID 값](access-graph-opencypher-extensions.md#opencypher-compliance-custom-ids)을 만들 수 있습니다.
+ `DELETE`
+ `SET`
+ `REMOVE`
+ `MERGE`   –   Neptune은 `MERGE` 쿼리에서 [사용자 지정 ID 값](access-graph-opencypher-extensions.md#opencypher-compliance-custom-ids)을 지원합니다.
+ *`CALL[YIELD...]`*   –   현재 Neptune에서는 지원되지 **않습니다**.
+ `UNION, UNION ALL`   –   읽기 전용 쿼리는 지원되지만, 변형 쿼리는 현재 지원되지 **않습니다**.
+  `USING` - `USING`은 엔진 버전 [1.3.2.0](https://docs.aws.amazon.com//neptune/latest/userguide/engine-releases-1.3.2.0.html)에서 지원됩니다. 자세한 내용은 [쿼리 힌트](https://docs.aws.amazon.com//neptune/latest/userguide/opencypher-query-hints.html)를 참조하세요.

## Neptune의 openCypher 연산자 지원
<a name="opencypher-compliance-operators"></a>

Neptune은 별다른 언급이 없으면 다음 연산자를 지원합니다.

**일반 연산자**
+ `DISTINCT`
+ 중첩된 리터럴 맵의 속성에 액세스하는 `.` 연산자.

**수학적 연산자**
+ `+` 더하기 연산자.
+ `-` 빼기 연산자.
+ `*` 곱셈 연산자.
+ `/` 나눗셈 연산자.
+ `%` 모듈로 나눗셈 연산자.
+ `^` 거듭제곱 연산자는 *지원되지 않습니다*.

**비교 연산자**
+ `=` 더하기 연산자.
+ `<>` 부등식 연산자.
+ 인수 중 하나가 경로, 목록 또는 맵인 경우를 제외하고 `<`보다 작음 연산자가 지원됩니다.
+ 인수 중 하나가 경로, 목록 또는 맵인 경우를 제외하고 `>`보다 큼 연산자가 지원됩니다.
+ 인수 중 하나가 경로, 목록 또는 맵인 경우를 제외하고 `<=`보다 작거나 같음 연산자가 지원됩니다.
+ 인수 중 하나가 경로, 목록 또는 맵인 경우를 제외하고 `>=`보다 크거나 같음 연산자가 지원됩니다.
+ `IS NULL`
+ `IS NOT NULL`
+ `STARTS WITH`는 검색 중인 데이터가 문자열인 경우 지원됩니다.
+ `ENDS WITH`는 검색 중인 데이터가 문자열인 경우 지원됩니다.
+ `CONTAINS`는 검색 중인 데이터가 문자열인 경우 지원됩니다.

**부울 연산**
+ `AND`
+ `OR`
+ `XOR`
+ `NOT`

**문자열 연산자**
+ `+` 연결 연산자.

**목록 연산자**
+ `+` 연결 연산자.
+ `IN`(목록에 항목이 있는지 확인)

## Neptune의 openCypher 표현식 지원
<a name="opencypher-compliance-expressions"></a>

Neptune은 별다른 언급이 없으면 다음 표현식을 지원합니다.
+ `CASE`
+ 이 `[]` 표현식은 현재 Neptune에서 노드, 관계 또는 맵 내에서 동적으로 계산된 속성 키에 액세스하는 데 지원되지 **않습니다**. 예를 들어, 다음은 작동하지 않습니다.

  ```
  MATCH (n)
  WITH [5, n, {key: 'value'}] AS list
  RETURN list[1].name
  ```

## Neptune의 openCypher 함수 지원
<a name="opencypher-compliance-functions"></a>

Neptune은 별다른 언급이 없으면 다음 함수를 지원합니다.

**조건자 함수**
+ `exists()`

**스칼라 함수**
+ `coalesce()`
+ `endNode()`
+ `epochmillis()`
+ `head()`
+ `id()`
+ `last()`
+ `length()`
+ `randomUUID()`
+ `properties()`
+ `removeKeyFromMap`
+ `size()`   –   이 오버로드된 메서드는 현재 패턴 표현식, 목록 및 문자열에만 사용할 수 있습니다.
+ `startNode()`
+ `timestamp()`
+ `toBoolean()`
+ `toFloat()`
+ `toInteger()`
+ `type()`

**집계 함수**
+ `avg()`
+ `collect()`
+ `count()`
+ `max()`
+ `min()`
+ `percentileDisc()`
+ `stDev()`
+ `percentileCont()`
+ `stDevP()`
+ `sum()`

**함수 나열**
+ [`join()`](access-graph-opencypher-extensions.md#opencypher-compliance-join-function)(목록의 문자열을 단일 문자열로 연결)
+ `keys()`
+ `labels()`
+ `nodes()`
+ `range()`
+ `relationships()`
+ `reverse()`
+ `tail()`

**수학 함수 - 숫자**
+ `abs()`
+ `ceil()`
+ `floor()`
+ `rand()`
+ `round()`
+ `sign()`

**수학 함수 - 대수**
+ `e()`
+ `exp()`
+ `log()`
+ `log10()`
+ `sqrt()`

**수학 함수 - 삼각**
+ `acos()`
+ `asin()`
+ `atan()`
+ `atan2()`
+ `cos()`
+ `cot()`
+ `degrees()`
+ `pi()`
+ `radians()`
+ `sin()`
+ `tan()`

**문자열 함수**
+ [`join()`](access-graph-opencypher-extensions.md#opencypher-compliance-join-function)(목록의 문자열을 단일 문자열로 연결)
+ `left()`
+ `lTrim()`
+ `replace()`
+ `reverse()`
+ `right()`
+ `rTrim()`
+ `split()`
+ `substring()`
+ `toLower()`
+ `toString()`
+ `toUpper()`
+ `trim()`

**사용자 정의 함수**

*사용자 정의 함수*는 현재 Neptune에서 지원되지 **않습니다**.

## Neptune 전용 openCypher 구현 세부 정보
<a name="opencypher-compliance-differences"></a>

다음 섹션에서는 openCypher의 Neptune 구현이 [openCypher 사양](https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf)과 다르거나 그 범위를 넘어설 수 있는 방법을 설명합니다.

### Neptune의 가변 길이 경로(VLP) 평가
<a name="opencypher-compliance-differences-vlp"></a>

가변 길이 경로(`VLP`) 평가를 통해 그래프에서 노드 간 경로를 찾아냅니다. 쿼리에서 경로 길이를 제한하지 않을 수 있습니다. 주기 순환을 방지하기 위해 [openCypher 사양](https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf)에서는 솔루션당 각 엣지를 최대 한 번 순회하도록 지정합니다.

VLP의 경우 Neptune 구현은 속성 등식 필터에 대해 상수 값만 지원한다는 점에서 openCypher 사양에서 벗어납니다. 다음 쿼리를 실행합니다.

```
MATCH (x)-[:route*1..2 {dist:33, code:x.name}]->(y) return x,y
```

`x.name` 속성 등식 필터 값은 상수가 아니므로, 이 쿼리를 실행하면 `Property predicate over variable-length relationships with non-constant expression is not supported in this release.` 메시지와 함께 `UnsupportedOperationException` 결과가 발생합니다.

### Neptune openCypher 구현의 일시적인 지원(Neptune 데이터베이스 1.3.1.0 이하)
<a name="opencypher-compliance-time"></a>

Neptune은 현재 openCypher의 임시 함수를 제한적으로 지원합니다. 임시 유형의 `DateTime` 데이터 유형을 지원합니다.

이 `datetime()` 함수는 다음과 같이 현재 UTC 날짜 및 시간을 가져오는 데 사용할 수 있습니다.

```
RETURN  datetime() as res
```

*날짜*와 *시간* 값은 날짜 및 시간이 모두 아래 지원되는 형식 중 하나로 표현되는 `"`*date*`T`*time*`"` 형식의 문자열에서 구문 분석할 수 있습니다.

**지원되는 날짜 형식**
+ `yyyy-MM-dd`
+ `yyyyMMdd`
+ `yyyy-MM`
+ `yyyy-DDD`
+ `yyyyDDD`
+ `yyyy`

**지원되는 시간 형식**
+ `HH:mm:ssZ`
+ `HHmmssZ`
+ `HH:mm:ssZ`
+ `HH:mmZ`
+ `HHmmZ`
+ `HHZ`
+ `HHmmss`
+ `HH:mm:ss`
+ `HH:mm`
+ `HHmm`
+ `HH`

예제:

```
RETURN datetime('2022-01-01T00:01')      // or another example:
RETURN datetime('2022T0001')
```

참고로 Neptune openCypher의 모든 날짜/시간 값은 UTC 값으로 저장되고 검색됩니다.

Neptune openCypher는 `statement` 시계를 사용합니다. 즉, 쿼리 기간 내내 동일한 인스턴트 시간이 사용됩니다. 동일한 트랜잭션 내의 다른 쿼리는 다른 인스턴트 시간을 사용할 수 있습니다.

Neptune은 `datetime()`에 대한 호출 내에서 함수를 사용하는 것을 지원하지 않습니다. 예를 들어, 다음은 작동하지 않습니다.

```
CREATE (:n {date:datetime(tostring(2021))})  // ---> NOT ALLOWED!
```

Neptune은 `datetime`을 `epochmillis`로 변환하는 `epochmillis()` 함수를 지원합니다. 예제:

```
MATCH (n) RETURN epochMillis(n.someDateTime)
1698972364782
```

Neptune은 현재 `DateTime` 객체에 대한 다른 함수 및 연산자(예: 더하기 및 빼기)를 지원하지 않습니다.

### Neptune openCypher 구현의 일시적인 지원(Neptune Analytics 및 Neptune Database 1.3.2.0 이상)
<a name="opencypher-compliance-time-na"></a>

OpenCypher에 대한 다음 datetime 기능은 Neptune Analytics에 적용됩니다. 또는 랩모드 파라미터 `DatetimeMillisecond=enabled`를 사용하여 Neptune 엔진 릴리스 버전 1.3.2.0 이상에서 다음 datetime 기능을 활성화할Alternatively, you can use the labmode parameter 수 있습니다. 랩모드에서 이 기능을 사용하는 방법에 대한 자세한 내용은 [확장된 날짜/시간 지원](features-lab-mode.md#labmode-extended-datetime-support) 섹션을 참조하세요.
+ 밀리초를 지원합니다. datetime 리터럴은 밀리초가 0인 경우에도 항상 밀리초 단위로 반환됩니다. (이전 동작은 밀리초를 자르는 것이었습니다.)

  ```
  CREATE (:event {time: datetime('2024-04-01T23:59:59Z')})
  
  # Returning the date returns with 000 suffixed representing milliseconds
  MATCH(n:event)
  RETURN n.time as datetime
  
  {
    "results" : [ {
      "n" : {
        "~id" : "0fe88f7f-a9d9-470a-bbf2-fd6dd5bf1a7d",
        "~entityType" : "node",
        "~labels" : [ "event" ],
        "~properties" : {
          "time" : "2024-04-01T23:59:59.000Z"
        }
      }
    } ]
  }
  ```
+ 저장된 속성 또는 중간 결과를 통해 datetime() 함수를 호출할 수 있도록 지원합니다. 예를 들어 이 기능 이전에는 다음 쿼리가 가능하지 않았습니다.

  속성에 대한 datetime():

  ```
  // Create node with property 'time' stored as string
  CREATE (:event {time: '2024-04-01T23:59:59Z'})
  
  // Match and return this property as datetime
  MATCH(n:event)
  RETURN datetime(n.time) as datetime
  ```

  중간 결과에 대한 datetime():

  ```
  // Parse datetime from parameter
  UNWIND $list as myDate
  RETURN datetime(myDate) as d
  ```
+ 이제 위에서 언급한 경우에서 생성된 날짜/시간 속성을 저장할 수도 있습니다.

  한 속성의 문자열 속성에서 다른 속성으로 날짜/시간 저장:

  ```
  // Create node with property 'time' stored as string
  CREATE (:event {time: '2024-04-01T23:59:59Z', name: 'crash'})
  
  // Match and update the same property to datetime type
  MATCH(n:event {name: 'crash'})
  SET n.time = datetime(n.time)
  
  // Match and update another node's property
  MATCH(e:event {name: 'crash'})
  MATCH(n:server {name: e.servername})
  SET n.time = datetime(e.time)
  ```

  날짜/시간 속성을 사용하여 파라미터에서 노드를 일괄 생성합니다.

  ```
  // Batch create from parameter
  UNWIND $list as events
  CREATE (n:crash) {time: datetime(events.time)}
  // Parameter value
  {
    "x":[
      {"time":"2024-01-01T23:59:29", "name":"crash1"},
      {"time":"2023-01-01T00:00:00Z", "name":"crash2"}
    ]
  }
  ```
+ ISO8601 날짜/시간 형식의 더 큰 하위 집합을 지원합니다. 자세한 내용은 아래 섹션을 참조하세요.

지원되는 형식

 날짜/시간 값의 형식은 [Date]T[Time][Timezone]이며, 여기서 T는 구분자입니다. 명시적 시간대가 제공되지 않으면 UTC(Z)가 기본값으로 간주됩니다.

시간대

지원되는 시간대 형식은 다음과 같습니다.
+ \$1/-HH:mm
+ \$1/-HHmm
+ \$1/-HH

 날짜/시간 문자열에 시간대가 있는 것은 선택 사항입니다. 시간대 오프셋이 0인 경우 위의 시간대 접두사 대신 Z를 사용하여 UTC 시간을 나타낼 수 있습니다. 지원되는 시간대 범위는 -14:00\$1\$114:00입니다.

Date

시간대가 없거나 시간대가 UTC(Z)인 경우 지원되는 날짜 형식은 다음과 같습니다.

**참고**  
DDD는 001부터 365(윤년 기준 366)까지의 연도 요일을 나타내는 서수 날짜를 나타냅니다. 예를 들어 2024-002는 2024년 1월 2일을 나타냅니다.
+ `yyyy-MM-dd`
+ `yyyyMMdd`
+ `yyyy-MM`
+ `yyyyMM`
+ `yyyy-DDD`
+ `yyyyDDD`
+ `yyyy`

Z 이외의 시간대를 선택하면 지원되는 날짜 형식이 다음으로 제한됩니다.
+ `yyyy-MM-dd`
+ `yyyy-DDD`
+ `yyyyDDD`

지원되는 날짜 범위는 1400-01-01\$19999-12-31입니다.

Time

시간대가 지정되지 않았거나 시간대가 UTC(Z)인 경우, 지원되는 시간 형식은 다음과 같습니다.
+ `HH:mm:ss.SSS`
+ `HH:mm:ss`
+ `HHmmss.SSS`
+ `HHmmss`
+ `HH:mm`
+ `HHmm`
+ `HH`

Z 이외의 시간대를 선택하면 지원되는 시간 형식은 다음으로 제한됩니다.
+ `HH:mm:ss`
+ `HH:mm:ss.SSS`

### Neptune openCypher 언어 시맨틱의 차이점
<a name="opencypher-compliance-semantics"></a>

Neptune은 노드 및 관계 ID를 정수가 아닌 문자열로 나타냅니다. ID는 데이터 로더를 통해 제공된 ID와 같습니다. 열에 네임스페이스가 있는 경우 네임스페이스에 ID를 더한 값입니다. 따라서 `id` 함수는 정수 대신 문자열을 반환합니다.

`INTEGER` 데이터 유형은 64비트로 제한됩니다. `TOINTEGER` 함수를 사용하여 더 큰 부동 소수점 또는 문자열 값을 정수로 변환할 때 음수 값은 `LLONG_MIN`으로 잘리고 양수 값은 `LLONG_MAX`로 잘립니다.

예제:

```
RETURN TOINTEGER(2^100)
>  9223372036854775807

RETURN TOINTEGER(-1 * 2^100)
>  -9223372036854775808
```

### 다중 값 속성
<a name="openCypher-compliance-mvp"></a>

 openCypher CREATE는 다중 값 속성을 생성하지 않지만 Gremlin을 사용하여 생성된 데이터(Neptune 데이터베이스) 또는 데이터를 로드할 때(Neptune 데이터베이스 및 Neptune Analytics) 존재할 수 있습니다. Neptune openCypher에서 다중 값 속성을 발견하면 값 중 하나가 임의로 선택되어 비결정적 결과가 생성됩니다.

### NaN 값 처리
<a name="openCypher-compliance-handling-nan"></a>

 Neptune의 `NaN` 속성 값 비교 처리는 정의되지 않습니다. 이러한 비교에 의존하면 예기치 않거나 결정적이지 않은 결과가 발생할 수 있습니다.