提高查询数量的性能

时间:2018-09-07 21:04:56

标签: neo4j cypher

我的网站上有一张表格,显示链接列表和访问链接的次数。这是我用来获取此类数据的密码查询:

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秒钟才能解决。

有什么方法可以改善此查询?

2 个答案:

答案 0 :(得分:1)

对于:VISITED关系,如果那些仅将:VISIT节点连接到:URL节点,则可以在模式上使用size()功能,但不包括节点标签,该功能将从以下位置获取学位信息: URL节点本身而无需扩展(您可以通过执行计划的PROFILE或EXPLAIN并扩展所有元素,在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(email)上建立索引,以便快速查找特定的:USER节点。

答案 1 :(得分:1)

除了@InverseFalcon的建议外,您还应该在:USER(email)上创建an index or uniqueness constraint,以避免必须浏览所有USER节点来找到感兴趣的节点。