0

我目前在处理 Neo4J 请求时遇到性能问题。

这是问题所在。我需要从一个大列表中找到数据库中的用户。为此,uniqCode 必须匹配,或者名称和位置 (zip) 必须匹配。

然后我希望能够将此用户与我创建的节点合并。

下面的查询有效,但对于 30 个用户的列表需要 20 到 30 秒,在实际情况下,需要传递 5000 到 10000 个用户的列表。

我指定我索引了 uniqCode 和用户节点的名称。

UNWIND $users as row
    MATCH (u:User)
    WHERE u.uniqCode = row.uniqCode
    OR (
        apoc.text.clean(u.name) = row.name
        AND EXISTS ((u)-[:IS]->(:Zip {name:row.zip}))
    )
    MERGE (u)<-[:IS]-(a:ParallelUser {id:row.uuid, name: u.name, uniqCode: row.uniqCode})
    RETURN {name: a.name, uniqCode: a.uniqCode, id: a.id} AS ParallelUser

带参数的样子

[{uniqCode: "1234", name: "John Doe", zip: "1234", uuid: "1234"}, ...]

预先感谢您的帮助...

4

1 回答 1

0

如果您可以MATCH在查询中为子句使用索引,那就太好了。您可以通过运行查询并在前面加上PROFILE. 随时将结果发布回此处以进行更详细的讨论。

查询调优文档可能对您有所帮助。

我发现这个免费课程很有启发性。

u.name如果必须将索引包装在apox.text.clean()函数中,您将无法使用索引。您可以在存储之前在该属性上运行该函数,或者创建一个新cleanName属性吗?然后您可以创建一个包含该属性的索引。

MERGE您的查询部分,我想知道是否需要所有三个属性ParallelUser来唯一标识节点?如果id单独就足够了,那么您可以MERGE这样重写该部分:

MERGE (u)<-[:IS]-(a:ParallelUser {id:row.uuid})
SET a.name = u.name, a.uniqCode = row.uniqCode
于 2021-12-28T13:11:23.147 回答