首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cypher合并太慢

Cypher合并太慢
EN

Stack Overflow用户
提问于 2016-11-14 09:48:07
回答 1查看 923关注 0票数 1

我有一个CSV文件,大约有1500万行。我正试图用CSV IMPORT导入它们,但是太长了。当我尝试用CREATE导入它们时,它们会在相当长的时间内被导入,但这会造成大量的重复。所以,我试着用MERGE代替,但这需要很多时间。在我终止查询之前,这个查询运行了10多个小时。在此之后,我尝试导入几个专栏--在结束查询之前等待了30多分钟。下面是只运行几列的代码:

代码语言:javascript
复制
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///companydata.csv' AS line1

MERGE (company:Company {companyNumber:line1.CompanyNumber,
                        companyName:line1.CompanyName,
                        uri:line1.URI
                          })

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-14 10:11:49

根据输入文件(companydata.csv)的名称和MERGE中使用的列,您似乎在滥用MERGE,除非URI实际上是复合主键的一部分:

  1. 匹配一个唯一的键
  2. 设置属性

否则,您将创建重复的节点,因为MERGE要么找到一个与所有条件匹配的节点,要么创建一个新节点。

这个查询应该看起来像

代码语言:javascript
复制
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约束还将创建一个索引,加快查找速度。

更新

关于如何寻址没有唯一属性的节点,比如与Company相关的包含额外属性的Company节点,有一些评论:CompanyInfo可能没有唯一的属性,但它与唯一的Company有着独特的关系,这足以识别它。

然后,更完整的查询如下:

代码语言:javascript
复制
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,这与您最初的查询类似:

代码语言:javascript
复制
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 (第一个条目wins)或ON CREATE SET / ON MATCH SET (完全控制)来调整您的去重复策略。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40585806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档