Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 有效地找到与凯文·培根无关的演员_Neo4j_Cypher_Bacon Number - Fatal编程技术网

Neo4j 有效地找到与凯文·培根无关的演员

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

使用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:'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(as
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;
(该查询还省去了测试演员是否在电影中表演的麻烦,从而节省了更多的时间。)


性能仍然取决于在第一个<代码>匹配< /代码>中执行可变长度路径搜索所需的时间,但是,

@ HuffLeaveWalk如果您需要在可变长度路径搜索上更好的性能,您可能需要考虑路径扩展器程序,具体地是“代码> Apoc .Posith.Sub字形()/<代码>