【问题标题】:Neo4j query using only one core of my machineNeo4j 查询仅使用我机器的一个核心
【发布时间】:2021-09-19 22:33:52
【问题描述】:

我是图形数据库的新手,正在努力使用以下查询处理 1M 关系。我观察到以下查询仅使用 1 个核心并且花费的时间太长。是否可以使用所有可用内核并行运行查询?我遇到了 AOPC 函数 apoc.cypher.parallel2 并且不确定它是否可以解决问题。我正在使用社区版,但如果我可以让它并行运行,我可以升级到企业版。

MATCH p=(a:address)-[r*]->(b:address)
WHERE NOT (b)-[]->(:address)
WITH a,b, LAST(nodes(p)) as c,length(p) as depth
RETURN a.add_id, c.add_id,max(depth)
ORDER BY a.add_id
;

提前致谢。

【问题讨论】:

    标签: neo4j parallel-processing cypher


    【解决方案1】:

    您可以使用CALL apoc.periodic.iterate() 执行并行执行,使用您添加到选项的parallel: true 参数。

    但是——通常这些是用于写操作,而您的查询是读操作。就此处的并行阅读而言,尚不清楚您要做什么。

    通常,要并行化读取,您会将其分解为多个分页读取,并执行多个不同的查询。就像让我们将这一点作为查询的核心“主体”:

    MATCH p=(a:address)-[r*]->(b:address)
    WHERE NOT (b)-[]->(:address)
    WITH a,b, LAST(nodes(p)) as c,length(p) as depth
    RETURN a.add_id, c.add_id,max(depth)
    

    为了并行读取,我会说 3 个不同的查询,每个查询都以不同的结尾:

    ORDER BY a.add_id SKIP 0 LIMIT 100

    ORDER BY a.add_id SKIP 100 LIMIT 100

    ORDER BY a.add_id SKIP 200 LIMIT 100

    ...等等。每个都为您提供 100 个结果的页面

    【讨论】:

    • 这可能是我对 RDBS 的理解,当查询在数据库中运行时,整体工作负载(为运行查询而生成的任务)在并行处理引擎上的所有 CPU 上进行拆分。在这种情况下,我几乎可以肯定认为只有一个核心在运行整个查询,我猜测是否有办法使用额外的 CPU 更快地完成查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多