运行不区分大小写的Cypher查询

45

是否可以在Neo4j上运行不区分大小写的Cypher查询?

您可以试用这个链接:http://console.neo4j.org/

当我输入以下内容时:

start n=node(*) 
match n-[]->m 
where (m.name="Neo") 
return m

它会返回一行数据。但是当我输入以下内容时:

start n=node(*) 
match n-[]->m 
where (m.name="neo") 
return m

它并不返回任何内容;因为这个名字被保存为 "Neo"。是否有一种简单的方法来运行不区分大小写的查询?

4个回答

60

1
=~ 运算符不使用索引。 - Abhi
2
我该如何传递参数?'(?i)$param''(?!)'+$param无效。 - vladkras
我认为你必须将整个正则表达式字符串作为参数使用。 - mcv

10

另一种方法是:

WHERE LOWER(m.Name) = LOWER("Neo")

如果您正在使用 Neo4j 客户端 (.NET):

Client.Cypher.Match("(m:Entity)")
    .Where("LOWER(m.Name) = LOWER({name})")
    .WithParam("name", inputName)
    .Return(m => m.As<Entity>())
    .Results
    .FirstOrDefault();

这个解决方案更容易应用于参数。 - thangdc94
@rotgers使用LOWER()函数会影响实际字符串上定义的索引查找吗? - Partha
@Partha,不好意思,我已经有一年没有碰Neo4j了,没有什么想法。 - rotgers
4
FYI - LOWER() 已被替换为 toLower()。字符串操作符的文档链接 - Jalakoo

2

如果有人想知道如何使用参数来实现这个功能,我成功地用以下方法实现了。

query = "{}{}{}".format('Match (n) WHERE n.pageName =~ "'"(?i)", name, '" RETURN n')

“name”是变量或参数的名称。


你能解释一下这是如何工作的,甚至怎么读吗? - mcv
"{}{}{}"看起来像是占位符,而.format将按顺序接受参数以替换占位符。可读性绝对是一个问题,但更大的问题似乎只是字符串拼接而不是参数化。所以我可以这样做:$"Match (n) WHERE n.pageName =~ {(?i)} name RETURN n(C#字符串插值)。 - Piotr Kula

0

您可以将参数传递给不区分大小写的正则表达式,例如:

WHERE m.name =~'(?i)({param})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接