

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 最好 IDs 对节点/关系使用自定义
<a name="best-practices-content-15"></a>

 Neptune 允许用户对节点和关系 IDs 进行显式分配。ID 在数据集中必须是全局唯一的，并且必须是确定性的，才有用。确定性 ID 可以像属性一样用作查找或筛选机制；但是，从查询执行的角度来看，使用 ID 比使用属性更优化。使用自定义有几个好处 IDs - 
+  现有实体的属性可以为空，但是 ID 必须存在。这让查询引擎在执行期间可以使用优化的联接。
+  当执行并发突变查询时，当用于访问节点时，出现[并发修改异常](https://docs.aws.amazon.com//neptune/latest/userguide/transactions-exceptions.html) (CMEs) 的可能性会 IDs 大大降低，因为由于其强制唯一性，所使用的锁 IDs 比属性少。
+  使用 IDs 可以避免创建重复数据的机会，因为 Neptune 会强制使用唯一性 IDs，这与属性不同。

 以下查询示例使用自定义 ID：

**注意**  
 属性 `~id` 用于指定 ID，而 `id` 仅作为任何其他属性存储。

```
CREATE (n:Person {`~id`: '1', name: 'alice'})
```

 不使用自定义 ID：

```
CREATE (n:Person {id: '1', name: 'alice'})
```

 如果使用后一种机制，则不会强制执行唯一性，您可以稍后执行查询：

```
CREATE (n:Person {id: '1', name: 'john'})
```

 这将创建第二个 `id=1` 且名为 `john` 的节点。在这种情况下，您现在将有两个 `id=1` 的节点，每个节点都有不同的名称（alice 和 john）。