1

使用 neo4j 密码,什么查询可以有效地找到与 Kevin Bacon 无关的演员?为简单起见,我们可以说“未连接”意味着演员与 Kevin Bacon 的连接距离至少为 10 跳。

这是我尝试过的:

MATCH (kb:Actor {name:'Kevin Bacon'})-[*1..10]-(h:Actor) with h 
MATCH (a)-[:ACTS_IN]->(m) 
WHERE a <> h 
RETURN DISTINCT h.name

但是,此查询会运行 3 天。我怎样才能更有效地做到这一点?

4

1 回答 1

2

(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

于 2017-04-27T22:00:08.747 回答