让我们考虑具有2个节点标签(User
和Movie
)和1种关系类型(RATES
)的Neo4j数据库。我有一些用户节点没有连接到任何电影节点。
让我们考虑以下问题:
MATCH (u1:User) OPTIONAL MATCH (u1:User)-[r1:RATES]->() OPTIONAL MATCH ()<-[r1:RATES]-(u2:User) RETURN u1.name, u2.name
我同意查询可能看起来不太有用但我想理解为什么当Neo.DatabaseError.General.UnknownError
个节点没有任何边缘时它会抛出User
异常,但是当没有这样的节点时它会起作用。
据我了解,它应该为每个u
null
返回User
或u
。
当从上一个查询的开头删除MATCH (u1:User) OPTIONAL
时,即使存在没有任何关系的User
个节点,它也不会抛出异常。
MATCH (u1:User)-[r1:RATES]->() OPTIONAL MATCH ()<-[r1:RATES]-(u2:User) RETURN u1.name, u2.name
但是,对于每个u
User
至少有一个关系,它会返回u
。
但我希望在没有关系的情况下获得null
个节点User
。
有人能解释一下为什么我们在第一个查询中得到异常并且是否有另一种方法可以达到相同的预期结果?
答案 0 :(得分:1)
我遇到了完全相同的问题,答案是你在OPTIONAL MATCH
子句中使用相同的变量用于两个关系,在这种情况下r1
。
如果第一个OPTIONAL MATCH
成功,一切都应该有效,但如果它不匹配,第二个OPTIONAL MATCH
将导致此错误。
这就是为什么当您更改为r2
时,即使第一个可选匹配可能不匹配也是如此。