我导入了一个如下图:
(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
但使用CONTAINS
,STARTS 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
我做错了什么?
答案 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]