Neo4j:来自一个 CSV 列的多个可能节点

问题描述

我有一个包含企业和企业主的 CSV 文件,如下所示:

S/n 业务 Business_ID Owned_By 性别
1 白羊座私人有限公司 12345 詹姆斯邦德
2 Taurus Pte Ltd 23456 丹妮莉丝 女性
3 gemini Pte Ltd 34567 Taurus Pte Ltd 不适用

我想创建一个图表,以企业为节点,所有者为节点,企业与所有者之间的关系。对于 s/n 1 和 2,这是非常简单的:

LOAD CSV WITH HEADERS FROM "....csv" AS file
MERGE (b:Business {ID: file.Business_ID) 
WITH file,b
MERGE (p:Person {Name: file.Owned_by,Gender: file.Gender}) 
WITH file,b,p
MERGE (b)-[:owned_by] ->(p) 

但请注意,一个企业也可能归另一个企业所有(s/n 3),并且企业和个人包含不同的属性(Business_ID 和性别)。使用上面的语法,我会得到 s/n 2 和 3 的两个不同的关系:

(Taurus Pte Ltd)-[:owned_by]->(Daenerys)

(gemini Pte Ltd)-[:owned_by]->(Taurus Pte Ltd)

但我想要的是显示整个所有权链的单一关系:

(Taurus Pte Ltd)-[:owned_by]->(gemini Pte Ltd)-[:owned_by] ->(Daenerys)

我应该怎么做?

解决方法

我将为个人和企业推出一个全球标签...

LOAD CSV WITH HEADERS FROM "....csv" AS file
MERGE (b:Entity {ID: file.Business_ID) 
WITH file,b
MERGE (p:Entity {Gender: file.Gender) 
WITH file,b,p
MERGE (b)-[:owned_by] ->(p)

我真的不知道你为什么使用 Gender,可能是一个错字,但无论如何......在第一次导入时使用全局节点标签,如 :Entity 来获取所有权关系。在后续导入中,您可以添加辅助:如果需要,可以为节点添加人员或企业标签。