Neo4J:加载具有大量行和列的csv文件,可能的解决方案?

时间:2014-06-20 14:26:37

标签: csv neo4j

我有一个很大的CSV数据文件,包含20k记录和100多列,我想在Neo4J中加载它。现在,如果我为每条记录创建一个节点,那么我将拥有20k个节点,每个节点具有100多个属性。但是此时节点之间没有关系。 我想要做的是,从列创建节点(当然重复值将合并到一个节点)和每个记录的伪节点(让它命名为rowNode)并在它们之间创建关系。现在,我有20k rowNodes,每个节点都有100个与之相关的列节点。

CSV中的现有加载并不是按照我想要的方式进行的。我还没找到任何具有此功能的工具。我能想到的唯一方法是编写代码以编程方式执行。在朝着这个方向前进之前,我想知道还有其他方法可以实现它。有什么想法吗?

更新 您可以考虑以下示例:

id,name,age,occupation
1,John,50,businessman
2,mary,40,consultant
3,jack,45,architect
4,sarah,25,student

我想要提取的内容:

(rowNode)-[:relationship]->(name)
(rowNode)-[:relationship]->(age)
(rowNode)-[:relationship]->(occupation)

在这种情况下:

(1)-[:hasname]->(john)
(1)-[:age]->(50)

等等。

2 个答案:

答案 0 :(得分:1)

如果你想避免程序化解决方案,也许你可以检查Neo4j的Talend(这是一个ETL)连接器:

  • 示例here
  • 最新的Talend Neo4j连接器release
  • 跟踪当前在Neo4j 2.x上的进度here

答案 1 :(得分:0)

将100多列扩展到尽可能多的节点通常是不可取的。您不仅最终会消耗大量开销来存储可能超过200万个节点和相同数量的关系,而且处理一行的多个数据项将不必要地复杂和缓慢。此外,鉴于涉及大量节点和关系,可视化您的数据(如在neo4j浏览器中)可能非常困难。

通常,我会使用一种数据模型,该模型保留了对同一节点内的实体非常特定的属性。要按照您的示例:Person节点可以包含属性idnameage。并且Person节点与WORKS_AS节点之间可能存在Occupation关系 - 一个节点可能与许多其他Person节点相关。这会将每行的节点数从4减少到2,关系数从3减少到1.(实际上,因为Occupation节点可能会被大量{{1}共享节点,"属于"到一行的节点数量也应该被认为是1。这种安排也将在同一节点内保持同一查询更可能需要的属性。

以下是根据此示例数据模型从csv文件加载(以1000行块,以避免内存不足)的示例:

Person