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

问题描述:

假设数据库中已经存在5800万个节点和1亿个关系。如何在加载csv和合并Neo4j中的数据时使用提示

然后我想要加载含有130万个节点和经由LOAD CSV方法百万关系象下面的增量批量数据:

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; 

此外,有一个唯一的约束:人(cstid),我不想使用它。于是,我就使用扫描提示如下图所示:

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

没有,Neo4j的目前不支持与MERGE子句USING条款。

然而,这在逻辑上等效的查询应该工作:

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子句是用于创建,如果它不存在的节点的黑客攻击。而且,既然你总是想要SETname财产,我们只是这样做。

+0

什么是[1]代表什么? –

+0

它是一个包含单个值(被忽略)的集合,它导致执行'|'后的操作(在本例中为一次)。如果要求迭代“NULL”值或空集合,“FOREACH”不执行任何操作。 – cybersam