我有一个包含大约1500万行的CSV文件。我试图用FK_UserID
导入它们,但这花费的时间太长了。
当我尝试使用CSV IMPORT
导入它们时,它们会在相当长的时间内导入,但这会产生大量重复。所以,我尝试使用CREATE
,但这需要花费很多时间。在我终止查询之前,查询运行了超过10个小时。之后我尝试导入几个列并等待超过30分钟才终止查询。以下是运行几列的代码:
MERGE
我的问题是:MERGE通常是这样的,还是我做错了什么?
答案 0 :(得分:3)
根据输入文件的名称(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约束也会创建一个索引,加快查找速度。
<强>更新强>
有关于如何处理没有唯一属性的节点的评论,例如与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
(完全控制)。