如何调整cypher查询的模板?

时间:2017-04-21 04:11:39

标签: neo4j cypher

我正在为查询编写一个模板,该模板返回包含相关信息的测试分数列表。使用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

商店信息

  • Array Store 8.00 KiB
  • 逻辑日志17.05 MiB
  • 节点商店143.96 KiB
  • 物业商店1.67 MiB
  • Relationship Store 1.28 MiB
  • String Store Size 72.00 KiB
  • 商店总面积29.54 MiB

节点ID信息

  • 节点ID 9463
  • 物业编号42673
  • 关系ID 39466
  • 关系类型ID 12

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个部分,与您的查询的其余部分无关。