【问题标题】:Query optimization that collects and orders nodes on very large graph在非常大的图上收集和排序节点的查询优化
【发布时间】:2021-01-29 15:47:36
【问题描述】:

我有一个相当大的图表(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

其中 $pmids 是字符串列表,例如["1234", "4567"] 这个列表的长度在 100-500 之间变化。

我目前将数据保存在 neo4j docker 社区实例中,并进行了以下配置修改:NEO4J_dbms_memory_pagecache_size=32G,NEO4J_dbms_memory_heap_max__size=32G。已为 Article.id 创建索引。

此查询的运行速度很慢(大约 5 秒),我想优化以加快运行速度。作为工作的一部分,我可以访问 neo4j 企业,因此一种方法是将这些数据作为 neo4j 企业帐户的一部分提取,我可以在其中调整高级配置设置。

一般来说,是否有人对我如何提高性能有任何提示,无论是优化密码查询本身、增加工作人员还是 neo4j.conf 中的其他设置?

提前致谢。

对于任何感兴趣的人 - 我也在 neo4j forums 中提出了这个问题,并且已经有一些有趣的优化建议(尤其是围绕“类型提示”来触发向后索引,并使用模式理解而不是 collect()

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    最初的想法

    • 您正在使用字符串字段来存储 PMID,但 PMID 是数字,它可能会减小数据库大小,并且如果存储为 int(并且索引为 int,搜索为 int)可能会更好地执行
    • 如果 PMID 列表通常很大,并且服务器有超过 6 个内核,则可能值得研究 apoc 并行密码函数
    • 您真的需要提及节点中的每个属性吗?如果不尝试收集你需要的东西
    • 数据库的大小(以 GB 为单位)是多少? (在内存设置方面需要一些上下文),neo4j-admin memrec 有什么建议?
    • 如果始终如此使用 db,则 sql 数据库可能会更好,并且在构建该 sql db 时,将提及项收集到一个字段中(一次完成)

    注意:去 PubMed!

    【讨论】:

    • 感谢您的回复! 4) 数据库目录大约是 330GB - 我实际上只是在阅读有关 apoc.mapParallel 的内容,并且有兴趣尝试看看我可能获得哪种类型的加速 5) 非常好。我最初寻求知识图表示,因为我认为可能会提出涉及最短路径和其他图分析/算法的潜在有趣问题。这也是“踢轮胎”以查看 neo4j 如何处理更大图表的一般方法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多