我有一个很大的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)
等等。
答案 0 :(得分:1)
如果你想避免程序化解决方案,也许你可以检查Neo4j的Talend(这是一个ETL)连接器:
答案 1 :(得分:0)
将100多列扩展到尽可能多的节点通常是不可取的。您不仅最终会消耗大量开销来存储可能超过200万个节点和相同数量的关系,而且处理一行的多个数据项将不必要地复杂和缓慢。此外,鉴于涉及大量节点和关系,可视化您的数据(如在neo4j浏览器中)可能非常困难。
通常,我会使用一种数据模型,该模型保留了对同一节点内的实体非常特定的属性。要按照您的示例:Person
节点可以包含属性id
,name
和age
。并且Person
节点与WORKS_AS
节点之间可能存在Occupation
关系 - 一个节点可能与许多其他Person
节点相关。这会将每行的节点数从4减少到2,关系数从3减少到1.(实际上,因为Occupation
节点可能会被大量{{1}共享节点,"属于"到一行的节点数量也应该被认为是1。这种安排也将在同一节点内保持同一查询更可能需要的属性。
以下是根据此示例数据模型从csv文件加载(以1000行块,以避免内存不足)的示例:
Person