neo4j - 提高查询计数的性能
问题描述
我的网站中有一个表格来显示链接列表以及它们被访问的次数。这是我用来获取此类数据的密码查询:
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 秒才能解决。
有什么方法可以改进这个查询?
解决方案
对于 :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 节点很快。
推荐阅读
- python - 使用 selenium python 登录网站
- reactjs - PropTypes.exact 和 PropTypes.shape 之间的区别
- python-3.x - 如何在张量流顺序模型中添加 CRF 层?
- java - 试图建立一个列表以在多个地方使用
- jhipster - 从管理前端隐藏 jhipster 配置文件或参数
- javascript - JS不会在txt中写入信息
- python - 使用 Numpy 生成 N 维矩阵
- java - 在 java 中用什么代替 finalize()
- java - RecyclerView 项目不可见
- jquery - core.js:9110 ERROR TypeError: $(...).flowchart is not a function