从平面 CSV 创建 neo4j 模型
neo4j Model Creation from flat CSV
我正在进行概念验证,需要一些指导。我有一个包含以下属性的平面文件:ID、姓名、电子邮件、性别、街道地址、城市、州、邮政编码、Phone、AltPhone、SSN(所有虚假数据。)
我想这样导入,每个Person是一个节点,每个地址是一个节点,每个ssn是一个节点,每个phone/altphone是一个节点。这是为了模仿许多欺诈环检测的例子。如何加载此 CSV 文件,创建这些关系?将有重复的地址和 phone 个数字,但在存在重复的地方,应该只存在 1 个节点。
有没有一种方法可以使用标准的 LOAD CSV 来做到这一点,或者我是否需要在 neoj4 之外按关系分解所有这些数据?
您可以使用 MERGE
Cypher 命令执行此操作。 MERGE
将查找模式并在模式不存在时创建它,但不会创建重复数据。
首先,根据您的数据模型定义唯一性约束。您应该为 MERGE 语句中使用的任何标签 属性 定义唯一性约束:
CREATE CONSTRAINT ON (p:Person) ASSERT p.personID IS UNIQUE;
CREATE CONSTRAINT ON (phone:Phone) ASSERT phone.number IS UNIQUE;
...
然后,使用 MERGE
和 LOAD CSV
看起来像这样(取决于您想要的数据模型):
LOAD CSV WITH HEADERS FROM "file:///flat_file.csv" AS row
MERGE (p:Person {personID: row.ID})
SET p.name = row.Name,
p.email = row.Email,
p.gender = row.Gender
MERGE (phone:PhoneNumber {number: row.Phone})
MERGE (altPhone:PhoneNumber {number: row.AltPhone})
MERGE (ssn:SSN {number: row.SSN})
MERGE (address:StreetAddress {address: row.StreetAddress})
MERGE (city:City {name: row.City})
MERGE (state:State {name: row.State})
MERGE (p)-[:HAS_SSN]->(ssn)
MERGE (p)-[:HAS_PHONE]->(phone)
MERGE (p)-[:HAS_ALT_PHONE]->(altPhone)
MERGE (p)-[:HAS_ADDRESS]->(address)
MERGE (address)-[:IS_IN]->(city)
MERGE (city)-[:IS_IN]->(state)
一般建议是分解 LOAD CSV
中的 cypher
语句,以分步完成您需要的内容。简单地说,您不会在单个 LOAD CSV
语句中完成所有操作。您可以创建 SSN 节点,然后创建地址节点等。
此外,您需要考虑创建索引并利用 MERGE
来处理可能重复的行。
这里是 good article 使用 LOAD CSV 时需要考虑的事项。
还有马克在 loading data 上的 post。 Mark 有很多很棒的 post,所以我鼓励您浏览他的博客。
最后,check out the doc's Merge
。
我正在进行概念验证,需要一些指导。我有一个包含以下属性的平面文件:ID、姓名、电子邮件、性别、街道地址、城市、州、邮政编码、Phone、AltPhone、SSN(所有虚假数据。)
我想这样导入,每个Person是一个节点,每个地址是一个节点,每个ssn是一个节点,每个phone/altphone是一个节点。这是为了模仿许多欺诈环检测的例子。如何加载此 CSV 文件,创建这些关系?将有重复的地址和 phone 个数字,但在存在重复的地方,应该只存在 1 个节点。
有没有一种方法可以使用标准的 LOAD CSV 来做到这一点,或者我是否需要在 neoj4 之外按关系分解所有这些数据?
您可以使用 MERGE
Cypher 命令执行此操作。 MERGE
将查找模式并在模式不存在时创建它,但不会创建重复数据。
首先,根据您的数据模型定义唯一性约束。您应该为 MERGE 语句中使用的任何标签 属性 定义唯一性约束:
CREATE CONSTRAINT ON (p:Person) ASSERT p.personID IS UNIQUE;
CREATE CONSTRAINT ON (phone:Phone) ASSERT phone.number IS UNIQUE;
...
然后,使用 MERGE
和 LOAD CSV
看起来像这样(取决于您想要的数据模型):
LOAD CSV WITH HEADERS FROM "file:///flat_file.csv" AS row
MERGE (p:Person {personID: row.ID})
SET p.name = row.Name,
p.email = row.Email,
p.gender = row.Gender
MERGE (phone:PhoneNumber {number: row.Phone})
MERGE (altPhone:PhoneNumber {number: row.AltPhone})
MERGE (ssn:SSN {number: row.SSN})
MERGE (address:StreetAddress {address: row.StreetAddress})
MERGE (city:City {name: row.City})
MERGE (state:State {name: row.State})
MERGE (p)-[:HAS_SSN]->(ssn)
MERGE (p)-[:HAS_PHONE]->(phone)
MERGE (p)-[:HAS_ALT_PHONE]->(altPhone)
MERGE (p)-[:HAS_ADDRESS]->(address)
MERGE (address)-[:IS_IN]->(city)
MERGE (city)-[:IS_IN]->(state)
一般建议是分解 LOAD CSV
中的 cypher
语句,以分步完成您需要的内容。简单地说,您不会在单个 LOAD CSV
语句中完成所有操作。您可以创建 SSN 节点,然后创建地址节点等。
此外,您需要考虑创建索引并利用 MERGE
来处理可能重复的行。
这里是 good article 使用 LOAD CSV 时需要考虑的事项。
还有马克在 loading data 上的 post。 Mark 有很多很棒的 post,所以我鼓励您浏览他的博客。
最后,check out the doc's Merge
。