我在我的网站上有一个表格,以显示链接的列表和它们被访问的次数。下面是我用来获取这样的数据的cypher查询:
MATCH (u:USER {email: $email})-[:CREATED]->(l:URL)
OPTIONAL MATCH (l)<-[v:VISITED]-(:VISIT)
RETURN l, COUNT(v) AS count
LIMIT 10我为URL的每次访问创建了一个访问节点,以便存储每次访问的分析数据。因此,在上面的代码中,我获取了用户创建的链接,并计算了每个链接的访问量。
问题是上面的查询是不能执行的。现在数据变得非常庞大,至少需要8秒才能解决。
有什么方法可以改进这个查询吗?
发布于 2018-09-08 05:16:10
对于:访问关系,如果它们只连接:访问节点到:URL节点,那么您可以在模式上使用size()函数,不包括节点标签,它将从:URL节点本身获得学位信息,而不必展开(您可以通过对计划执行概要或解释来确认这一点,并展开所有元素,在Projection操作中查找GetDegreePrimitive )。
此外,由于您在没有任何排序的情况下使用了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 (电子邮件)上建立索引,以便快速查找特定的:USER节点。
发布于 2018-09-08 05:56:45
除了@InverseFalcon的建议之外,您还应该在:USER(email)上创建an index or uniqueness constraint,以避免必须扫描所有USER节点才能找到感兴趣的节点。
https://stackoverflow.com/questions/52229620
复制相似问题