首页 > 解决方案 > Neo4j:一个 CSV 列中的多个可能节点

问题描述

我有一个企业和企业主的 CSV 文件,看起来像这样:

信噪比 商业 业务_ID 拥有者 性别
1 白羊座私人有限公司 12345 占士邦 男性
2 金牛座私人有限公司 23456 丹妮莉丝 女性
3 双子座私人有限公司 34567 金牛座私人有限公司 不适用

我想创建一个以企业为节点、所有者为节点以及企业与所有者之间的关系的图表。对于 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]->(丹妮莉丝)

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

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

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

我该怎么做呢?

标签: neo4jcypher

解决方案


我将为个人和企业引入一个全球标签......

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 来获取所有权关系。在后续导入中,您可以添加辅助 :Person 或 Business如果需要,标记到节点。


推荐阅读