【问题标题】:Neo4j add property from CSV to a nodeNeo4j 将属性从 CSV 添加到节点
【发布时间】:2016-11-21 22:24:49
【问题描述】:

我有一个包含数百万个节点的标签 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 上有索引。

【问题讨论】:

    标签: csv neo4j cypher


    【解决方案1】:

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

    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 个索引会如果使用,那么结果将在另一个属性上进行过滤,如果您使用最具判别性的索引,它会更快。如果所有人都是 Johns,你最好使用 surname 索引,但如果他们都是 Does,则使用 forename 索引。如果它们都是 John Do,那么您就有重复问题...无论如何,比较 2 个配置文件(使用任一索引)之间过滤步骤的数字应该可以让您了解索引的分布。

    【讨论】:

    • 抱歉回复晚了。该查询仅使用一个索引,而不是两者。运行USING INDEX p:Person(forename) USING INDEX p:Person(surname) 后,我得到Multiple hints for same variable are not supported (line 3, column 13 (offset: 109)) "USING INDEX p:Person(forename)"。我认为索引不是问题,因为我让查询运行了一段时间,然后检查是否有具有该属性的节点,如下所示:MATCH (p:Person) WHERE EXISTS (p.newPersonNumber) RETURN p,但我返回了 0 行。
    • 我已经更新了答案,专注于查询的调试和分析。
    • 使用PROFILE 我看到MATCH 找到了结果,所以我猜查询是正确编写的。对我来说更有益的是在forename 上有索引(就像现在一样)。我不知道还有什么问题。另请注意,CSV 文件为 4.7 GB。
    • 不管 CSV 文件的大小(这会影响总运行时间),因为您拥有USING PERIODIC COMMIT,一段时间后您应该会看到一些结果。在子集上运行更新查询,测量需要多长时间(估计完整运行将持续多长时间)并检查属性是否已添加到几个节点。 CSV 列的名称也没有错字 (line1.newPersonNumber)?
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多