如何创建具有多个关系的唯一节点?

时间:2019-10-09 10:09:55

标签: neo4j cypher

我有4个表格,涵盖房地产交易数据。

  • 交易记录表包含transactionID,价格,日期
  • 房屋表包含transactionID,地址
  • 买方表包含transactionID,名称,dateOfBirth
  • 卖方表包含transactionID,名称,dateOfBirth

房子可能易手几次。在不同交易的买方和卖方表中都可能列出一个人。一笔交易可能有多个买家和/或卖家。

我的目标是创建三个标记为:People,:House和:Transaction的节点及其相关关系。即:People和:House节点将指向:Transaction节点。

我的问题是如何创建独特的:People节点,使其涉及不同的事务。

我是一个完整的新手,这是我设置的第一张(非教程)图。我尝试了使用MERGE的各种方法,但均无济于事。以下是一些入门代码-

LOAD CSV WITH HEADERS FROM "file:///...transactions.csv" AS row

CREATE (:Transaction {transactionID: row.transactionID, price: row.price, date: row.date});

LOAD CSV WITH HEADERS FROM "file:///...house.csv" AS row

CREATE (:House {transactionID: row.transactionID, address: row.address});

LOAD CSV WITH HEADERS FROM "file:///...buyers.csv" AS row

CREATE (:Person {transactionID: row.transactionID, name: row.name, dOB: row.dateOfBirth});

LOAD CSV WITH HEADERS FROM "file:///...sellers.csv" AS row

CREATE (:Person {transactionID: row.transactionID, name: row.name, dOB: row.dateOfBirth});

1 个答案:

答案 0 :(得分:1)

这是一种方法。

  1. 创建所有Transaction节点:

    LOAD CSV WITH HEADERS FROM "file:///...transactions.csv" AS row
    CREATE (:Transaction {transactionID: row.transactionID, price: row.price, date: row.date});
    
  2. 创建House节点(如果尚不存在),并将每个节点连接到正确的Transaction节点(但忽略没有transactionID的{​​{1}} s行节点):

    Transaction
  3. 为购买者创建LOAD CSV WITH HEADERS FROM "file:///...house.csv" AS row MATCH (t:Transaction {transactionID: row.transactionID}) MERGE (h:House {address: row.address}) CREATE (h)<-[:HOUSE]-(t); 节点(如果尚不存在),并将每个节点连接到正确的Person节点(但忽略没有{{ 1}}个节点):

    Transaction
  4. 为卖方创建transactionID节点(如果尚不存在),并将每个节点连接到正确的Transaction节点(但忽略没有{{ 1}}个节点):

    LOAD CSV WITH HEADERS FROM "file:///...buyers.csv" AS row
    MATCH (t:Transaction {transactionID: row.transactionID})
    MERGE (p:Person {name: row.name, dOB: row.dateOfBirth})
    CREATE (p)<-[:BUYER]-(t);
    

注意:使用这种方法,多个Person节点可以具有相同的Transaction值(只要它们的生日不同)。您可能希望为每个transactionID赋予唯一的Transaction,以区别它们。