(A) 你的第一个MATCH
找到在 10 跳内连接到 Kevin Bacon 的每个演员。该子句的结果是行数 (M)(如果一个演员以 7 种不同的方式连接到 Kevin,则该演员以 7 行表示)。
(B) 你的第二个MATCH
找到每一个在电影中表演过的演员。如果这个MATCH
子句是独立的,那么它将需要 N 行,其中 N 是ACTS_IN
关系的数量(如果一个演员出演了 9 部电影,那么该演员将被表示为 9 行)。但是,由于该子句紧跟在另一个MATCH
子句之后,因此您得到一个笛卡尔积,结果行的实际数量为 M*N。
因此,您的查询需要大量存储空间并执行(可能很大)数量的冗余比较,并且您的结果可能包含重复的名称。为了减少存储要求和参与者比较的数量(在您的WHERE
子句中):您应该使 A 和 B 的结果具有不同的参与者,并消除笛卡尔积。
以下查询应该这样做。它首先收集在 10 跳内连接到 Kevin Bacon (as ) 的每个不同actor的单个列表(在一行中hs
),然后找到不在该集合中的所有(不同)actor:
MATCH (kb:Actor {name:'Kevin Bacon'})-[*..10]-(h:Actor)
WITH COLLECT(DISTINCT h) AS hs
MATCH (a:Actor)
WHERE NOT a IN hs
RETURN a.name;
(此查询还无需费心测试演员是否曾出演过电影,从而节省了更多时间。)
然而,性能仍然取决于在 first 中执行可变长度路径搜索需要多长时间MATCH
。