【问题标题】:Running a case-insensitive cypher query运行不区分大小写的密码查询
【发布时间】:2012-11-06 12:25:26
【问题描述】:

是否可以在 neo4j 上运行不区分大小写的密码查询?

试试看: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”。有没有一种简单的方法来运行不区分大小写的查询?

【问题讨论】:

    标签: neo4j case-insensitive cypher


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      是的,通过使用不区分大小写的正则表达式:

      WHERE m.name =~ '(?i)neo'
      

      https://neo4j.com/docs/cypher-manual/current/clauses/where/#case-insensitive-regular-expressions

      【讨论】:

      • =~ 运算符不使用索引
      • 如何在这里传递参数? '(?i)$param''(?!)'+$param 不起作用
      • 我认为你必须使用整个正则表达式字符串作为参数。
      【解决方案3】:

      如果有人正在研究如何使用参数执行此操作,我设法做到了这样。

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

      而“名称”是变量或你的参数

      【讨论】:

      • 你能解释一下它是如何工作的,或者如何阅读它吗?
      • "{}{}{}" 看起来像占位符,.format 将按顺序接收参数或替换占位符。可读性绝对是这里的一个问题,但更大的问题似乎是这只是字符串连接而不是参数化。所以我可以这样做$"Match (n) WHERE n.pageName =~ {(?i)} name RETURN n(C# 字符串插值)
      【解决方案4】:

      另一种方法是:

      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();
      

      【讨论】:

      • 这个方案更容易申请参数
      • @rotgers 使用 LOWER() 函数不会影响在实际字符串上定义的索引查找吗?
      • @Partha,不知道,我已经一年多没接触 Neo4j了。
      • 仅供参考 - LOWER() 已替换为 toLower()。 Doc link for string operators
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多