Hetzroni
Hetzroni

Reputation: 2174

neo4j escaping for regular expressions

I receive a user input keyword and want to use it to search my database. I built a query that looks something like this:

db.execute("MATCH (n:User) WHERE n.firstname CONTAINS {keyword} OR n.lastname CONTAINS {keyword} RETURN n.username", params);

But this isn't case sensitive, so I thought of manually building the expression and using regular expressions, sort of as follows:

db.execute("MATCH (n:User) WHERE n.firstname =~ '(?i).*" + keyword + ".*' OR n.lastname =~ '(?i).*" + keyword + ".*' RETURN n.username");

I'm looking either for a function for escaping the regex or a better solution for making the query case-insensitive. Any ideas?

Upvotes: 0

Views: 264

Answers (1)

William Lyon
William Lyon

Reputation: 8556

I would suggest storing the properties as all lowercase (or uppercase) and then using the Cypher lower() function to convert user input to lowercase for comparison.

Add lowercase name properties

MATCH (n:User)
SET n.lowerFirstName = lower(n.firstname),
    n.lowerLastName = lower(n.lastname)

Find lower case matches based on user input

db.execute("MATCH (n:User) WHERE n.lowerFirstName CONTAINS lower({keyword}) OR n.lowerLastName CONTAINS lower({keyword}) RETURN n.username", params);

Upvotes: 1

Related Questions