我正在为查询编写一个模板,该模板返回包含相关信息的测试分数列表。使用Neo4j社区的样本数据集,他们需要很长时间。
这是一个例子,
// Marks that were ranked top 10 on that test, and performed during a
section between 2015-1-1 and 2016-02-07
MATCH (mark:Mark)-[r1:PERFORMED_BY]->(prsn:Person)
MATCH (mark:Mark)-[r2:PERFORMED_ON]->(test:Test)
MATCH (mark:Mark)-[r3:PERFORMED_FOR]->(course:Course)
MATCH (mark:Mark)-[r4:PERFORMED_DURING]->(sect:Section)
MATCH (s:Section)-[r5:LOCATED_IN]->(room:Room)
WHERE r2.rank in range(1,10) AND sect.datetime in range(1420099200000,1494831600000,100000)
RETURN mark.uid, prsn.uid, test.uid, course.uid, sect.uid, mark.score, course.datetime, prsn.name, course.title, room.number
r1.class, r2.rank, r3.rank
ORDER BY mark.score
最简单的查询WHERE r2.rank = 1
可能需要几秒钟。使用范围运算符时,需要30秒以上。是否有任何策略可以调整查询?
Neo4j社区3.1.1
答案 0 :(得分:2)
首先匹配最相关的数据是有帮助的,因为较小的数据集将更容易,更快地过滤后续的MATCH操作。一旦您过滤到相关节点,那么您将返回所需的其余节点上的匹配。
此外,您还需要确保索引为:快速查找的部分(日期时间)。
试试这个:
MATCH (mark:Mark)-[r4:PERFORMED_DURING]->(sect:Section)
// faster to do an indexed range query like this
WHERE 1420099200000 <= sect.datetime <= 1494831600000
MATCH (mark)-[r2:PERFORMED_ON]->(test:Test)
WHERE 1 <= r2.rank <= 10
// now you have all relevant marks, match on the rest of the nodes you need
MATCH (mark)-[r1:PERFORMED_BY]->(prsn:Person)
MATCH (mark)-[r3:PERFORMED_FOR]->(course:Course)
MATCH (sect)-[r5:LOCATED_IN]->(room:Room)
RETURN mark.uid, prsn.uid, test.uid, course.uid, sect.uid, mark.score, course.datetime, prsn.name, course.title, room.number
r1.class, r2.rank, r3.rank
ORDER BY mark.score
此外,在调整以找出问题区域时,最好对查询进行概要分析。
哦,另一个原因是爆炸,你已经对a:sect
部分进行了匹配,但是下面的匹配没有使用sect
变量,所以匹配找到所有所有会议室中的s
个部分,与您的查询的其余部分无关。