1

我正在尝试使用 cypher 查找用户“mike”不喜欢的 10 个帖子。将带有 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;

控制台上的一些快速测试似乎显示第二种方法的性能更快。我是否正确假设第二个查询更快?而且,如果是这样,为什么?

4

1 回答 1

2

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

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

于 2013-01-14T15:45:50.323 回答