在每个实体具有不同属性的Neo4j中导入海量数据集

时间:2019-05-19 12:54:03

标签: csv import neo4j bigdata graph-databases

我正在尝试将海量数据集批量加载到单个Neo4j实例中。每个节点将代表一个常规的<button type="submit" class="btn btn-primary" name="save" value="save">Save & Go BACK</button> <button type="submit" class="btn btn-primary" name="done" value ="done">Save Note</button> ,它将具有特定的属性,例如:

  • 标签
  • 说明
  • 日期

除了这些以外,Entity类型还具有零个或多个属性,因此,例如,如果EntityEntity,则这些属性将看起来像这样:< / p>

  • 标签
  • 说明
  • 日期
  • 作者
  • 首次发布
  • ...

如果BookEntity,则属性将如下所示:

  • 标签
  • 说明
  • 日期
  • 制造
  • 模型
  • ...

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

因此,我使用了批量导入工具Entity,该工具可以在CSV文件上工作,该文件为每个属性指定了标题。我遇到的问题是,我没有看到一种为每个neo4j-admin import添加特定属性的方法。我能想到的唯一解决方案是为整个实体集表示的每个可能的属性都包括一个CSV列,但是我相信我最终将在我的所有实体上获得一堆多余的属性。

EDIT1

每个Entity是唯一的,因此将有一些1M +类型(Neo4j中的标签)

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

1 个答案:

答案 0 :(得分:1)

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

因此,要支持多种“类型”的节点(在neo4j中称为labels),可以将原始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);