使用Neo4jClient进行不区分大小写搜索

时间:2015-08-07 09:11:27

标签: neo4j neo4jclient

只是一个快速简单的,我需要能够搜索我们的数据库减去区分大小写,我知道如何做到这一点,而不是Neo4jClient。这是代码:

client.Cypher
            .Match("(person:Person)")
            .Where((Person person) => person.Email == search)

其中'搜索'是传递给方法的string类型的参数。我已经读过使用=〜'(?i)text'有效,但这并不允许我传递参数,我试过这个:

client.Cypher
            .Match("(person:Person)")
            .Where((Person person) => person.Email =~ "(?i){terms}")
            .WithParam("terms",search)

但它并不喜欢这样。

我希望能够在没有大小写的情况下进行搜索,并且如果可能的话,同时使用LIKE(或ILIKE,因为它似乎用于模式匹配)。

由于

编辑& ANSWER 最终的代码最终结果如下:

return client.Cypher
            .Match("(person:Person)")
            .Where("person.Email =~ {terms}")
            .OrWhere("person.Name =~ {terms}")
            .WithParam("terms", "(?ui).*" + search + ".*")
            .Return<Person>("person").Results.ToList();

这正是我想要的。 还接受了带有值的小写字段的建议,我们已经在帐户中有一个,以便登录名称不区分大小写,我将在电子邮件和名称字段上执行此操作,似乎比使用toLower()更好(无论是在Cypher还是在C#)

非常感谢@Stefan Armbruster的帮助。

1 个答案:

答案 0 :(得分:3)

您不能拥有部分参数。而是将(?i)添加到参数值:

query: person.Email =~ term
parameter: term = "(?i)<myvalue"

注1:您需要使用(?ui)来优雅地处理非ascii区分大小写(例如德语变音符号)。

注意2:=~运算符不受索引支持,因此上面的查询将触及每个Person节点并将正则表达式应用于属性值。在Neo4j 2.3中,将有一个支持字符串前缀匹配的索引LIKE

如果要使用基于索引的不区分大小写的搜索,建议的方法是将转换为小写的属性值存储(Cypher具有toLower函数),然后对较低的cased搜索值进行精确匹配