csv - 在 Neo4j 中导入海量数据集,其中每个实体具有不同的属性
问题描述
我正在尝试将大量数据集批量加载到单个 Neo4j 实例中。每个节点将代表一个Entity
具有特定属性的将军,例如:
- 标签
- 描述
- 日期
除了这些之外,还有零个或多个特定于该Entity
类型的属性,例如,如果Entity
是 a Book
,则属性将如下所示:
- 标签
- 描述
- 日期
- 作者
- 首次发表
- ...
如果Entity
是 a Car
,则属性将如下所示:
- 标签
- 描述
- 日期
- 制作
- 模型
- ...
我首先尝试通过Entity
从文件系统流式传输每个数据集并使用 Cypher 插入每个节点(大约 200M 个实体和 400M 个关系)来导入数据集。这太慢了(正如我所料,但值得一试)。
因此,我使用了批量导入工具neo4j-admin import
,该工具适用于为每个属性指定标题的 CSV 文件。我遇到的问题是我看不到添加特定于每个Entity
. 我能想到的唯一解决方案是为跨实体集表达的每个可能的属性包含一个 CSV 列,但是我相信我最终会在所有实体上得到一堆冗余属性。
编辑1
每个Entity
都是独一无二的,所以会有一些 1M+ 类型(Neo4j 中的标签)
任何有关如何实现此目的的建议将不胜感激。
解决方案
neo4j-admin的导入命令支持从多个节点和关系文件导入。
因此,为了支持多种“类型”的节点(labels
在 neo4j 中调用),您可以将原始 CSV 文件拆分为单独的文件,每个文件对应一个实体“类型”。然后,每个文件都可以具有特定于该类型的数据列。
[更新]
这是支持从 CSV 文件导入具有任意模式的节点的一种方法。
- CSV 文件不应有标题。
- CSV 行上的每个属性都应该由一对相邻的值表示:1 表示属性名称,1 表示属性值。
有了这样的 CSV 文件,这段代码(利用 APOC 函数apoc.map.fromValues)应该可以工作:
LOAD CSV FROM "file:///mydata.csv" AS line
CREATE (e:Entity)
SET e = apoc.map.fromValues(line);
注意:上面的代码将对所有值使用字符串。如果您希望某些属性值是整数、布尔值等,那么您可以改为执行类似的操作(但这可能仅在同一属性经常出现时才有意义;如果该属性不存在于某行上,则不会有任何属性在节点中创建,但会浪费一些时间):
LOAD CSV FROM "file:///mydata.csv" AS line
WITH apoc.map.fromValues(line) AS data
WITH apoc.map.setKey(data, 'foo', TOINTEGER(data.foo)) AS data
CREATE (e:Entity)
SET e = apoc.map.fromValues(line);
推荐阅读
- docker - Kubernetes 中基于用户的部署
- serial-port - 无法使用 AT 命令 AT+CPMS 设置 GSM 调制解调器的存储
- java - 当并行流组合在一起java 8?
- mysql - 如何在使用 Node 服务器执行另一个 MYSQL 查询之前等待完成?
- r - 从使用 dplyr 作为向量生成的 1 x 1 data.frame 中提取单个值?
- indexing - SQLalchemy 中具有 index=true 列的表的 Alembic 迁移给出重复索引错误
- symmetricds - 使用 SymmetricDS 同步一组动态模式
- c - “错误:'_Generic' 指定了两种兼容的类型”,但在某些编译器上没有
- spring - 当前事务在 Spring RepositoryEventHandler 中失败时回滚先前的事务
- java - 按日期获取查询 - 错误:运算符不存在:没有时区的时间戳 ~~ 未知