neo4j对缺少的匹配进行查询失败,而不是返回空数组

时间:2017-03-03 14:42:47

标签: neo4j cypher

鉴于以下密码查询

  MATCH (u:User {id: {userId}}), (b:B {id: {bId})
  CREATE (c:C), (c)-[:HAS_USER]->(u), (b)-[:SOME_REL]->(c)

正如您所看到的,我正在创建一个节点C,该节点必须与两件事有关系,一些节点b和一些用户。

当u或b不存在时,我得到一个空数组,但我希望neo4j以失败而不是空数组作为响应。这使我更容易知道缺少哪个节点。当匹配子句没有返回任何内容时,是否有可能“强制”失败?

1 个答案:

答案 0 :(得分:7)

这就是它的工作原理,如果MATCH返回null,则查询失败。这就是为什么他们有OPTIONAL MATCH可用,以便在返回null时不会失败。

编辑:在此结尾添加return

MATCH (u:User {id: {userId}}), (b:B {id: {bId})
CREATE (c:C), (c)-[:HAS_USER]->(u), (b)-[:SOME_REL]->(c)
RETURN 'success'

因此,如果你获得成功,那意味着匹配找到它正在寻找的东西,如果没有,那么它就不会

编辑2:

OPTIONAL MATCH (u:User {id: {userId}}), (b:B {id: {bId})
with *,CASE when u is not null and b is not null then [1] else [] end as exists
FOREACH (x in exists | CREATE (c:C), (c)-[:HAS_USER]->(u), (b)-[:SOME_REL]->(c))

RETURN u,b

所以现在我们做一个可选的匹配,所以当找不到它时它不会分解。然后我们做一个CASE语句,用户和B都存在,我们创建一些关系。最后我们返回User和b并检查它们是否存在或者是否存在任何空值。