假设我发出此查询
MATCH(n:node)
RETURN n LIMIT 5
cypher在进行匹配时会考虑LIMIT
子句吗?
对我的数据集的测试会指出答案是否定的。
上面的查询在neo shell中需要7366ms
对
MATCH (a:Address) where id(a) IN [1589346,1589347,1589348,1589349,1589350]
RETURN a
需要81毫秒
我还选择了随机ID,以便它们不在缓存中,时间结果相同。
答案 0 :(得分:2)
[增订]
使用初始查询时,LIMIT
子句应该限制MATCH
子句完成的工作量。我在neo4j版本2.3,3.0和3.1.1中使用PROFILE
验证了这一点。
例如,在3.1.1版本中,我创建了20个标记为node
的节点。您的查询产生了以下计划:
请注意,NodeByLabelScan
操作的数据库命中数仅为6(在我的测试中总是比LIMIT
值多1个),而不是20或21。
但是,这并不意味着LIMIT
子句将始终限制前面的MATCH
子句所完成的工作量。而且,即使它确实如此,MATCH
子句所完成的实际工作量也可能大于LIMIT
值所暗示的工作量。
例如,假设查询如下(并且还假设:node(timestamp)
没有索引):
MATCH (n:node)
WHERE n.timestamp > 1234567890
RETURN n LIMIT 5
MATCH
子句必须扫描所有 node
个节点。MATCH
子句必须继续扫描,直到找到5个匹配的node
节点。在最坏的情况下,在扫描完所有node
个节点之前,可能找不到第5个匹配节点。