【发布时间】: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 毫秒。
【问题讨论】: