Neo4j将属性从CSV添加到节点

时间:2016-11-18 12:16:50

标签: csv neo4j cypher

我有一个包含数百万个节点的标签Person。节点有一些属性,我试图从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上有索引。

1 个答案:

答案 0 :(得分:0)

尝试分析查询以查看它是否真正使用索引:

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个索引,然后在其他属性上过滤结果,如果使用最具判别性的索引,它会更快。如果所有人都是约翰斯,你最好使用姓氏上的索引,但如果他们全部都是,请使用forename上的索引。如果他们都是John Do,你就会遇到重复问题...无论如何,比较两个配置文件(带有任一索引)之间的过滤步骤上的数字应该可以让你了解索引的分布。