Neo4j版本3中的新错误,有没有人有任何答案?

时间:2016-08-05 15:34:43

标签: neo4j compiler-errors cypher

以下查询对此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()强制转换为字符串。

任何方向都会非常感激。

1 个答案:

答案 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