首页 > 解决方案 > Neo4J 对巨大数据库的查询非常慢

问题描述

我有一个包含 29M 节点和 43M 关系的数据库

我需要进行查询以查找艺术家的姓名

MATCH (a:Artist) WHERE toLower(a.name) CONTAINS toLower("John") AND a.group=false
WITH a
OPTIONAL MATCH (a)-[b:IS_SUBSCRIBED]->(c:Company)
WITH a, c
OPTIONAL MATCH (a)<-[f:HAS_MEMBER]-(g:Artist)
WITH a, c, collect([g.name, g.aid]) as groups
RETURN a.name AS name, a.aid as id, c.number as aie_number, c.email as email, groups
ORDER BY a.name
LIMIT 200

所以我有一些艺术家可能订阅了一家公司,并且可能是某些团体的成员。我需要获取该信息,当我进行查询时,这需要很长时间,超过 6 秒,在我看来有点慢,我已附上个人资料

在此处输入图像描述

有没有一些技巧可以提高性能?

我有艺术家姓名的索引和 :Artist(name, group) 的索引

在此先感谢您的帮助

标签: neo4jcypher

解决方案


问题是,尽管您有一个索引,因为您在比较之前对属性进行了toLower操作,但该索引并未被使用。name配置文件显示的第一步NodeByLabelScan。它正在对该name属性进行全表扫描。

:Artist在您的节点上创建一个名为 的新属性name_lower,将其设置为toLower(name),索引该属性并在搜索中使用它。这将极大地提高查询的性能。


推荐阅读