Cypher MERGE太慢了

时间:2016-11-14 09:48:08

标签: csv merge neo4j cypher

我有一个包含大约1500万行的CSV文件。我试图用FK_UserID导入它们,但这花费的时间太长了。 当我尝试使用CSV IMPORT导入它们时,它们会在相当长的时间内导入,但这会产生大量重复。所以,我尝试使用CREATE,但这需要花费很多时间。在我终止查询之前,查询运行了超过10个小时。之后我尝试导入几个列并等待超过30分钟才终止查询。以下是运行几列的代码:

MERGE

我的问题是:MERGE通常是这样的,还是我做错了什么?

1 个答案:

答案 0 :(得分:3)

根据输入文件的名称(companydata.csv)和MERGE中使用的列,看起来您误用了MERGE,除非URI确实属于复合主键:

  1. 匹配唯一键
  2. 设置属性
  3. 否则,您将创建重复的节点,因为MERGE要么找到所有条件的匹配项,要么创建一个新节点。

    查询应该看起来像

    CREATE CONSTRAINT ON (c:Company) ASSERT c.companyNumber IS UNIQUE;
    
    USING PERIODIC COMMIT
    LOAD CSV WITH HEADERS FROM 'file:///companydata.csv' AS line1
    
    MERGE (company:Company {companyNumber: line1.CompanyNumber})
    SET company.companyName = line1.CompanyName,
        company.uri = line1.URI;
    

    unicity约束也会创建一个索引,加快查找速度。

    <强>更新

    有关于如何处理没有唯一属性的节点的评论,例如与CompanyInfo相关且包含额外属性的Company节点: CompanyInfo可能没有唯一属性,但它与唯一Company具有唯一关系,并且足以识别它。

    更完整的查询将如下所示:

    CREATE CONSTRAINT ON (c:Company) ASSERT c.companyNumber IS UNIQUE;
    
    USING PERIODIC COMMIT
    LOAD CSV WITH HEADERS FROM 'file:///companydata.csv' AS line1
    
    MERGE (company:Company {companyNumber: line1.CompanyNumber})
    SET company.companyName = line1.CompanyName,
        company.uri = line1.URI
    // This pattern is unique
    MERGE (company)-[:BASIC_INFO]->(companyInfo:CompanyInfo)
    SET companyInfo.category = line1.CompanyCategory,
        companyInfo.status = line1.CompanyStatus,
        companyInfo.countryOfOrigin = line1.CountryofOrigin;
    

    请注意,如果companydata.csv是导入的第一个文件,并且没有重复项,则只需使用CREATE代替MERGE并删除SET,看起来像您的初始查询:

    CREATE CONSTRAINT ON (c:Company) ASSERT c.companyNumber IS UNIQUE;
    
    USING PERIODIC COMMIT
    LOAD CSV WITH HEADERS FROM 'file:///companydata.csv' AS line1
    
    CREATE (company:Company {companyNumber: line1.CompanyNumber,
                             companyName: line1.CompanyName,
                             uri: line1.URI})
    CREATE (company)-[:BASIC_INFO]->(companyInfo:CompanyInfo {category: line1.CompanyCategory,
                                                              status: line1.CompanyStatus,
                                                              countryOfOrigin: line1.CountryofOrigin});
    

    但是,我注意到你提到尝试CREATE并获得重复项,所以我猜你确实在文件中有重复项。在这种情况下,您可以坚持MERGE查询,但您可能希望通过SET(第一个条目获胜)或{替换ON CREATE SET(最后一个条目获胜)来调整重复数据删除策略。 {1}} / ON CREATE SET(完全控制)。