使用neo4j cypher,哪些查询会有效地找到与凯文·培根没有连接的参与者?我们可以说,"不连接"意味着演员至少与凯文·培根(Kevin Bacon(至少连接到凯文·培根(Kevin Bacon(。
这是我尝试的:
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天。我该如何更有效地执行此操作?
(a(您的第一个MATCH
找到与凯文·培根(Kevin Bacon(在10个啤酒花内连接的每个演员。本条款的结果是行的数字(m((如果演员连接到凯文的7种不同方式,则该演员以7行为代表(。
(b(您的第二个MATCH
找到了在电影中行事的每个演员。如果此MATCH
子句是独立的,那么它需要n行,其中n是ACTS_IN
关系的数量(如果演员在9个电影中进行了演员,则该演员将以9行为代表(。但是,由于该子句是在另一个MATCH
子句之后出现的,因此您将获得笛卡尔产品,而实际的结果数为m*n。
因此,您的查询需要大量的存储空间,并执行(潜在的(冗余比较,并且您的结果可能包含重复的名称。为了减少存储要求和参与者比较的数量(在您的WHERE
子句中(:您应该导致A和B的结果具有不同的演员,并消除了笛卡尔产品。
以下查询应该这样做。它首先收集了每个不同演员的单个列表(一行(,该列表与凯文·培根(Kevin Bacon(在10个啤酒花内连接(如hs
(,然后找到所有(不同的(参与者,而不是该集合中的所有(不同(:
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;
(此查询也没有费心测试演员是否在电影中表现出来也节省了更多时间。(
性能仍然取决于在第一个MATCH
中执行可变长度路径搜索所需的时间。