Cypher - 匹配没有关系的节点时的奇怪行为

时间:2015-01-08 14:51:22

标签: neo4j cypher

我一直在尝试过滤所有未连接到给定类型节点的节点,并发现了奇怪的行为。

特别是在我目前的小例子中,我有两个演员连接到一部电影,另一部电影没有连接到它。

此查询工作正常:

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行,这两行都是没人出演过的电影。

总而言之,我完全糊涂了。

1 个答案:

答案 0 :(得分: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