如何解决优化 Cypher 查询以查找 2 度联系人
我继承了下面的查询,给定一个特定的人 (pid),它识别出所有访问过与该人相同位置的人,同时具有给定的重叠量,并且在提供的日期内范围(一级联系人),以及使用相同匹配条件找到的那些人的所有联系人(二级联系人)。查询有效,但性能很差(执行可能需要 10 分钟以上,具体取决于输入,但理想情况下应在几秒钟内完成)。人数和地点不多,但访问量却很多。
可以做些什么来优化它?任何指导将不胜感激。
系统: 在 AWS t2.medium EC2(1 个 vCPU,4GB RAM)上使用 Neo4j 4.1.0 社区。p>
数据量: 节点:91人,85个地点; 关系:135,085 次访问
WITH "%s" as pid,datetime("%s") as fromTime,datetime("%s") as toTime,[%s] as types,%s as minoverlap,%s as extend,datetime() as timeNow
MATCH (p1:Person { id: pid })-[r1]-(l:Location)-[r2]-(p2:Person)
WITH p1,r1,l,r2,p2,fromTime,toTime,types,minoverlap,extend,timeNow,CASE WHEN r1.endTime IS NULL THEN timeNow ELSE r1.endTime END as r1EndTime,CASE WHEN r2.endTime IS NULL THEN timeNow ELSE r2.endTime END as r2EndTime
WHERE p1.type IN types AND p2.type IN types AND r1.startTime > fromTime AND r1EndTime < toTime AND r2.startTime > fromTime AND r2EndTime < toTime
WITH p1,apoc.coll.max([r1.startTime.epochMillis,r2.startTime.epochMillis]) as overlapStart,apoc.coll.min([(r1EndTime.epochMillis + extend),(r2EndTime.epochMillis + extend)]) as overlapEnd
WHERE overlapStart <= overlapEnd AND (overlapEnd - overlapStart) > minoverlap
OPTIONAL MATCH (p2)-[r3]-(l2:Location)-[r4]-(p3:Person)
WITH p1,r3,l2,r4,p3,overlapStart,CASE WHEN r3.endTime IS NULL THEN timeNow ELSE r3.endTime END as r3EndTime,CASE WHEN r4.endTime IS NULL THEN timeNow ELSE r4.endTime END as r4EndTime
WHERE p3.type IN types AND r3.startTime > fromTime AND r3EndTime < toTime AND r4.startTime > fromTime AND r4EndTime < toTime
WITH p1,apoc.coll.max([r3.startTime.epochMillis,r4.startTime.epochMillis]) as overlapStart1,apoc.coll.min([(r3EndTime.epochMillis + extend),(r4EndTime.epochMillis + extend)]) as overlapEnd1
WHERE overlapStart1 <= overlapEnd1 AND (overlapEnd1 - overlapStart1) > minoverlap AND overlapStart1 > overlapStart
RETURN p1,p3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。