cypher中where子句与match的效率



我正在尝试使用密码查找用户"mike"不喜欢的10个帖子。将一个带有NOT关系的where子句与一个可选关系匹配,然后在where子句中检查该关系是否为空比起来更有效吗?具体来说,我想确保它不会执行相当于全表扫描的操作,并确保这是一个可伸缩的查询。

我用的是

START user=node:node_auto_index(uname:"mike"), 
  posts=node:node_auto_index("postId:*") 
  WHERE not (user-[:LIKES]->posts) 
  RETURN posts SKIP 20 LIMIT 10;

或者我可以做一些事情,在MATCH可选关系上进行过滤

START user=node:node_auto_index(uname="mike"),
  posts=node:node_auto_index("postId:*")
  MATCH user-[r?:LIKES]->posts  
  WHERE r IS NULL
  RETURN posts SKIP 100 LIMIT 10;

在控制台上的一些快速测试似乎显示第二种方法的性能更快。我是否可以假设第二个查询更快?如果是,为什么呢?

我认为在第一个查询中,引擎运行所有postID节点并手动检查每个post ID的not (user-[:LIKES]->posts)条件而在第二个示例中(假设至少使用v1.9.02),引擎只拾取post节点,这些节点实际上并没有连接到用户。这只是优化,引擎不遍历所有的postid节点。

如果可能的话,总是在查询中使用MATCH子句而不是WHERE,并尽量省略声明中的星号START n=node:index('name:*')

最新更新