

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon Neptune 中的 openCypher 規格合規
<a name="feature-opencypher-compliance"></a>

OpenCypher 的 Amazon Neptune 版本通常支援目前 OpenCypher 規格 (即 [Cypher 查詢語言參考第 9 版](https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf)) 中定義的子句、運算子、運算式、函數和語法。下面列出了 Neptune 對 OpenCypher 支援的限制和差異。

 Amazon Neptune 也支援 openCypher 規格範圍以外的多種功能。請參閱 [Amazon Neptune 中的 openCypher 延伸模組](access-graph-opencypher-extensions.md) 以取得詳細資訊。

**注意**  
Cypher 的目前 Neo4j 實作包含了上述 OpenCypher 規格中未包含的功能。如果您要將目前 Cypher 程式碼遷移至 Neptune，請參閱 [Neptune 與 Neo4j 的相容性](migration-compatibility.md) 和 [重寫 Cypher 查詢以在 Neptune 上的 OpenCpher 中執行](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`
+ 用於存取巢狀常值映射屬性的 `.` 運算子。

**數學運算子**
+ `+` 加法運算子。
+ `-` 減法運算子。
+ `*` 乘法運算子。
+ `/` 除法運算子。
+ `%` 模數除法運算子。
+ `^` 指數運算子*未受支援*。

**比較運算子**
+ `=` 加法運算子。
+ `<>` 不等式運算子。
+ 支援 `<` 小於運算子，但其中一個引數是 Path、List 或 Map 除外。
+ 支援 `>` 大於運算子，但其中一個引數是 Path、List 或 Map 除外。
+ 支援 `<=` 小於或大於運算子，但其中一個引數是 Path、List 或 Map 除外。
+ 支援 `>=` 大於或等於運算子，但其中一個引數是 Path、List 或 Map 除外。
+ `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` 屬性等式篩選條件值不是常數，所以此查詢會產生 `UnsupportedOperationException` 並顯示訊息：`Property predicate over variable-length relationships with non-constant expression is not supported in this release.`

### 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*`"` 格式的字串中剖析而來，其中 *date* 和 *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 資料庫 1.3.2.0 及更高版本）
<a name="opencypher-compliance-time-na"></a>

下列 OpenCypher 的日期時間功能適用於 Neptune Analytics。或者，您可以使用 實驗室模式參數`DatetimeMillisecond=enabled`，在 Neptune 引擎版本 1.3.2.0 及更高版本上啟用下列日期時間功能。如需在 實驗室模式中使用此功能的詳細資訊，請參閱 [延長日期時間支援](features-lab-mode.md#labmode-extended-datetime-support)。
+ 支援毫秒。日期時間常值一律會以毫秒傳回，即使毫秒為 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() 函數。例如，在此功能之前，以下查詢是不可能的。

  透過屬性的日期時間 ()：

  ```
  // 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
  ```

  中繼結果的日期時間 ()：

  ```
  // 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)
  ```

  使用 datetime 屬性從 參數批次建立節點：

  ```
  // 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 到 \$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 到 9999-12-31。

時間

如果沒有時區，或時區為 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 valuse 的處理
<a name="openCypher-compliance-handling-nan"></a>

 Neptune 對`NaN`屬性值比較的處理方式未定義。依賴這類比較可能會導致非預期或非確定性的結果。