Neo4j将属性从CSV添加到节点

问题描述:

我有一个包含数百万个节点的标签Person。节点有一些属性,我试图从一个CSV文件添加一个新的属性到节点。 我想通过人的姓和名匹配他们,但查询太慢。查询是:Neo4j将属性从CSV添加到节点

USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM 'file:///personaldata.csv' AS line1 MATCH (p:Person {forename:line1.forename, surname:line1.surname}) SET p.newPersonNumber=line1.newPersonNumber

我离开也许一个小时运行查询之前我终止它。 我做错了什么? 请注意,我有索引forenamesurname

尝试剖析查询,看看它是否真的使用了索引:

PROFILE 
WITH "qwe" AS forename, "asd" AS surname 
MATCH (p:Person {forename: forename, surname: surname}) 
RETURN p 

如果没有,你可以强制:

WITH "qwe" AS forename, "asd" AS surname 
MATCH (p:Person {forename: forename, surname: surname}) 
USING INDEX p:Person(forename) 
USING INDEX p:Person(surname) 
RETURN p 

正如Cypher refcard(重点煤矿提到):

当Cypher使用次优指数或更多时,可以强制执行索引使用应该使用一个索引

另见关于USING的章节。


更新

由于使用同一节点上的多个指标目前不支持,让我们集中回为什么查询是缓慢的,它是否真正做一些事情。您可以天寒的一个子集的实际LOAD CSV,并查看是否有匹配的数据什么:

PROFILE 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///personaldata.csv' AS line1 
WITH line1 
LIMIT 10 
OPTIONAL MATCH (p:Person {forename:line1.forename, surname:line1.surname}) 
RETURN p, line1.newPersonNumber 

这样的话,你可以检查MATCH发现的东西(即名字及姓氏不需要修整或东西) ,并且您还可以检查哪个索引对查询更有利:因为只会使用1个索引,所以结果将在另一个属性上进行过滤,并且如果使用最具判别性的索引,结果将会更快。如果所有人都是约翰,那么最好使用姓氏上的索引,但如果他们都是,请使用姓氏上的索引。如果他们都是John的话,那么你就有一个重复问题...无论如何,比较2个配置文件之间的过滤步骤(使用任何一个索引)的数字应该能让你了解这些索引的分布情况。

+0

对不起,延迟回复。 该查询只使用一个索引,而不是两个索引。 运行 后'使用索引p:人(用的名字) 使用索引p:人(姓)' 我得到'不支持相同的变量多次提示(3号线,13列(偏移:109)) “使用索引p:Person(forename)“'。 我认为指数不是问题,因为我让查询运行一段时间,然后检查是否有与该属性是这样的节点: 'MATCH(P:人) WHERE EXISTS(p.newPersonNumber) RETURN p',但我得到了0行返回。 – Porjaz

+0

我已更新答案,重点关注查询的调试和分析。 –

+0

使用'PROFILE'我发现'MATCH'查找结果,所以我猜查询被写入正确。对我更有利的是有'forename'索引(就像现在这样)。我不知道还有什么可能是问题。另请注意,CSV文件为4.7 GB。 – Porjaz