Why query result have some not matched block?

The query i used:

#+BEGIN_QUERY
{:title "page-tags book+已读"
:query [:find (pull ?p [*])
:where
[?b :block/page ?p]
(page-tags ?p #{"book" "已读"})
;(not [?p :block/name "logseq"])
]
:collapsed? true
}
#+END_QUERY

and query result:


The result is not correct.

But i use another query :

{{query (and (page-tags BOOK) (page-tags 已读))}}

the result is correct:

My problem is the first query have four block in the result, but which is not match condition, why?

Welcome to Logseq community, @dahai :slight_smile:

[?b :block/page ?p]

Or, maybe (I’m a newcomer, but):

[?p :block/page ?p]

In fact ,this statement ([?b :block/page ?p]) has no action, it can be commented out, and the result is still incorrect.
Can somebody give more advice?