Neo4j 有效地找到与凯文·培根无关的演员
使用neo4j cypher,什么查询可以有效地查找与Kevin Bacon无关的演员?我们可以说“未连接”意味着演员与凯文·培根的连接至少不超过10跳 以下是我的尝试:Neo4j 有效地找到与凯文·培根无关的演员,neo4j,cypher,bacon-number,Neo4j,Cypher,Bacon Number,使用neo4j cypher,什么查询可以有效地查找与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 MATCH(kb:Actor{name:'kevi
MATCH (kb:Actor {name:'Kevin Bacon'})-[*1..10]-(h:Actor) with h
MATCH (a)-[:ACTS_IN]->(m)
WHERE a <> h
RETURN DISTINCT h.name
MATCH(kb:Actor{name:'kevinbacon'})-[*1..10](h:Actor)与h匹配
匹配(a)-[:在]->(m)中执行
a在哪里
返回不同的h.name
但是,此查询将运行3天。如何才能更有效地执行此操作?(A)您的第一次匹配将查找在10跳内连接到Kevin Bacon的每个演员。这个子句的结果是行数(M)(如果一个参与者以7种不同的方式连接到Kevin,那么该参与者将在7行中表示)
(B) 你的第二个匹配
会找到在电影中扮演过的每个演员。如果这个MATCH
子句是独立的,那么它将需要N行,其中N是关系中动作的数量(如果一个演员在9部电影中表演,那么该演员将在9行中表现)。但是,由于该子句紧跟在另一个MATCH
子句之后,因此会得到一个笛卡尔积,结果行的实际数量是M*N
因此,您的查询需要大量存储并执行(可能大量)冗余比较,并且您的结果可能包含重复的名称。为了减少存储需求和参与者比较的数量(在WHERE
子句中):您应该使A和B的结果具有不同的参与者,并消除笛卡尔积
下面的查询应该可以做到这一点。它首先收集在10个跃点内连接到Kevin Bacon(ashs
)的每个不同参与者的单个列表(在一行中),然后查找不在该集合中的所有(不同)参与者:
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;
(该查询还省去了测试演员是否在电影中表演的麻烦,从而节省了更多的时间。)
性能仍然取决于在第一个<代码>匹配< /代码>中执行可变长度路径搜索所需的时间,但是,
@ HuffLeaveWalk如果您需要在可变长度路径搜索上更好的性能,您可能需要考虑路径扩展器程序,具体地是“代码> Apoc .Posith.Sub字形()/<代码>