导入
neo4j-admin database import
以尽可能快的速度将 CSV 数据写入 Neo4j 的原生文件格式。当以下情况发生时,您应该使用此工具
-
导入性能非常重要,因为您有大量数据(数百万/数十亿个实体)。
-
数据库可以脱机,并且您可以直接访问托管 Neo4j DBMS 的服务器之一。
-
数据库为空,或者其内容自上次增量导入以来未更改。
-
CSV 数据干净/无故障(节点不重复,关系的起始节点和结束节点存在)。此工具可以处理数据故障,但性能未优化。如果您的数据有很多故障,建议在导入之前使用专用工具对其进行清理。
其他将数据导入 Neo4j 的方法可能更适合非管理员用户
-
Cypher® - CSV 数据可以通过 Cypher 命令
LOAD CSV
批量加载。请参阅Cypher 手册 →LOAD CSV
。 -
图形工具 - Neo4j AuraDB → 导入数据.
变更数据捕获(CDC)**不会**捕获使用 |
概述
neo4j-admin database import
命令有两种模式,均用于初始数据导入
-
完整 — 用于将数据导入到不存在的空数据库中。
-
增量 — 当无法通过单个完整导入完成导入时使用,允许导入为一系列较小的导入。
运行 |
本节介绍neo4j-admin database import
选项。
有关 |
在创建输入文件时,需要牢记以下几点
-
默认情况下,字段以逗号分隔,但可以指定不同的分隔符。
-
所有文件必须使用相同的分隔符。
-
节点和关系可以使用多个数据源。
-
数据源可以选择使用多个文件。
-
一个单独的文件,包含提供数据字段信息的标题,必须是每个数据源的第一个指定文件。
-
没有标题中对应信息的字段将不会被读取。
-
使用 UTF-8 编码。
-
默认情况下,导入程序会修剪字符串开头和结尾的多余空格。引用您的数据以保留开头和结尾的空格。
索引和约束
导入过程中不会创建索引和约束。相反,您需要在之后添加这些内容(参见 Cypher 手册 → 索引)。 从 Neo4j 5.24 开始,可以使用 |
完整导入
语法
导入一组 CSV 文件的语法为
neo4j-admin database import full [-h] [--expand-commands] [--verbose] [--auto-skip-subsequent-headers[=true|false]] [--ignore-empty-strings[=true|false]] [--ignore-extra-columns[=true|false]] [--legacy-style-quoting[=true|false]] [--multiline-fields[=true|false]] [--normalize-types[=true|false]] [--overwrite-destination[=true|false]] [--skip-bad-entries-logging[=true|false]] [--skip-bad-relationships[=true|false]] [--skip-duplicate-nodes[=true|false]] [--strict[=true|false]] [--trim-strings [=true|false]] [--additional-config=<file>] [--array-delimiter=<char>] [--bad-tolerance=<num>] [--delimiter=<char>] [--format=<format>] [--high-parallel-io=on|off|auto] [--id-type=string|integer|actual] [--input-encoding=<character-set>] [--max-off-heap-memory=<size>] [--quote=<char>] [--read-buffer-size=<size>] [--report-file=<path>] [--schema=<path>] [--threads=<num>] --nodes=[<label>[:<label>]...=]<files>... [--nodes=[<label>[:<label>]...=] <files>...]... [--relationships=[<type>=]<files>...]... <database>
参数
参数 | 描述 | 默认值 |
---|---|---|
|
要导入的数据库的名称。如果您要导入的数据库在导入之前不存在,则必须使用 |
|
以下选项中的一些标记为**高级**。这些选项不应用于实验。 有关更多信息,请联系 Neo4j 专业服务。 |
选项
选项 | 描述 | 默认值 |
---|---|---|
|
包含附加配置的配置文件。 |
|
|
CSV 数据中值内数组元素之间的分隔符。也接受
对于水平制表符 (HT),请使用 如果使用 |
|
|
在具有多个文件的文件组中,自动跳过后续文件中意外的标题行。 |
|
|
导入中止前允许出现的错误条目数量。导入过程针对无错误数据进行了优化。因此,强烈建议在导入之前清理数据。如果您在导入过程中遇到任何错误条目,可以将错误条目的数量设置为满足您需求的特定值。但是,设置较高的值可能会影响工具的性能。 |
|
|
CSV 数据中值之间的分隔符。也接受
对于水平制表符 (HT),请使用 如果使用 |
|
|
允许在配置值评估中进行命令扩展。 |
|
|
数据库格式的名称。导入的数据库将以指定的格式创建,或使用配置中设置的格式。有效格式为 |
|
|
显示此帮助消息并退出。 |
|
|
忽略基于环境的启发式方法,并指示目标存储子系统是否可以支持具有高吞吐量的并行 I/O 或自动检测。通常,对于 SSD、大型 RAID 阵列和网络连接存储,此值为 |
|
|
每个节点都必须提供一个唯一的 ID。这用于在创建关系时查找正确的节点。 可能的值为
|
|
|
是否忽略空字符串字段,即输入源中的 "",即将其视为 null。 |
|
|
如果未指定的列应在导入期间被忽略。 |
|
|
输入数据的编码字符集。 |
|
|
是否将反斜杠转义的引号(例如 \")解释为内部引号。 |
|
|
值可以是普通数字,例如 |
|
|
输入源中的字段是否可以跨越多行,即包含换行符。 设置 |
|
|
节点 CSV 标题和数据。
可以使用适当的 URI 作为路径,从 AWS S3 存储桶、Google Cloud 存储桶和 Azure 存储桶导入文件。 有关示例,请参见 使用正则表达式从 CSV 文件导入数据。 |
|
|
当为 |
|
|
在导入之前删除任何现有的数据库文件。 |
|
|
|
|
|
用于读取输入数据的每个缓冲区的尺寸。 它必须至少大到足以容纳输入数据中最大的单个值。该值可以是普通数字或字节单位字符串,例如 |
|
|
关系 CSV 标题和数据。
可以使用适当的 URI 作为路径,从 AWS S3 存储桶、Google Cloud 存储桶和 Azure 存储桶导入文件。 有关示例,请参见 使用正则表达式从 CSV 文件导入数据。 |
|
|
用于存储 csv-import 报告的文件。 可以使用 如果您在类似 UNIX 的系统上运行,并且对输出不感兴趣,则可以通过将报告文件定向到 如果您需要调试导入,收集堆栈跟踪可能会有所帮助。这可以通过使用 |
|
|
在 5.24 中引入 企业版 包含在数据导入期间创建索引和约束的 Cypher 命令的文件的路径。 |
|
|
设置为 |
|
|
是否跳过导入引用丢失节点 ID 的关系,即开始或结束节点 ID/组引用未由节点输入数据指定的节点。 跳过的关系将被记录,最多包含由 |
|
|
是否跳过导入具有相同 ID/组的节点。 如果同一组中的多个节点具有相同的 ID,则将导入第一个遇到的节点,而后续此类节点将被跳过。 跳过的节点将被记录,最多包含由 |
|
|
在 5.6 中引入 是否需要严格检查从关系中引用的节点的查找。如果禁用,大多数但并非所有引用不存在的节点的关系都将被检测到。如果启用,所有这些关系都将被找到,但代价是降低性能。 |
|
|
(高级)导入程序使用的最大工作线程数量。默认值为 JVM 报告的可用处理器数量。需要一定数量的最小线程,因此此值的最小值没有下限。为了获得最佳性能,此值不应大于可用处理器的数量。 |
|
|
是否应该修剪字符串的空格。 |
|
|
启用详细输出。 |
导入的堆大小
您需要将最大堆大小设置为与导入相关的值。这可以通过在启动导入之前定义 如果进行约 1000 亿个实体的导入,20G 将是一个合适的价值。 |
记录格式
如果您的导入数据导致图形的大小超过 340 亿个节点、340 亿个关系或 680 亿个属性,则需要配置导入器以使用 `block` 格式。这可以通过使用导入命令的 `format` 选项并将值设置为 `block` 来实现。
`block` 格式仅在企业版中可用。 |
在文件中提供参数
所有选项都可以在文件中提供,并使用 `@` 前缀传递到命令。当命令行变得过长而难以管理时,这很有用。例如,以下命令
有关更多信息,请参见 Picocli → AtFiles 官方文档。 |
同时使用多值选项和位置参数
当同时使用多值选项(例如 `--nodes` 和 `--relationships`)和位置参数(例如,在 `--additional-config neo4j.properties --nodes 0-nodes.csv mydatabase` 中)时,`--nodes` 选项会“贪婪地”使用,而下一个选项(在本例中为 `mydatabase`)将通过节点转换器拉取。 这是底层库 Picocli 的限制,并非 Neo4j Admin 特有。有关更多信息,请参见 Picocli → 可变元数选项和位置参数 官方文档。 要解决此问题,请使用以下解决方案之一
|
从云存储导入
`--nodes` 和 `--relationships` 选项还可以从 AWS S3 存储桶(从 Neo4j 5.19 开始)、Google Cloud 存储桶(从 Neo4j 5.21 开始)和 Azure 存储桶(从 Neo4j 5.24 开始)导入文件。有关更多信息,请参见 从云存储导入文件。 |
示例
如果导入到在导入之前尚未显式创建的数据库,则必须随后创建该数据库才能使用。 |
从 CSV 文件导入数据
假设您已根据 CSV 标头格式 格式化您的数据,以便将其保存在六个不同的文件中
-
movies_header.csv
-
movies.csv
-
actors_header.csv
-
actors.csv
-
roles_header.csv
-
roles.csv
以下命令导入三个数据集
bin/neo4j-admin database import full --nodes import/movies_header.csv,import/movies.csv \
--nodes import/actors_header.csv,import/actors.csv \
--relationships import/roles_header.csv,import/roles.csv
在导入过程中提供索引和约束
从 Neo4j 5.24 开始,您可以使用 `--schema` 选项,该选项允许提供 Cypher 命令以在初始导入过程中创建索引/约束。它目前仅适用于 block 格式和完整导入。
您应该有一个 Cypher 脚本,其中只包含要解析和执行的 `CREATE INDEX|CONSTRAINT` 命令。此文件使用 `;` 作为分隔符。
例如
CREATE INDEX PersonNameIndex FOR (i:Person) ON (i.name);
CREATE CONSTRAINT PersonAgeConstraint FOR (c:Person) REQUIRE c.age IS :: INTEGER
导入工具可以创建的支持索引和约束列表
-
RANGE
-
LOOKUP
-
POINT
-
TEXT
-
FULL-TEXT
-
VECTOR
例如
bin/neo4j-admin database import full neo4j --nodes=import/movies.csv --nodes=import/actors.csv --relationships=import/roles.csv --schema=import/schema.cypher
使用正则表达式从 CSV 文件导入数据
假设您要包含一个标头,然后包含多个与模式匹配的文件(例如,包含数字)。在这种情况下,可以使用正则表达式。可以保证数字组将按数字顺序排序,而不是按字典顺序排序。
例如
bin/neo4j-admin database import full --nodes import/node_header.csv,import/node_data_\d+\.csv
使用更复杂的正则表达式从 CSV 文件导入数据
对于包含逗号的正则表达式模式,而逗号也是一组文件之间的分隔符,可以引用该模式以保留该模式。
例如
bin/neo4j-admin database import full --nodes import/node_header.csv,'import/node_data_\d{1,5}.csv' databasename
从云存储导入文件
以下示例展示了如何使用 `--nodes` 和 `--relationships` 选项从云存储桶中导入数据。
Neo4j 使用 AWS SDK v2 通过 AWS URL 调用 AWS 上的 API。或者,您可以覆盖端点,以便 AWS SDK 可以使用系统变量 `aws.endpointUrls3`、`aws.endpointUrlS3` 或 `aws.endpointUrl`,或环境变量 `AWS_ENDPOINT_URL_S3` 或 `AWS_ENDPOINT_URL` 与其他存储系统(如 Ceph、Minio 或 LocalStack)进行通信。 |
-
按照 AWS 官方文档中的说明安装 AWS CLI - 安装 AWS CLI 版本 2。
-
使用 AWS CLI 创建一个 S3 存储桶和一个目录来存储备份文件
aws s3 mb --region=us-east-1 s3://myBucket aws s3api put-object --bucket myBucket --key myDirectory/
有关如何创建存储桶和使用 AWS CLI 的更多信息,请参见 AWS 官方文档 - 使用 AWS CLI 使用 Amazon S3 和 使用高级(s3)命令与 AWS CLI。
-
通过运行以下命令验证 `~/.aws/config` 文件是否正确
cat ~/.aws/config
输出应如下所示
[default] region=us-east-1
-
通过在 `~/.aws/credentials` 文件中设置 `aws_access_key_id` 和 `aws_secret_access_key` 来配置对 AWS S3 存储桶的访问,如果需要,可以使用存储桶策略。例如
-
使用 `aws configure set aws_access_key_id aws_secret_access_key` 命令从 AWS 设置您的 IAM 凭据,并验证 `~/.aws/credentials` 是否正确
cat ~/.aws/credentials
输出应如下所示
[default] aws_access_key_id=this.is.secret aws_secret_access_key=this.is.super.secret
-
此外,您可以使用基于资源的策略来授予对 S3 存储桶及其中的对象的访问权限。使用以下内容创建一个策略文档,并将其附加到存储桶。请注意,这两个资源条目对于能够下载和上传文件都很重要。
{ "Version": "2012-10-17", "Id": "Neo4jBackupAggregatePolicy", "Statement": [ { "Sid": "Neo4jBackupAggregateStatement", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::myBucket/*", "arn:aws:s3:::myBucket" ] } ] }
-
-
运行 `neo4j-admin database import` 命令从 AWS S3 存储桶中导入数据。该示例假设您在存储桶中的 `myBucket/data` 文件夹中存储了数据。
bin/neo4j-admin database import full --nodes s3://myBucket/data/nodes.csv --relationships s3://myBucket/data/relationships.csv newdb
-
确保您拥有 Google 帐户以及在 Google Cloud Platform (GCP) 中创建的项目。
-
按照 Google 官方文档中的说明安装 `gcloud` CLI - 安装 gcloud CLI。
-
使用 Google 官方文档创建服务帐户和服务帐户密钥 - 创建服务帐户 和 创建和管理服务帐户密钥。
-
下载服务帐户的 JSON 密钥文件。
-
分别将 `GOOGLE_APPLICATION_CREDENTIALS` 和 `GOOGLE_CLOUD_PROJECT` 环境变量设置为 JSON 密钥文件的路径和项目 ID
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/keyfile.json" export GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID
-
使用您创建的服务帐户的电子邮件地址、JSON 密钥文件的路径和项目 ID 对 `gcloud` CLI 进行身份验证
gcloud auth activate-service-account service-account@example.com --key-file=$GOOGLE_APPLICATION_CREDENTIALS --project=$GOOGLE_CLOUD_PROJECT
有关更多信息,请参见 Google 官方文档 - gcloud auth activate-service-account。
-
使用 Google 官方文档在 Google Cloud Storage 中创建存储桶 - 创建存储桶。
-
通过运行以下命令验证存储桶是否已创建
gcloud storage ls
输出应该列出创建的存储桶。
-
-
运行 `neo4j-admin database import` 命令从 Google 存储桶中导入数据。该示例假设您在存储桶中的 `myBucket/data` 文件夹中存储了数据。
bin/neo4j-admin database import full --nodes gs://myBucket/data/nodes.csv --relationships gs://myBucket/data/relationships.csv newdb
-
确保您拥有 Azure 帐户、Azure 存储帐户和 Blob 容器。
-
您可以使用 Azure 门户创建存储帐户。
有关更多信息,请参见 Azure 官方文档 - 创建存储帐户。 -
在 Azure 门户中创建 Blob 容器。
有关更多信息,请参见 Azure 官方文档 - 快速入门:使用 Azure 门户上传、下载和列出 Blob。
-
-
按照 Azure 官方文档中的说明安装 Azure CLI - Azure 官方文档。
-
使用默认 Azure 凭据对 neo4j 或 neo4j-admin 进程进行身份验证。
有关更多信息,请参见 Azure 官方文档 - 默认 Azure 凭据。az login
然后您应该准备好使用 neo4j 或 neo4j-admin 中的 Azure URL。
-
要验证您是否有权使用登录凭据访问容器,请运行以下命令
# Upload a file: az storage blob upload --file someLocalFile --account-name accountName - --container someContainer --name remoteFileName --auth-mode login # Download the file az storage blob download --account-name accountName --container someContainer --name remoteFileName --file downloadedFile --auth-mode login # List container files az storage blob list --account-name someContainer --container someContainer --auth-mode login
-
运行 `neo4j-admin database import` 命令从 Azure Blob 存储容器中导入数据。该示例假设您在容器中的 `myStorageAccount/myContainer/data` 文件夹中存储了数据。
bin/neo4j-admin database import full --nodes azb://myStorageAccount/myContainer/data/nodes.csv --relationships azb://myStorageAccount/myContainer/data/relationships.csv newdb
增量导入
增量导入从 Neo4j 5.20 开始支持 `block` 格式。 |
增量导入允许您将大量数据分批合并到图形中。您可以在无法一次性完成完整导入的情况下,将此操作作为初始数据加载的一部分运行。此外,您可以通过增量导入数据来更新图形,这比对这类数据进行事务性插入的效率更高。
增量导入需要使用 `--force`,并且只能在现有数据库上运行。
如果要在一个命令中执行增量导入,则必须停止数据库。
如果您无法承受数据库的完全停机时间,请将操作分成多个阶段
-
准备阶段(脱机)
-
构建阶段(脱机或只读)
-
合并阶段(脱机)
数据库必须在 `准备` 和 `合并` 阶段停止。在 `构建` 阶段,可以使数据库保持在线状态,但将其置于只读模式。有关详细示例,请参见 分阶段增量导入。
强烈建议在运行增量导入之前备份数据库,因为如果 *合并* 阶段失败、中止或崩溃,可能会损坏数据库。 |
语法
neo4j-admin database import incremental [-h] [--expand-commands] --force [--verbose] [--auto-skip-subsequent-headers
[=true|false]] [--ignore-empty-strings[=true|false]] [--ignore-extra-columns
[=true|false]] [--legacy-style-quoting[=true|false]] [--multiline-fields
[=true|false]] [--normalize-types[=true|false]] [--skip-bad-entries-logging
[=true|false]] [--skip-bad-relationships[=true|false]] [--skip-duplicate-nodes
[=true|false]] [--strict[=true|false]] [--trim-strings[=true|false]]
[--additional-config=<file>] [--array-delimiter=<char>] [--bad-tolerance=<num>]
[--delimiter=<char>] [--high-parallel-io=on|off|auto]
[--id-type=string|integer|actual] [--input-encoding=<character-set>]
[--max-off-heap-memory=<size>] [--quote=<char>] [--read-buffer-size=<size>]
[--report-file=<path>] [--schema=<path>] [--stage=all|prepare|build|merge]
[--threads=<num>] --nodes=[<label>[:<label>]...=]<files>... [--nodes=[<label>
[:<label>]...=]<files>...]... [--relationships=[<type>=]<files>...]... <database>
用法和限制
增量导入命令可用于添加
-
带有标签和属性的新节点。
请注意,您必须为构成主键的属性键和标签组合或唯一可识别节点设置节点属性唯一性约束。否则,命令将抛出错误并退出。有关更多信息,请参见 CSV 标头格式。
-
现有节点或新节点之间的新关系。
增量导入命令不能用于
-
向现有节点或关系添加新属性。
-
更新或删除节点或关系中的属性。
-
更新或删除节点中的标签。
-
删除现有节点和关系。
导入器在独立服务器上运行良好。在具有数据库多个副本的集群环境中,必须重新播种更新的数据库。 |
参数
参数 | 描述 | 默认值 |
---|---|---|
|
要导入的数据库的名称。如果您要导入的数据库在导入之前不存在,则必须使用 |
|
选项
选项 | 描述 | 默认值 |
---|---|---|
|
包含附加配置的配置文件。 |
|
|
CSV 数据中值内数组元素之间的分隔符。也接受
对于水平制表符 (HT),请使用 如果使用 |
|
|
在具有多个文件的文件组中,自动跳过后续文件中意外的标题行。 |
|
|
导入中止前允许出现的错误条目数量。导入过程针对无错误数据进行了优化。因此,强烈建议在导入之前清理数据。如果您在导入过程中遇到任何错误条目,可以将错误条目的数量设置为满足您需求的特定值。但是,设置较高的值可能会影响工具的性能。 |
|
|
CSV 数据中值之间的分隔符。也接受
对于水平制表符 (HT),请使用 如果使用 |
|
|
允许在配置值评估中进行命令扩展。 |
|
|
通过设置此标志来确认增量导入。 |
|
|
显示此帮助消息并退出。 |
|
|
忽略基于环境的启发式方法,并指示目标存储子系统是否可以支持具有高吞吐量的并行 I/O 或自动检测。通常,对于 SSD、大型 RAID 阵列和网络连接存储,此值为 |
|
|
在 5.1 中引入 每个节点必须提供唯一的 ID。这用于在创建关系时查找正确的节点。 可能的值为
|
|
|
是否忽略空字符串字段,即输入源中的 "",即将其视为 null。 |
|
|
如果未指定的列应在导入期间被忽略。 |
|
|
输入数据的编码字符集。 |
|
|
是否将反斜杠转义的引号(例如 \")解释为内部引号。 |
|
|
值可以是普通数字,例如 |
|
|
输入源中的字段是否可以跨越多行,即包含换行符。 设置 |
|
|
节点 CSV 标题和数据。
可以使用适当的 URI 作为路径,从 AWS S3 存储桶、Google Cloud 存储桶和 Azure 存储桶导入文件。 有关示例,请参见 使用正则表达式从 CSV 文件导入数据。 |
|
|
当为 |
|
|
|
|
|
用于读取输入数据的每个缓冲区的尺寸。 它必须至少大到足以容纳输入数据中最大的单个值。该值可以是普通数字或字节单位字符串,例如 |
|
|
关系 CSV 标题和数据。
可以使用适当的 URI 作为路径,从 AWS S3 存储桶、Google Cloud 存储桶和 Azure 存储桶导入文件。 有关示例,请参见 使用正则表达式从 CSV 文件导入数据。 |
|
|
用于存储 csv-import 报告的文件。 可以使用 如果您在类似 UNIX 的系统上运行,并且对输出不感兴趣,则可以通过将报告文件定向到 如果您需要调试导入,收集堆栈跟踪可能会有所帮助。这可以通过使用 |
|
|
在 5.24 中引入 包含用于在数据导入期间创建索引和约束的 Cypher 命令的文件的路径。 |
|
|
设置为 |
|
|
是否跳过导入引用丢失节点 ID 的关系,即开始或结束节点 ID/组引用未由节点输入数据指定的节点。 跳过的关系将被记录,最多包含由 |
|
|
是否跳过导入具有相同 ID/组的节点。 如果同一组中的多个节点具有相同的 ID,则将导入第一个遇到的节点,而后续此类节点将被跳过。 跳过的节点将被记录,最多包含由 |
|
|
增量导入的阶段。 对于增量导入到现有数据库中,请使用 `all`(这需要数据库停止)。 对于半在线增量导入,请运行 `prepare`(在已停止的数据库上)然后运行 `build`(在可能正在运行的数据库上),最后运行 `merge`(在已停止的数据库上)。 |
|
|
在 5.6 中引入 是否需要严格检查从关系中引用的节点的查找。如果禁用,大多数但并非所有引用不存在的节点的关系都将被检测到。如果启用,所有这些关系都将被找到,但代价是降低性能。 |
|
|
(高级)导入程序使用的最大工作线程数量。默认值为 JVM 报告的可用处理器数量。需要一定数量的最小线程,因此此值的最小值没有下限。为了获得最佳性能,此值不应大于可用处理器的数量。 |
|
|
是否应该修剪字符串的空格。 |
|
|
启用详细输出。 |
|
1. 此版本提供 |
同时使用多值选项和位置参数
当同时使用多值选项(例如 `--nodes` 和 `--relationships`)和位置参数(例如,在 `--additional-config neo4j.properties --nodes 0-nodes.csv mydatabase` 中)时,`--nodes` 选项会“贪婪地”使用,而下一个选项(在本例中为 `mydatabase`)将通过节点转换器拉取。 这是底层库 Picocli 的限制,并非 Neo4j Admin 特有。有关更多信息,请参见 Picocli → 可变元数选项和位置参数 官方文档。 要解决此问题,请使用以下解决方案之一
|
示例
有两种方法可以增量导入数据。
单命令增量导入
如果停机时间不是问题,可以使用 --stage=all
选项运行单个命令。此选项需要停止数据库。
neo4j@system> STOP DATABASE db1 WAIT;
...
bin/neo4j-admin database import incremental --stage=all --nodes=N1=../../raw-data/incremental-import/b.csv db1
分阶段增量导入
如果无法承受数据库完全停机,则可以分三个阶段运行导入操作。
-
prepare
阶段在此阶段,导入工具会分析 CSV 标题并将其相关数据复制到新的增量数据库路径。导入命令使用
--stage=prepare
选项运行,并且必须停止数据库。-
使用
system
数据库,使用WAIT
选项停止数据库db1
,以确保在运行增量导入命令之前发生检查点。必须停止数据库才能运行--stage=prepare
。STOP DATABASE db1 WAIT
-
使用
--stage=prepare
选项运行增量导入命令bin/neo4j-admin database import incremental --stage=prepare --nodes=N1=../../raw-data/incremental-import/c.csv db1
-
-
build
阶段在此阶段,导入工具会在新的增量数据库路径中导入数据、对其进行重复数据删除并验证数据。这是最长的阶段,您可以将数据库置于只读模式,以允许读取访问。导入命令使用
--stage=build
选项运行。-
将数据库置于只读模式
ALTER DATABASE db1 SET ACCESS READ ONLY
-
使用
--stage=build
选项运行增量导入命令bin/neo4j-admin database import incremental --stage=build --nodes=N1=../../raw-data/incremental-import/c.csv db1
-
-
merge
阶段在此阶段,导入工具会将新数据与数据库中现有的数据合并。它还会更新受影响的索引,并维护受影响的属性唯一性约束和属性存在约束。导入命令使用
--stage=merge
选项运行,并且必须停止数据库。使用--stage=merge
时,无需包含--nodes
或--relationships
选项。-
使用
system
数据库,使用WAIT
选项停止数据库db1
,以确保在运行增量导入命令之前发生检查点。STOP DATABASE db1 WAIT
-
使用
--stage=merge
选项运行增量导入命令bin/neo4j-admin database import incremental --stage=merge db1
-
CSV 标题格式
每个数据源的标题文件指定了如何解释数据字段。标题文件和数据文件必须使用相同的定界符。
标题包含每个字段的信息,格式为 <name>:<field_type>
。<name>
用于属性和节点 ID。在所有其他情况下,字段的 <name>
部分将被忽略。
增量导入
使用 增量导入 时,必须为构成主键或唯一可识别的节点的属性键和标签组合设置节点属性唯一性约束。例如,导入具有 这在处理多个组时也是如此。例如,您可以使用
|
节点文件
包含节点数据的文件可以具有 ID
字段、LABEL
字段和属性。
- ID
-
如果要通过导入中创建的任何关系连接节点,则每个节点必须具有唯一的 ID。Neo4j 使用 ID 在创建关系时查找正确的节点。请注意,ID 必须在组中的所有节点之间是唯一的,无论其标签如何。唯一 ID 会保存在一个属性中,该属性的名称由字段定义
<name>:ID
的<name>
部分定义。如果未定义此类属性name
,则唯一 ID 将用于导入,但以后无法引用。如果未指定 ID,则节点将被导入,但在导入期间不会与其他节点连接。当提供属性name
时,可以全局配置该属性类型(如 属性数据类型),方法是使用--id-type
选项。
从 Neo4j 5.1 开始,可以使用标题中的id-type
选项指定在组中为节点属性存储的不同值 ID 类型,例如:id:ID(MyGroup){label:MyLabel, id-type: int}
。此 ID 类型将覆盖全局--id-type
选项。例如,全局id-type
可以是字符串,但节点的 ID 将以int
类型存储在其 ID 属性中。有关更多信息,请参阅 在组中存储 ID 的不同值类型。
从 Neo4j 5.3 开始,节点标题还可以包含多个ID
列,其中关系数据引用所有这些列的组合值。这也意味着使用string
作为id-type
。对于每个ID
列,您可以指定将它的值存储为不同的节点属性。但是,组合值不能存储为节点属性。有关更多信息,请参阅 使用多个节点 ID。 - LABEL
-
从该字段读取一个或多个标签。与数组值一样,多个标签由
;
分隔,或由--array-delimiter
指定的字符分隔。在 5.25 中引入 块格式标签名的最大长度为 16,383 个字符。
您在 movies_header.csv 文件中定义了电影的标题。电影具有 movieId
、year
和 title
属性。您还指定了用于标签的字段。
movieId:ID,title,year:int,:LABEL
您在 movies.csv 文件中定义了三部电影。它们包含标题文件中定义的所有属性。所有电影都被赋予了 Movie
标签。其中两部还被赋予了 Sequel
标签。
tt0133093,"The Matrix",1999,Movie
tt0234215,"The Matrix Reloaded",2003,Movie;Sequel
tt0242653,"The Matrix Revolutions",2003,Movie;Sequel
类似地,您还定义了 actors_header.csv 和 actors.csv 文件中的三名演员。他们都具有 personId
和 name
属性,以及 Actor
标签。
personId:ID,name,:LABEL
keanu,"Keanu Reeves",Actor
laurence,"Laurence Fishburne",Actor
carrieanne,"Carrie-Anne Moss",Actor
关系文件
包含关系数据的文件具有三个必填字段,也可以具有属性。必填字段是
- TYPE
-
要用于此关系的关系类型。在 5.25 中引入 块格式关系类型名的最大长度为 16,383 个字符。
- START_ID
-
此关系的起始节点的 ID。
- END_ID
-
此关系的结束节点的 ID。
START_ID
和 END_ID
指的是在前面部分说明的某个节点数据源中定义的唯一节点 ID。它们都不带名称,例如,如果定义了 <name>:START_ID
或 <name>:END_ID
,则 <name>
部分将被忽略。它们也不带 <field_type>
,例如,如果定义了 :START_ID:int
或 :END_ID:int
,则 :int
部分在类型信息上下文中没有任何意义。
在此示例中,假设使用前面示例中的两个节点文件以及以下关系文件。
您在 roles_header.csv 和 roles.csv 文件中定义了演员与电影之间的关系。每行都使用关系类型的 ACTED_IN
关系连接一个起始节点和一个结束节点。请注意,您是如何使用节点文件中的唯一标识符 personId
和 movieId
的。演员在电影中扮演的角色名称存储在关系上的 role
属性中。
:START_ID,role,:END_ID,:TYPE
keanu,"Neo",tt0133093,ACTED_IN
keanu,"Neo",tt0234215,ACTED_IN
keanu,"Neo",tt0242653,ACTED_IN
laurence,"Morpheus",tt0133093,ACTED_IN
laurence,"Morpheus",tt0234215,ACTED_IN
laurence,"Morpheus",tt0242653,ACTED_IN
carrieanne,"Trinity",tt0133093,ACTED_IN
carrieanne,"Trinity",tt0234215,ACTED_IN
carrieanne,"Trinity",tt0242653,ACTED_IN
属性数据类型
对于属性,字段的 <name>
部分指定了属性键,而 <field_type>
部分指定了数据类型。节点数据文件和关系数据文件都可以具有属性。在 5.25 中引入 块格式属性键的最大长度为 16,383 个字符。
使用 int
、long
、float
、double
、boolean
、byte
、short
、char
、string
、point
、date
、localtime
、time
、localdatetime
、datetime
和 duration
之一来指定属性的数据类型。默认情况下,类型(数组除外)将转换为 Cypher 类型。请参阅 Cypher 手册 → 属性、结构化和构造值。
可以使用 --normalize-types=false
选项禁用此行为。规范化类型可能需要更多磁盘空间,但可以避免 Cypher 在查询期间转换类型。如果没有给出数据类型,则默认为 string
。
要定义数组类型,请在类型后面追加 []
。默认情况下,数组值由 ;
分隔。可以使用 --array-delimiter
指定不同的定界符。数组不受 --normalize-types
标志影响。例如,如果要将字节数组存储为 Cypher 长整型数组,则必须显式将属性声明为 long[]
。
布尔值如果与文本 true
完全匹配,则为 true。所有其他值都为 false。包含定界符字符的值需要用双引号括起来转义,或者使用 --delimiter
选项使用不同的定界符字符。
此示例说明了在 CSV 标题中指定的几种不同的数据类型。
:ID,name,joined:date,active:boolean,points:int
user01,Joe Soap,2017-05-05,true,10
user02,Jane Doe,2017-08-21,true,15
user03,Moe Know,2018-02-17,false,7
point
数据类型的特殊注意事项-
点使用 Cypher 语法指定地图。地图允许与 Cypher 手册 → 点函数 的输入相同的键。标题中的点数据类型可以使用用于该列所有值的默认值映射进行修饰,例如
point{crs: 'WGS-84'}
。以这种方式指定标题允许您在数据文件的值位置处拥有不完整的地图。可选地,数据文件中的值可以覆盖来自标题的默认值。示例 4.point
数据类型的属性格式此示例说明了在导入标题和数据文件中使用
point
数据类型的各种方法。您将导入城市的名称和位置坐标。首先,您定义标题为
:ID,name,location:point{crs:WGS-84}
然后,您在数据文件中定义城市。
-
第一个城市的地理位置使用
latitude
和longitude
定义,如使用标题中定义的坐标系时所预期的那样。 -
第二个城市使用
x
和y
。这通常会导致使用坐标系cartesian
的点。由于标题定义了crs:WGS-84
,因此将使用该坐标系。 -
第三个城市覆盖了标题中定义的坐标系,并将其显式设置为
WGS-84-3D
。
:ID,name,location:point{crs:WGS-84} city01,"Malmö","{latitude:55.6121514, longitude:12.9950357}" city02,"London","{y:51.507222, x:-0.1275}" city03,"San Mateo","{latitude:37.554167, longitude:-122.313056, height: 100, crs:'WGS-84-3D'}"
请注意,所有点地图都包含在双引号
"
中,以防止包含的,
字符被解释为列分隔符。另一种方法是使用--delimiter='\t'
并使用制表符分隔符重新格式化文件,在这种情况下,"
字符不是必需的。:ID name location:point{crs:WGS-84} city01 Malmö {latitude:55.6121514, longitude:12.9950357} city02 London {y:51.507222, x:-0.1275} city03 San Mateo {latitude:37.554167, longitude:-122.313056, height: 100, crs:'WGS-84-3D'}
-
- 时间数据类型的特殊注意事项
-
所有时间数据类型的格式必须按照 Cypher 手册 → 时间点语法 和 Cypher 手册 → 时长语法 中的描述定义。两种时间类型,Time 和 DateTime,接受一个时区参数,该参数可能在数据文件中的所有或许多值之间是通用的。因此,可以在标头中为 Time 和 DateTime 值指定一个默认时区,例如:
time{timezone:+02:00}
和:datetime{timezone:Europe/Stockholm}
。如果没有指定默认时区,则默认时区由db.temporal.timezone
配置设置确定。可以在数据文件中的值中显式覆盖默认时区。示例 5. 时间数据类型的属性格式此示例说明了在导入标头和数据文件中使用
datetime
数据类型的各种方法。首先,您使用两个 DateTime 列定义标头。第一个定义了一个时区,但第二个没有
:ID,date1:datetime{timezone:Europe/Stockholm},date2:datetime
然后您在数据文件中定义日期。
-
第一行有两个值,没有指定显式时区。
date1
的值将使用在标头中为该字段指定的Europe/Stockholm
时区。date2
的值将使用数据库配置的默认时区。 -
在第二行中,
date1
和date2
都将时区明确设置为Europe/Berlin
。这会覆盖date1
的标头定义,以及数据库配置的默认时区。
1,2018-05-10T10:30,2018-05-10T12:30 2,2018-05-10T10:30[Europe/Berlin],2018-05-10T12:30[Europe/Berlin]
-
使用 ID 空间
默认情况下,导入工具假设节点标识符在所有节点文件中都是唯一的。在许多情况下,ID 仅在每个实体文件中是唯一的,例如,当您的 CSV 文件包含从关系数据库中提取的数据,并且 ID 字段从相应表的主键列中提取时。要处理这种情况,您需要定义ID 空间。ID 空间在节点文件的 ID
字段中使用语法 ID(<ID 空间标识符>)
定义。要在关系文件中引用 ID 空间的 ID,请使用语法 START_ID(<ID 空间标识符>)
和 END_ID(<ID 空间标识符>)
。
在 movies_header.csv 文件中定义一个 Movie-ID
ID 空间。
movieId:ID(Movie-ID),title,year:int,:LABEL
1,"The Matrix",1999,Movie
2,"The Matrix Reloaded",2003,Movie;Sequel
3,"The Matrix Revolutions",2003,Movie;Sequel
在 actors_header.csv 文件的标头中定义一个 Actor-ID
ID 空间。
personId:ID(Actor-ID),name,:LABEL
1,"Keanu Reeves",Actor
2,"Laurence Fishburne",Actor
3,"Carrie-Anne Moss",Actor
现在在将演员连接到电影时使用之前定义的 ID 空间。
:START_ID(Actor-ID),role,:END_ID(Movie-ID),:TYPE
1,"Neo",1,ACTED_IN
1,"Neo",2,ACTED_IN
1,"Neo",3,ACTED_IN
2,"Morpheus",1,ACTED_IN
2,"Morpheus",2,ACTED_IN
2,"Morpheus",3,ACTED_IN
3,"Trinity",1,ACTED_IN
3,"Trinity",2,ACTED_IN
3,"Trinity",3,ACTED_IN
使用多个节点 ID
从 Neo4j 5.3 开始,节点标头也可以包含多个 ID
列,其中关系数据引用所有这些列的组合值。这也意味着使用 string
作为 id-type
。
对于每个 ID
列,您可以指定将其值存储为不同的节点属性。但是,组合值不能存储为节点属性。
增量导入不支持使用多个节点标识符。此功能仅在完整导入中可用。 |
您可以在节点标头中定义多个 ID
列。例如,您可以定义一个具有两个 ID
列的节点标头。
:ID,:ID,name
aa,11,John
bb,22,Paul
现在在定义关系时使用两个 ID
:START_ID,:TYPE,:END_ID
aa11,WORKS_WITH,bb22
在 nodes_header.csv 文件中定义一个 MyGroup
ID 空间。
personId:ID(MyGroup),memberId:ID(MyGroup),name
aa,11,John
bb,22,Paul
现在在将 John 连接到 Paul 时使用定义的 ID 空间,并在关系中使用两个 ID。
:START_ID(MyGroup),:TYPE,:END_ID(MyGroup)
aa11,WORKS_WITH,bb22
在组中存储不同值类型的 ID
从 Neo4j 5.1 开始,您可以通过在标头中定义 id-type
选项来控制要存储的节点属性的 ID 类型,例如 :ID{id-type:long}
。标头中的 id-type
选项会覆盖提供给命令的全局 --id-type
值。这样,您可以为不同组的节点设置不同类型的属性值。例如,全局 id-type
可以是字符串,但某些节点可以在其 ID 属性中将它们的 ID 存储为 long
类型。
id:ID(GroupOne){id-type:long},name,:LABEL
123,P1,Person
456,P2,Person
id:ID(GroupTwo),name,:LABEL
ABC,G1,Game
DEF,G2,Game
neo4j_home$ --nodes persons.csv --nodes games.csv --id-type string
persons
组中节点的 id
属性将存储为 long
类型,而 games
组中节点的 id
属性将存储为 string
类型,因为全局 id-type
是字符串。
跳过列
- 忽略
-
如果数据中存在您希望完全忽略的字段,可以使用标头文件中的
IGNORE
关键字来实现。IGNORE
必须以:
开头。示例 10. 跳过一列在此示例中,您对节点文件第三列中的数据不感兴趣,并希望跳过它。请注意,
IGNORE
关键字以:
开头。personId:ID,name,:IGNORE,:LABEL
keanu,"Keanu Reeves","male",Actor laurence,"Laurence Fishburne","male",Actor carrieanne,"Carrie-Anne Moss","female",Actor
如果所有多余的数据都位于您希望导入的所有列右侧的列中,则可以使用命令行选项 --ignore-extra-columns
。
导入压缩文件
导入工具可以处理使用 zip
或 gzip
压缩的文件。每个压缩文件必须包含单个文件。
neo4j_home$ ls import
actors-header.csv actors.csv.zip movies-header.csv movies.csv.gz roles-header.csv roles.csv.gz
bin/neo4j-admin database import --nodes import/movies-header.csv,import/movies.csv.gz --nodes import/actors-header.csv,import/actors.csv.zip --relationships import/roles-header.csv,import/roles.csv.gz