还有其他一些关于凯文培根学位的帖子,这些帖子的答案与我自己提出的答案类似。但显而易见的是,我从我得到的结果以及我提高查询性能的方式出现了错误,因为我增加了与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
,但我还没有真正理解如何使用它。
答案 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。