编辑
在第二次看,好像你想实现某种条件逻辑到您的插入。
它看起来像你想要做的是弄清楚,如果一个人存在与一个UID(从row.player_cardnum一些串联派生),并在这种情况下:人不存在和匹配失败,MERGE
a:具有由row.player_cardnum给出的CardNumber的人员。
如果这是您的目标,那么您几乎与您的查询在那里。问题在于你的WHERE
条款。
了解WHERE
子句与前面的MATCH
,OPTIONAL MATCH
或WITH
相链接,并且仅影响链接的子句。
对于那个OPTIONAL MATCH
上的那个WHERE
,每个将始终为空,但更重要的是,您的行仍然存在,并且以下MERGE
将始终发生在CSV中的所有行。这可能是您放缓的原因,因为它正在为所有行创建新的:Person节点。
如果你想完全空出一行时,在现有的OPTIONAL MATCH
点击:人(所以MERGE
不会在这种情况下发生),你需要添加一个WITH
条款,并确保您的WHERE
子句适用于它而不是OPTIONAL MATCH
。
此外,请确保您对Person.UID和Person.CardNumber具有唯一约束或索引。至于UID匹配,我听说索引不是在你匹配的东西的某种字符串连接时使用的,所以你可能需要先将它组合起来,然后用WITH
传递它。
你最终的查询应该是这样的:
USING PERIODIC COMMIT 5000
LOAD CSV WITH HEADERS
FROM "file:///my_sds_39_joe.csv"
AS row
// first build the UID so we can take advantage of the index
WITH row, "Person." + row.player_cardnum AS UID
OPTIONAL MATCH (per:Person {UID : UID})
// the WHERE now applies to the WITH, which will filter out and null out the row when an OPTIONAL MATCH is found
WITH row, per
WHERE per IS NULL
MERGE (p:Person {CardNumber : row.player_cardnum})
ON CREATE SET p.Creation Date = timestamp(), p.Modification Date = timestamp() ;
你如何加载数据? –
我正在使用来自neo4j-shell的Load CSV命令。 – user2813165
@ user2813165请务必通过*编辑您的问题*来添加详细信息,而不是通过在评论中嵌入(特别是代码/查询,这些评论相当难以理解)。我编辑了你的问题以包含评论中的csv-load,所以你应该现在删除评论。 –