Neo4j将属性从CSV添加到节点

Neo4j将属性从CSV添加到节点,csv,neo4j,cypher,Csv,Neo4j,Cypher,我有一个包含数百万个节点的标签Person。节点有一些属性,我正在尝试从CSV文件向节点添加新属性。 我试图通过这个人的名字和姓氏来匹配他们,但是查询太慢了。查询是: 使用定期提交 从中加载带有标题的CSV 'file:///personaldata.csv“作为第1行 匹配(p:Person{forename:line1.forename,姓氏:line1.names}) 设置p.newPersonNumber=line1.newPersonNumber 在终止查询之前,我让查询运行了大约一个

我有一个包含数百万个节点的标签Person。节点有一些属性,我正在尝试从CSV文件向节点添加新属性。 我试图通过这个人的名字和姓氏来匹配他们,但是查询太慢了。查询是:

使用定期提交
从中加载带有标题的CSV
'file:///personaldata.csv“作为第1行
匹配(p:Person{forename:line1.forename,姓氏:line1.names})
设置p.newPersonNumber=line1.newPersonNumber

在终止查询之前,我让查询运行了大约一个小时。 我做错什么了吗?
请注意,我在
名字
姓氏

上有索引,请尝试分析查询,看看它是否真的使用了索引:

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使用次优索引或应使用多个索引时,可以强制使用索引

另请参见关于的章节


更新

由于目前不支持在同一个节点上使用多个索引,所以让我们再关注一下查询速度慢的原因,以及它是否真的起作用。您可以为子集分析实际的
加载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

这样,您可以检查
匹配项是否找到了某些内容(即,姓名和姓氏不需要修剪或其他内容),还可以检查哪个索引对查询更有利:因为只使用一个索引,所以结果将在其他属性上过滤,如果你使用最具辨别力的索引,速度会更快。如果所有的人都是约翰,你最好使用姓氏索引,但如果他们都是约翰,则使用名字索引。如果他们都是约翰做的,你就有复制问题。。。无论如何,比较两个配置文件(使用任意一个索引)之间的过滤步骤上的数字应该可以让您了解索引的分布情况。

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

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使用次优索引或应使用多个索引时,可以强制使用索引

另请参见关于的章节


更新

由于目前不支持在同一个节点上使用多个索引,所以让我们再关注一下查询速度慢的原因,以及它是否真的起作用。您可以为子集分析实际的
加载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

这样,您可以检查
匹配项是否找到了某些内容(即,姓名和姓氏不需要修剪或其他内容),还可以检查哪个索引对查询更有利:因为只使用一个索引,所以结果将在其他属性上过滤,如果你使用最具辨别力的索引,速度会更快。如果所有的人都是约翰,你最好使用姓氏索引,但如果他们都是约翰,则使用名字索引。如果他们都是约翰做的,你就有复制问题。。。无论如何,比较两个配置文件(具有任意一个索引)之间过滤步骤上的数字,应该可以让您了解索引的分布情况。

很抱歉回复太晚。查询只使用一个索引,而不是两个索引。运行
后,使用索引p:Person(名字)使用索引p:Person(姓氏)
我得到
不支持对同一变量的多个提示(第3行第13列(偏移量:109))“使用索引p:Person(名字)”
。我认为索引不是问题所在,因为我让查询运行了一段时间,然后检查是否有这样的节点:
MATCH(p:Person)WHERE EXISTS(p.newPersonNumber)RETURN p
,但我返回了0行。我已更新了答案,以将重点放在查询的调试和分析上。使用
PROFILE
我看到
MATCH
查找结果,因此我猜查询编写正确。对我来说,更有益的是在
名字
上建立索引(就像现在一样)。我不知道还有什么问题。还请注意,CSV文件的大小为4.7 GB。无论CSV的大小如何(这会影响总运行时间),因为您已经使用定期提交了
,过一段时间后应该会看到一些结果。在子集上运行更新查询,测量所需时间(估计完整运行将持续多长时间),并检查属性是否添加到少数节点。CSV列的名称也没有输入错误(
line1.newPersonNumber
)?很抱歉回复太晚。查询只使用一个索引,而不是两个索引。运行
后,使用索引p:Person(名字)使用索引p:Person(姓氏)
我得到
不支持对同一变量的多个提示(第3行第13列(偏移量:109))“使用索引p:Person(名字)”
。我认为索引不是问题所在,因为我让查询运行了一段时间,然后检查是否有这样的节点:
MATCH(p:Person)WHERE EXISTS(p.newPersonNumber)RETURN p
,但我返回了0行。我已更新了答案,以将重点放在查询的调试和分析上。使用
PROFILE
我看到
MATCH
查找结果,因此我猜查询编写正确。对我来说,更有益的是在
名字
上建立索引(就像现在一样)。我不知道还有什么问题。还请注意,CSV文件的大小为4.7 GB。无论CSV的大小如何(这会影响总运行时间),因为您已经使用定期提交了
,过一段时间后应该会看到一些结果。在子集上运行更新查询,测量所需时间(估计完整运行将持续多长时间),并检查属性是否添加到少数节点。CSV列的名称也没有输入错误(
line1.newPersonNumber
)?