Cypher - 匹配没有关系的节点时的奇怪行为
Cypher - odd behavior when matching for nodes that don't have a relationship
我一直在尝试过滤所有未连接到给定类型节点的节点,并发现了一个奇怪的行为。
特别是在我当前的小例子中,我有两个演员连接到一部电影,另一部电影没有任何连接。
此查询运行良好:
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
我一直在尝试过滤所有未连接到给定类型节点的节点,并发现了一个奇怪的行为。
特别是在我当前的小例子中,我有两个演员连接到一部电影,另一部电影没有任何连接。
此查询运行良好:
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