密码与匹配中where子句的效率

时间:2013-01-12 13:13:35

标签: neo4j cypher

我正在尝试使用cypher找到10个用户“mike”没有喜欢的帖子。将带有NOT关系的where子句放在比使用可选关系匹配更高效的情况下,然后在where子句中检查该关系是否为null?具体来说,我想确保它不会完全相当于全表扫描,并确保这是一个可伸缩的查询。

这是我正在使用的

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;

控制台上的一些快速测试似乎在第二种方法中表现出更快的性能。我是否正确地假设第二个查询更快?如果是这样,为什么呢?

1 个答案:

答案 0 :(得分:2)

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

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