如何在加载csv时使用提示并在Neo4j中合并数据

时间:2017-05-23 07:08:47

标签: csv neo4j merge load hint

假设数据库中已存在5800万个节点和1亿个关系。

然后我想通过LOAD CSV方法加载包含130万个节点和100万个关系的增量批处理数据,如下所示:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t' 
MERGE (n:Person {cstid: row.cstid}) 
ON CREATE SET n.name = row.name 
ON MATCH SET n.name = row.name;

此外,还有一个独特的限制:Person(cstid),我不想使用它。所以我尝试使用如下的SCAN提示:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t' 
MERGE (n:Person {cstid: row.cstid}) 
USING SCAN n:Person
ON CREATE SET n.name = row.name 
ON MATCH SET n.name = row.name;

但Neo4j只是发出警告,终止请求并直接退出:

WARNING: Invalid input 's': expected 'n/N' (line 3, column 2 (offset: 154))
"using scan n:Person"
  ^

如果我指定INDEX提示,这种现象也存在:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t' 
MERGE (n:Person {cstid: row.cstid}) 
USING INDEX n:Person(cstid)
ON CREATE SET n.name = row.name 
ON MATCH SET n.name = row.name;

那么...... Neo4j是否支持在MERGE子句中使用提示?

Neo4j:3.2.0 CE

1 个答案:

答案 0 :(得分:1)

不,neo4j目前不支持带有USING子句的MERGE子句。

但是,这个逻辑上等效的查询应该有效:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t' 
OPTIONAL MATCH (n:Person {cstid: row.cstid}) 
USING SCAN n:Person
FOREACH(ignored IN CASE WHEN n IS NULL THEN [1] END | CREATE (n:Person {cstid: row.cstid}))
SET n.name = row.name;

如果节点不存在,FOREACH子句是用于创建节点的黑客。而且,由于您始终希望SET name属性,我们就是这样做的。