首页 > 解决方案 > 在 Neo4j 中导入海量数据集,其中每个实体具有不同的属性

问题描述

我正在尝试将大量数据集批量加载到单个 Neo4j 实例中。每个节点将代表一个Entity具有特定属性的将军,例如:

除了这些之外,还有零个或多个特定于该Entity类型的属性,例如,如果Entity是 a Book,则属性将如下所示:

如果Entity是 a Car,则属性将如下所示:

我首先尝试通过Entity从文件系统流式传输每个数据集并使用 Cypher 插入每个节点(大约 200M 个实体和 400M 个关系)来导入数据集。这太慢了(正如我所料,但值得一试)。

因此,我使用了批量导入工具neo4j-admin import,该工具适用于为每个属性指定标题的 CSV 文件。我遇到的问题是我看不到添加特定于每个Entity. 我能想到的唯一解决方案是为跨实体集表达的每个可能的属性包含一个 CSV 列,但是我相信我最终会在所有实体上得到一堆冗余属性。

编辑1

每个Entity都是独一无二的,所以会有一些 1M+ 类型(Neo4j 中的标签)

任何有关如何实现此目的的建议将不胜感激。

标签: csvimportneo4jbigdatagraph-databases

解决方案


neo4j-admin导入命令支持从多个节点和关系文件导入。

因此,为了支持多种“类型”的节点(labels在 neo4j 中调用),您可以将原始 CSV 文件拆分为单独的文件,每个文件对应一个实体“类型”。然后,每个文件都可以具有特定于该类型的数据列。

[更新]

这是支持从 CSV 文件导入具有任意模式的节点的一种方法。

  1. CSV 文件不应有标题。
  2. 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);

推荐阅读