Neo4j 故障速度

Neo4j speed of failure

我将嵌入式 Neo4j 与 Java 一起使用,并自动生成查询,这些查询在尝试匹配的关系数量以及这些关系是否可选方面各不相同。这是具有可选关系的查询示例:

   MATCH (target:C4)-[rvara:IN_LOCATION]->(nvara:LOCATION) 
   OPTIONAL MATCH (nvara:LOCATION)-[rvarb:CONNECTED]->(nvarb:LOCATION)
   OPTIONAL MATCH (nvarc:LOCATION)-[rvarc:CONNECTED]->(nvara:LOCATION)
   OPTIONAL MATCH (target:C4)-[rvard:HAS_VALUE]->(nvard:TRUE)  
   RETURN DISTINCT target, FILTER(x IN [rvara, rvarb, rvarc, rvard]      
   WHERE x IS NOT NULL ) AS collected

我注意到当找不到匹配项时,查询引擎可能需要很长时间才能确定。当找到匹配项时,它会更快地找到它,尽管搜索 space 应该是相同的;至少我假设他们都必须检查 return 结果的所有可能匹配项,无论它们是否为空。如果查询不匹配任何内容,有没有办法让查询更快地失败?

如果您在浏览器中 运行 使用 EXPLAIN 这个查询,您就会得到计划。

注意计划顶部的所有 "node by label scan"。我认为花费很长时间的原因是如果查询失败并且什么都不生成,它必须一遍又一遍地扫描具有特定标签的所有节点。如果查询成功,因为它是 OPTIONAL MATCH 我认为它只需要找到一个匹配项。因此,找到一个(并跳过其余扫描)总是比一遍又一遍地扫描相同的节点群要快。