我有一个包含数百万个节点的标签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
在我终止查询之前,我将查询运行了大概一个小时。
难道我做错了什么?
请注意,我在forename
和surname
上有索引。
答案 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,你就会遇到重复问题...无论如何,比较两个配置文件(带有任一索引)之间的过滤步骤上的数字应该可以让你了解索引的分布。