Neo4j Cypher MATCH和LIMIT确实限制了匹配工作或仅返回

时间:2017-01-31 19:42:22

标签: neo4j cypher

假设我发出此查询

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,以便它们不在缓存中,时间结果相同。

1 个答案:

答案 0 :(得分:2)

[增订]

使用初始查询时,LIMIT子句应该限制MATCH子句完成的工作量。我在neo4j版本2.3,3.0和3.1.1中使用PROFILE验证了这一点。

例如,在3.1.1版本中,我创建了20个标记为node的节点。您的查询产生了以下计划:

enter image description here

请注意,NodeByLabelScan操作的数据库命中数仅为6(在我的测试中总是比LIMIT值多1个),而不是20或21。

但是,这并不意味着LIMIT子句将始终限制前面的MATCH子句所完成的工作量。而且,即使它确实如此,MATCH子句所完成的实际工作量也可能大于LIMIT值所暗示的工作量。

例如,假设查询如下(并且还假设:node(timestamp)没有索引):

MATCH (n:node)
WHERE n.timestamp > 1234567890
RETURN n LIMIT 5
  • 如果DB中匹配节点的总数是< 5,那么MATCH子句必须扫描所有 node个节点。
  • 如果数据库中匹配节点的总数>> 5,则MATCH子句必须继续扫描,直到找到5个匹配的node节点。在最坏的情况下,在扫描完所有node个节点之前,可能找不到第5个匹配节点。