Predicates

So far, we have only been dealing with data patterns: [?m :movie/year ?year]. We have not yet seen a proper way of handling questions like "Find all movies released before 1984". This is where predicate clauses come into play.

Let's start with the query for the question above:

[:find ?title
 :where
 [?m :movie/title ?title]
 [?m :movie/year ?year]
 [(< ?year 1984)]]

The last clause, [(< ?year 1984)], is a predicate clause. The predicate clause filters the result set to only include results for which the predicate returns a "truthy" (non-nil, non-false) value. You can use any Clojure function or Java method as a predicate function:

[:find ?name
 :where 
 [?p :person/name ?name]
 [(.startsWith ?name "M")]]

Clojure functions must be fully namespace-qualified, so if you have defined your own predicate awesome? you must write it as (my.namespace/awesome? ?movie). Some ubiquitous predicates can be used without namespace qualification: <, >, <=, >=, =, not= and so on.