【问题标题】:Neo4j cypher query taking too longNeo4j 密码查询耗时太长
【发布时间】:2017-05-11 13:26:00
【问题描述】:

我有一个简单的密码查询需要很长时间才能完成。

节点类型

  • 人员 {PersonId, PersonEmailAddress}

  • 文档 {DocumentId}

关系类型: 发送、收件人、抄送、密送

概念是:

(p:Person)-[:SENT]->(d:Document)-[:TO|CC|BCC]->(anotherPerson:Person)

我正在尝试让任何给定的人向其发送最多邮件的人。

例如,您可以在下图中看到 Person#1 向 Person#77 和 Person#615 等发送了最多的邮件(6 封邮件)。所以在这里我想要(如下表所述)前 5 个人员 ID,以及发送给该人的邮件数量。

+------------+-----------------------+
| ReceiverId | NumberOfMailsReceived |
+------------+-----------------------+
|         77 |                     6 |
|        615 |                     6 |
|        101 |                     4 |
|        247 |                     4 |
|        252 |                     4 |
+------------+-----------------------+

我正在尝试以下查询:

MATCH(p:Person{PersonId:1})-->(d) WITH DISTINCT d
MATCH (d)-->(rc)
RETURN rc, COUNT(rc) as c ORDER BY c DESC LIMIT 5

这里查询没有性能问题,因为 Person#1 仅发送了 9 个文档,并且只有 15 个人作为这 9 个文档的接收者。

但是,如果我对发送了近 56,500 个文档的另一个人发出相同的查询,并且总共有 869 个(不同的)人作为接收者参与,则查询需要 43261 毫秒才能完成

Cypher version: CYPHER 3.1, planner: COST, runtime: INTERPRETED. 21570218 total db hits in 43261 ms.

简介如下

我的 neo4j 浏览器在 Database 部分显示 Size: 5.16 GiB

这是我正在使用的配置:

dbms.memory.heap.initial_size=8G
dbms.memory.heap.max_size=8G
dbms.memory.pagecache.size=4g

对优化查询有什么建议或想法吗?

提前致谢。

编辑

将 Neo4j 版本从 3.1.1 更新到 3.2 后,查询仍然需要大约 23368 毫秒。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我认为您无法对原始 DBHITS 做任何事情,因为您的查询已经非常少(唯一浪费的精力是 DISTINCT 在示例案例中没有过滤任何内容);但是你可以尝试像这样并行你的查询

    MATCH (p:Person{PersonId:1})-->(d)
    MATCH (d)-[:TO]->(rc)
    WITH d, COLLECT(rc) AS list
    MATCH (d)-[:CC]->(rc)
    WITH d, list + COLLECT(rc) AS list
    MATCH (d)-[:BCC]->(rc)
    WITH d, list + COLLECT(rc) AS list
    UNWIND list AS rc
    RETURN rc, COUNT(rc) as c 
    ORDER BY c DESC 
    LIMIT 5
    

    (您可能需要在某处使用“USING JOIN ON d”以使 Cypher 并行分解工作)

    【讨论】:

      【解决方案2】:

      您应该能够通过文档从来源 Person 遍历到收件人,而不是在文档上处理一个不同的作为中间步骤。

      此查询如何支持您的数据集?

      MATCH(p:Person {PersonId:1})
      WITH p
      MATCH (p)-->(:Document)-->(rc:Person)
      RETURN rc, COUNT(rc) AS c 
      ORDER BY c DESC 
      LIMIT 5
      

      【讨论】:

        猜你喜欢
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 2011-02-07
        • 2013-04-08
        • 1970-01-01
        相关资源
        最近更新 更多