我正在尝试使用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;
控制台上的一些快速测试似乎在第二种方法中表现出更快的性能。我是否正确地假设第二个查询更快?如果是这样,为什么呢?
答案 0 :(得分:2)
我认为在第一个查询中,引擎会遍历所有postID
个节点,并为每个帖子ID手动检查not (user-[:LIKES]->posts)
的条件
而在第二个示例中(假设您至少使用v1.9.02),引擎仅选取实际未连接到用户的post节点。这只是引擎不通过所有postID节点的最优化。
如果可能,请始终在查询中使用MATCH子句而不是WHERE,并尝试省略声明START n=node:index('name:*')
中的星号