六度凯文培根

时间:2014-09-09 05:25:46

标签: neo4j cypher

还有其他一些关于凯文培根学位的帖子,这些帖子的答案与我自己提出的答案类似。但显而易见的是,我从我得到的结果以及我提高查询性能的方式出现了错误,因为我增加了与Kevin Bacon的分离程度。

我的查询是查找所有具有一度凯文培根的演员:

match p=(:Person {name:"Kevin Bacon"})-[:ACTED_IN*..2]-(:Person) return p

如果我理解正确,那相当于:

match p=(:Person {name:"Kevin Bacon"})-[:ACTED_IN]->()<-[:ACTED_IN]-(:Person) return p

实际上,这两个查询都返回相同数量的行。但是如果我修改查询的第一个版本并将路径长度增加到6(即Kevin Bacon的三度),则返回978行。数据库中只有133个Person节点,所以我希望它最多返回133行。

我的猜测是,它返回了一些Person节点的多个路径。我怎么告诉它只返回每条路径的最短路径?基本上,我想执行单个深度优先或广度优先搜索。我认为它可能涉及WITH,但我还没有真正理解如何使用它。

1 个答案:

答案 0 :(得分:0)

这两个语句不相同:[:ACTED_IN*..2]遵循1到2个关系,而第二个语句强制两个关系。 (它们返回相同的内容,因为没有两个Person节点与数据集中的:ACTED_IN直接相关。

你是对的,你将拥有到同一个终端节点的多条路径。 Cypher具有shortestPath功能,请参阅http://docs.neo4j.org/chunked/stable/query-match.html#_shortest_path

如果你想要更精细的控制,例如深度优先与广度优先 - 您需要使用例如Neo4j的traversal API