什么创造了Cypher / Neo4j"期望两个字符串,但得到了[Ljava.lang.String; @ 22d9b2a2和..."错误

时间:2016-11-18 21:39:33

标签: neo4j cypher

我导入了一个如下图:

(x:Person {id:"Pers1"})-[:factoid {name:[" Abt Eberhard "]}]->(u:Source {id:"Source1"})

进入Neo4j社区版3.0.7(今天仅在Windows 10机器上安装)。

f.name中搜索整个字词的工作正常:

MATCH g=(p:Person)-[f:factoid]-(u:Source)
WHERE f.name=' Abt Eberhard '
RETURN f.name

但使用CONTAINSSTARTS WITH或带有=~的正则表达式,例如

MATCH g=(p:Person)-[f:factoid]-(u:Source)
WHERE f.name STARTS WITH ' A'
RETURN f.name

返回类似于

的错误
Expected two strings, but got [Ljava.lang.String;@38fb2527 and  A

我做错了什么?

2 个答案:

答案 0 :(得分:0)

在示例数据中,name关系的factoid属性是字符串列表:[" Abt Eberhard "]。只需删除方括号,它也适用于STARTS WITH

CREATE
     (x:Person {id:"Pers1"})-[:factoid {name:" Abt Eberhard "}]->
     (u:Source {id:"Source1"})

MATCH g=(p:Person)-[f:factoid]-(u:Source)
WHERE f.name STARTS WITH ' A'
RETURN f.name

╒══════════════╕
│f.name        │
╞══════════════╡
│ Abt Eberhard │
└──────────────┘

相等比较有效,因为(可能)Cypher引擎在列表上执行类似toString()的操作。但请注意结果的差异:

CREATE
     (x:Person {id:"Pers1"})-[:factoid {name:" Abt Eberhard "}]->
     (u:Source {id:"Source1"})
CREATE
     (x:Person {id:"Pers1"})-[:factoid {name:[" Abt Eberhard "]}]->
     (u:Source {id:"Source1"})

MATCH g=(p:Person)-[f:factoid]-(u:Source)
WHERE f.name=' Abt Eberhard '
RETURN f.name

╒════════════════╕
│f.name          │
╞════════════════╡
│ Abt Eberhard   │
├────────────────┤
│[ Abt Eberhard ]│
└────────────────┘

答案 1 :(得分:0)

有趣。 non-clustered值实际上是一个集合,只包含一个字符串。这是故意的吗?

我很惊讶这个查询:

PolicyNumber

返回任何内容,因为该查询询问集合是否等于字符串,这应该导致错误或至少是name

"正确"语法将是这样的:

MATCH g=(p:Person)-[f:factoid]-(u:Source) WHERE f.name=' Abt Eberhard ' RETURN f.name

看起来你尝试的其他字符串函数更挑剔。例如,false可以使用"正确的"语法:

MATCH g=(p:Person)-[f:factoid]-(u:Source) WHERE f.name[0]=' Abt Eberhard ' RETURN f.name[0]