Neo4j 在非常大的图上收集和排序节点的查询优化
我有一个相当大的图(18亿个节点和大致相同数量的关系),其中我正在执行以下查询:Neo4j 在非常大的图上收集和排序节点的查询优化,neo4j,cypher,Neo4j,Cypher,我有一个相当大的图(18亿个节点和大致相同数量的关系),其中我正在执行以下查询: MATCH (n:Article) WHERE n.id IN $pmids MATCH (n)-[:HAS_MENTION]->(m:Mention) WITH n, collect(m) as mentions RETURN n.id as pmid, mentions ORDER BY pmid 其中$pmid是字符串列表,例如[“1234”,“4567”],其中该列表的长度从100-500不等 我目
MATCH (n:Article)
WHERE n.id IN $pmids
MATCH (n)-[:HAS_MENTION]->(m:Mention)
WITH n, collect(m) as mentions
RETURN n.id as pmid, mentions
ORDER BY pmid
其中$pmid是字符串列表,例如[“1234”,“4567”]
,其中该列表的长度从100-500不等
我目前在neo4j docker社区实例中保存数据,并进行以下配置修改:neo4j_dbms_memory_pagecache_size=32G,neo4j_dbms_memory_heap_max_size=32G。已为Article.id创建索引
这个查询的运行速度非常慢(大约5秒),我希望进行优化以提高运行速度。作为工作的一部分,我可以访问neo4j enterprise,因此一种方法是将此数据作为neo4j enterprise帐户的一部分接收,在该帐户中我可以调整高级配置设置
总的来说,对于如何提高性能,无论是优化密码查询本身、增加工作人员还是neo4j.conf中的其他设置,有人有什么建议吗
提前谢谢
对于任何感兴趣的人-我也在中提出了这个问题,并且已经有一些有趣的优化建议(特别是围绕“类型提示”触发反向索引,以及使用模式理解而不是collect()
最初的想法)
- 您正在使用字符串字段存储PMID,但PMID是数字的,它可能会减少数据库大小,如果存储为int(索引为int,搜索为int),性能可能会更好
- 如果PMID列表通常很大,并且服务器有六个以上的内核,那么apoc并行密码功能可能值得研究
- 你真的需要提到节点的每一个属性吗?如果不需要,试着收集你所需要的
- 以GBs为单位的数据库大小是多少?(内存设置方面需要一些上下文),neo4j admin memrec建议了什么
- 如果数据库一直都是这样使用的,那么sql数据库可能会更好,在构建sql数据库时,将提到的内容收集到一个字段中(一次完成)