以下查询对此question
是一个非常合适的答案WITH ["seafood"] AS keywords
MATCH (p:Product) WHERE all(x IN keywords WHERE toLower(p.name) CONTAINS toLower(x))
RETURN p
但是现在我在版本3.0.3和3.0.4中收到以下错误:
期望一个字符串值,但得到:[Ljava.lang.String; @ 3cac07cf;也许你想用str()强制转换为字符串。
任何方向都会非常感激。
答案 0 :(得分:0)
正如@WilliamLyon所说,也许p.name
并不总是一个字符串。有可能在3.0.3中,CONTAINS
子句现在更严格地禁止在不同类型的值之间进行比较。
试试这个:
WITH ["seafood"] AS keywords
MATCH (p:Product)
WHERE ALL(x IN keywords WHERE TOLOWER(TOSTRING(p.name)) CONTAINS toLower(x))
RETURN p;
这可能也适合你。在3.0.3中,=~
正则表达式运算符似乎不受非字符串值的困扰。此外,(?i)
标志无需使用TOLOWER
。为了提高性能,查询只在顶部生成一次正则表达式,而不是在WHERE
子句中生成N次(其中N是Product
个节点的数量)。< / p>
WITH ["seafood"] AS keywords
WITH REDUCE(s = [], x IN keywords | s + ('(?i).*' + x + '.*')) AS regexps
MATCH (p:Product)
WHERE all(x IN regexps WHERE p.name =~ x)
RETURN p