首页 > 解决方案 > 提高查询计数的性能

问题描述

我的网站中有一个表格来显示链接列表以及它们被访问的次数。这是我用来获取此类数据的密码查询:

MATCH (u:USER {email: $email})-[:CREATED]->(l:URL)
OPTIONAL MATCH (l)<-[v:VISITED]-(:VISIT)
RETURN l, COUNT(v) AS count
LIMIT 10

我为 URL 的每次访问创建一个 VISIT 节点,以便存储每次访问的分析数据。所以在上面的代码中,我抓取了用户创建的链接并计算每个链接的访问量。

问题是上述查询不高效。现在数据已经很大了,至少需要 8 秒才能解决。

有什么方法可以改进这个查询?

标签: neo4jcypher

解决方案


对于 :VISITED 关系,如果只连接 :VISIT 节点到 :URL 节点,则可以使用size()模式上的函数,不包括节点标签,它将从 :URL 节点本身获取度数信息,而无需展开(您可以通过对计划进行 PROFILE 或 EXPLAIN 来确认这一点并展开所有元素,GetDegreePrimitive在 Projection 操作中查找)。

此外,由于您使用的 LIMIT 10 没有任何排序,因此最好早点执行 LIMIT,这样您只对有限的节点集执行后续操作,而不是为所有节点完成所有工作,然后只保留 10 个。

MATCH (u:USER {email: $email})-[:CREATED]->(l:URL)
WITH l
LIMIT 10
RETURN l, size((l)<-[:VISITED]-()) as count

此外,正如cybersam 所指出的,您绝对希望在 :USER(email) 上有一个索引,因此查找您的特定 :USER 节点很快。


推荐阅读