不区分大小写的参数匹配

Case insensitive parameter match

我想匹配宠物和它们的主人。目前我这样做:

MATCH (n:Person) WITH n MATCH (p:Pet{owner: n.name})
RETURN *

这有效,但没有找到我的所有结果。

无法找到我的所有结果的原因是 p.ownern.name 之间的字母大小写并不总是匹配。 Person name 可以是大写或小写,Pet owner 可以是大写或小写。在这种情况下,在数据库输入之前没有一致性和清理数据不是一个选项。

我需要的是在忽略任何大小写问题的同时匹配 Persons 和 Pets,最好是将 p.ownern.name.

都小写

我尝试使用 toLower(),但我无法在查询中将 owner 小写(语法错误)。

你有没有尝试过类似的东西:

MATCH (n:Person) 
WITH n 
MATCH (p:Pet)
WHERE toLower(n.name) = toLower(p.owner)
RETURN *

选项 1 - 在导入数据库时​​将相关字符串转换为小写

这将允许您继续使用现有的查询并减少处理。

注意:以下查询是您查询的更简洁形式。此外,您应该考虑在 :Pet(owner) 上创建一个 index 以完全优化查询。

MATCH (n:Person), (p:Pet {owner: n.name})
RETURN *

选项 2 - 使用不区分大小写的正则表达式

如果由于某种原因您无法更改导入的字符串,那么您可以使用 Cypher 对 case-insensitive regular expressions 的支持,如:

MATCH (n:Person), (p:Pet)
WHERE n.name =~ '(?i)' + p.owner
RETURN *

此选项比选项 1 显着慢,因为它无法利用索引,并且需要对每一对[= PersonPet 个节点的 31=]。