我一直在尝试过滤所有未连接到给定类型节点的节点,并发现了奇怪的行为.
特别是在我目前的小例子中,我有两个演员连接到一部电影,另一部电影没有连接到它.
此查询工作正常:
MATCH (a:Actor) WHERE NOT (a)-->(:Movie) RETURN a
由于两位演员都出演了我的一部电影,所以没有演员.
但是,当我这样写的时候
MATCH (a:Actor),(m:Movie) WHERE NOT (a)-->(m) RETURN a
它回归了两个演员.
反过来,查询
MATCH (m:Movie) WHERE NOT (m)<--(:Actor) RETURN m
按预期工作,回归电影没人出演,但这一次,
MATCH (m:Movie),(a:Actor) WHERE NOT (m)<--(a) RETURN m
也只返回没人出演过的电影!然而奇怪的是它返回了2行,这两行都是没有人主演的电影.
总而言之,我完全糊涂了.
最佳答案 简单的答案是,当您要求所有电影和所有演员时,您正在生成笛卡尔积.过滤掉不适用于一部电影的电影中的演员,但不能过滤掉两个演员都没有演出的第二部电影.
MATCH (a:Actor),(m:Movie) WHERE NOT (a)-->(m) RETURN a
你对第二个问题的明确目标是什么?
如果您的数据集实际上是4个小节点,那么请连续尝试这些查询,我想您会看到发生了什么.
完整的笛卡尔积
MATCH (a:Actor),(m:Movie) RETURN m,a
添加了where子句
MATCH (a:Actor),(m:Movie) WHERE NOT (a)-->(m) RETURN m,a