在现有的巨大数据集上创建关系

时间:2016-08-25 14:03:38

标签: neo4j cypher

我有一个表 - 实体(Entities.txt),我已经使用“LOAD CSV”命令加载到Neo4j中。 实体表的结构如下:

**Entity Table**
ENT_ID  Name  PARENTID
1      ABC     0     
2      DEF     1
3      GHI     0
4      JKG     3

我有另一张表格,格式如下:

**Relationship Table**
RelationID ENT_IDPARENT ENT_IDCHILD 
 1     1        2
 2     3        5
 3     4        6

我需要的是在现有节点上创建关系。每个RelationID代表特定类型的关系。例如:RelationID = 1表示ENT_IDPARENT = 1是FATHER_OF ENT_IDCHILD = 2.类似地,每个其他RID代表一些其他关系。该表有40个RID。

基于链接: How to create unique nodes and relationships by csv file imported in neo4j?

我尝试编写下面的语法来创建关系。

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///C:/Users/ssubramana001/Desktop/EntitiesRelationships_Updated.txt" AS Entity FIELDTERMINATOR '|' 
MATCH (n:Entity {ENT_ID: Entity.ENT_IDPARENT})
WITH Entity, n
MATCH (m:Entity {ENT_ID: Entity.ENT_IDCHILD})
WITH m,n
MERGE (n)-[r:SON_OF]->(m)

此查询不起作用。

1 个答案:

答案 0 :(得分:0)

显然,我没有拥有数百万行的实际文件,但这肯定适用于您的示例:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///relationships.csv" AS line
WITH toInt(line.ENT_IDPARENT) AS parentId, toInt(line.ENT_IDCHILD) AS childId
WHERE line.RelationID = '1'
MATCH (p:Entity {ENT_ID: parentId}), (c:Entity {ENT_ID: childId})
MERGE (p)-[:FATHER_OF]->(c);

请注意,它会像创建节点in your previous question一样转换数值。

您在使用USING PERIODIC COMMIT时出现OutOfMemory错误确实很奇怪,但您可以尝试将CS​​V文件拆分为较小的文件,以确定在导入所有文件后是否也会发生这种情况。也许你的Neo4j实例没有足够的内存来管理所有这些节点(我想它必须非常有限)?您是否可以使用确切的OutOfMemory错误更新问题,包括消息?你可能已经用完了PermGen或MetaSpace(取决于你的Java版本),或者因为这个而点击交换并让GC花费太多时间。