在LOAD CSV

时间:2016-11-30 03:46:48

标签: neo4j

我不确定我是否在通过LOAD CSV导入CSV数据时最佳地使用CREATE CONSTRAINT,并希望得到更多知识渊博的反馈/建议。

我从大约3到1,200万条记录的数据库中导入。我知道批量导入功能会更快,但由于各种原因,LOAD CSV是此项目的更好选择。我可以让事情运行很长时间,但我想确保尽可能地优化。

我的代码目前是:

CREATE CONSTRAINT ON (i:Inventor) ASSERT i.hanID IS UNIQUE;
CREATE CONSTRAINT ON (p:Patent) ASSERT p.patNo IS UNIQUE;
CREATE CONSTRAINT ON (c:Country) ASSERT c.countryCode IS UNIQUE;

// Import Inventors and link them to their country
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///...//names.short" AS row
FIELDTERMINATOR '|'
MERGE (c:Country {countryCode:row.Person_ctry_code})
MERGE (i:Inventor {hanId:row.HAN_ID, name:row.Person_name_clean})
CREATE (i)-[:LivesIn]->(c);

// Load patents and link the to their inventors
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///.../patents.short" as row
FIELDTERMINATOR '|' 
MERGE (i:Inventor {hanId:row.HAN_ID})
MERGE(p:Patent {patNo:row.Patent_number})
CREATE (i)-[:Invented]->(p);

每个发明人都有一个独特的 hanID ,每个专利都是唯一的 patNo ,每个国家都有一个独特的 countryCode ,尽管每个发明人,专利和国家/地区可能会多次出现在数据中。

  • 在开始最佳LOAD CSV语句之前创建约束吗?
  • 有没有明显的方法来提高我的进口速度?

非常感谢。

1 个答案:

答案 0 :(得分:2)

加载CSV之前的约束创建是一个很好的举措,因为只需要创建一次约束。

对于导入查询,最好只使用unique属性进行MERGE,并使用ON CREATE设置其他属性(如发明人的名称)。

就速度改进而言,当你进口时你可能只会这样做一次,所以速度通常不是一个因素,除非由于某种原因需要非常长的时间。

您可以通过以下方式加载CSV:Country,just:Inventor,只需:Patent,没有条目的重复,并使用CREATE而不是MERGE将它们导入数据库。然后,在导入所有节点后,您可以使用描述中的查询和CSV来创建关系,但您可以在所有节点上使用MATCH而不是MERGE。

请记住,MERGE是尝试MATCH的简写,如果没有MATCH,它将创建,因此使用CREATE提前创建所有节点可以避免额外的不必要检查以查看节点是否首先存在。

编辑

cybersam's answer针对另一个问题突出了我以前没有意识到的事情。显然,当使用另一个属性进行输入时,索引不会用于查找(也应该应用于唯一属性)。

要解决此问题,您必须将属性别名为值,然后使用它们。

例如,在您要加载的查询:Patent和:Inventor节点中,您必须执行以下操作:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///.../patents.short" as row
FIELDTERMINATOR '|' 
WITH row.HAN_ID as hanId, row.Patent_number as patNo
MERGE (i:Inventor {hanId:hanId})
MERGE(p:Patent {patNo:patNo})
CREATE (i)-[:Invented]->(p);
CREATE (i)-[:LivesIn]->(c);