我有一个CSV文件,大约有1500万行。我正试图用CSV IMPORT导入它们,但是太长了。当我尝试用CREATE导入它们时,它们会在相当长的时间内被导入,但这会造成大量的重复。所以,我试着用MERGE代替,但这需要很多时间。在我终止查询之前,这个查询运行了10多个小时。在此之后,我尝试导入几个专栏--在结束查询之前等待了30多分钟。下面是只运行几列的代码:
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
})我的问题是:合并通常是这样的还是我做错了什么?
发布于 2016-11-14 10:11:49
根据输入文件(companydata.csv)的名称和MERGE中使用的列,您似乎在滥用MERGE,除非URI实际上是复合主键的一部分:
否则,您将创建重复的节点,因为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约束还将创建一个索引,加快查找速度。
更新
关于如何寻址没有唯一属性的节点,比如与Company相关的包含额外属性的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 (第一个条目wins)或ON CREATE SET / ON MATCH SET (完全控制)来调整您的去重复策略。
https://stackoverflow.com/questions/40585806
复制相似问题