Since Neo4j 4.4, there is a new Cypher syntax Node pattern predicates.
Is it possible to implement similar Relationship pattern predicates as well? It would allow querying for a variable-length path pattern for relationships that have properties designating its validity start/end.
Current query to return friends at a specified date:
MATCH p=(n:Person WHERE id(n) = $id)-[:FRIEND_OF*1..5]-(:Person) WHERE all(r IN relationships(p) WHERE r.dateFrom <= $date AND r.dateTo >= $date) RETURN p
Proposed query:
MATCH p=(n:Person WHERE id(n) = $id)-[r:FRIEND_OF*1..5 WHERE r.dateFrom <= $date AND r.dateTo >= $date]-(:Person) RETURN p
The current query searches for all paths first, which is harmful for performance because it can return lots of paths, and post-filters the result.
The proposed query would apply the condition during the traversal, so that only the matching paths are returned.