UUID

该库支持手动和自动化生成 UUID,这些 UUID 可以存储为节点上的属性。

UUID 使用java randomUUID 实用程序方法生成,该方法生成v4UUID

UUID 可以使用众所周知的十六进制表示形式(32 个字符,例如 1051af4f-b81d-4a76-8605-ecfb8ef703d5)或 Base64(22 个字符,例如 vX8dM5XoSe2ldoc/QzMEyw)编码为字符串。

自动 UUID

还有一些过程通过 UUID 处理程序生命周期处理 UUID 属性的自动添加。UUID 处理程序是一个事务事件处理程序,它会自动将 UUID 属性添加到提供的标签和提供的属性名称。请查看以下文档以获取详细说明。

所有这些过程(除了列表和显示过程)都旨在在系统数据库中执行,因此必须通过打开系统数据库会话来执行它们。有几种方法可以做到这一点:- 使用 cypher-shell 或 Neo4j 浏览器时,可以在 Cypher 查询前加上 :use system - 使用 fabric 时,可以在 Cypher 查询前加上 USE system - 使用驱动程序时,可以直接针对系统数据库打开会话。

此外,它们接受数据库名称作为第一个参数,我们希望在此数据库中安装/更新/删除自动 UUID。通过这种实现,我们可以利用集群路由机制,在集群环境中使用这些过程。

安装、更新或删除自动 UUID 是一个最终一致的操作。因此,它们不会立即被添加/更新/删除,但它们具有由 Apoc 配置 `apoc.uuid.refresh=` 处理的刷新率。

首先在 `$NEO4J_HOME/config/apoc.conf` 中启用 `apoc.uuid.enabled=true` 或 `apoc.uuid.enabled.[DATABASE_NAME]=true`。

配置值 `apoc.uuid.format` 允许您在不同的 UUID 编码方法之间进行选择:`hex`(默认选项)或 `base64`。

限定名称 类型 版本

apoc.uuid.setup

CALL apoc.uuid.setup(label, databaseName, $config) | 最终为提供的 `label` 和 `uuidProperty` 添加 uuid 事务处理程序,如果 UUID 处理程序已存在,则会被新的替换

过程

Apoc 扩展

apoc.uuid.drop

CALL apoc.uuid.drop(label, databaseName) yield label, installed, properties | 最终删除之前添加的 UUID 处理程序并返回 uuid 信息

过程

Apoc 扩展

apoc.uuid.dropAll

CALL apoc.uuid.dropAll(databaseName) yield label, installed, properties | 最终删除之前添加的所有 UUID 处理程序并返回 uuid 信息

过程

Apoc 扩展

apoc.uuid.list

CALL apoc.uuid.list() yield label, installed, properties | 提供已安装的所有 uuid 处理程序及其相关配置的列表

过程

Apoc 扩展

apoc.uuid.show

CALL apoc.uuid.show(databaseName) | 它列出最终为数据库安装的所有 UUID 处理程序

过程

Apoc 扩展

UUID 示例

创建自动 UUID

这些示例假设我们位于 `neo4j` 数据库中,并且我们希望在该数据库中创建自动 UUID。

添加 `uuid`

CALL apoc.uuid.setup('Person')
YIELD label, installed, properties
RETURN label, installed, properties

请注意,`apoc.uuid.setup` 以及 `apoc.uuid.drop`、`apoc.uuid.dropAll` 必须在系统数据库中执行。

结果是

标签 已安装 属性

"Person"

true

{uuidProperty → "uuid", addToExistingNodes → true}

当执行 `apoc.uuid.setup` 过程时,会自动执行创建约束(如果不存在)的查询(同样在这种情况下,在由 `apoc.uuid.refresh` 配置定义的时间之后):`CREATE CONSTRAINT IF NOT EXISTS FOR (n:

然后,可以在由配置 `apoc.uuid.refresh` 定义的时间之后执行以下查询

CREATE (n:Person {name: 'Daniel'})-[:Work]->(:Company {name: 'Neo4j'})

结果将是具有 2 个属性的节点 `:Person`

apoc.uuid.result

如果选择默认配置 `addToExistingNodes: true`,则在后台(通过 `apoc.periodic.iterate` 过程)所有现有节点也将填充一个具有 uuid 值的属性。并且,当执行完成时,将打印如下所示的查询结果日志

Result of batch computation obtained from existing nodes for UUID handler with label `MyLabel`:
{failedParams={}, committedOperations=1, batch={total=10, committed=10, failed=0, errors={}}, wasTerminated=false, batches=1, timeTaken=0, retries=0, errorMessages={}, total=1, operations={total=10, committed=10, failed=0, errors={}}, failedOperations=0, updateStatistics={nodesDeleted=0, labelsAdded=0, relationshipsCreated=0, nodesCreated=0, propertiesSet=1, relationshipsDeleted=0, labelsRemoved=0}, failedBatches=0}

自动 UUID 列表

可以返回数据库中所有自动 UUID 的完整列表。例如,如果创建以下查询中的 UUID

CALL apoc.uuid.setup('TestShow')

然后可以运行(同样在这种情况下,在由配置 `apoc.uuid.refresh` 定义的时间之后)

CALL apoc.uuid.show()
表 1. 结果
标签 已安装 属性 "Person"

请注意,由于自动 UUID 操作最终是一致的(基于 `apoc.uuid.refresh` 配置),因此 `apoc.uuid.show` 可能会返回一些尚未添加/更新/删除的 UUID。要获取当前已安装的所有 UUID 的列表,请使用 apoc.uuid.list

删除自动 UUID

CALL apoc.uuid.drop('Person')
YIELD label, installed, properties
RETURN label, installed, properties

结果是

标签 已安装 属性

"Person"

false

{uuidProperty → "uuid", addToExistingNodes → true}

您还可以删除所有已安装的 uuid,并将过程称为

CALL apoc.uuid.dropAll()
YIELD label, installed, properties
RETURN label, installed, properties

结果是

标签 已安装 属性

"Person"

false

{uuidProperty → "uuid", addToExistingNodes → true}

导出元数据

要将 uuid 导入到另一个数据库(例如,在 `./neo4j-admin backup` 和 `/neo4j-admin restore` 之后),请参阅 apoc.systemdb.export.metadata 过程。