如何找到与给定节点共享至少 n 个节点的所有节点

How do I find all nodes which shares at least n nodes with a given node

标题有点乱,但我有一张图片准确描述了我要实现的目标。

例如,我在 neo4j 的沙箱中工作,使用 Movies-dataset。

任务:找到与汤姆·汉克斯合作电影超过两次(3 次或更多次)的所有演员。

这是查询(和结果),其中显示了所有与他合作过的演员,以及他们参演的电影。

MATCH (p1:Person {name: "Tom Hanks"})-->(m:Movie)<--(p2:Person) 
RETURN m, p2

为了节省您一些时间,唯一至少与 Tom 合作过三次(3 次)的人是右边的 Meg Ryan。


因此,作为这种查询语言的新生,我的直接想法是尝试以下 Cypher-query:

MATCH (p1:Person {name: "Tom Hanks"})-->(m:Movie)<--(p2:Person)
    WHERE count(m) > 2
RETURN p2, m

这给出了一个错误,告诉我我不能把 count-函数放在那里。


我也尝试过使用 WITH-关键字:

MATCH (p1:Person {name: "Tom Hanks"})-->(m:Movie)<--(p2:Person)
    WITH p1, m, p2, count(m) AS common_movie_count
    WHERE common_movie_count > 2
RETURN DISTINCT p2, m

...但这对我没有多大帮助,尽管它确实 运行,但它给了我一个空输出(意味着没有匹配项)。


出于某种原因,我被允许获取相关演员的姓名(和计数),只要我接受以 table 格式获取所有演员。

MATCH (p1:Person {name: "Tom Hanks"})-->(m:Movie)<--(p2:Person)
RETURN DISTINCT p2.name AS name, count(m) as common_movie_count
ORDER BY common_movie_count DESC

此查询返回以下 table(或从这三个结果开始): |姓名 | common_movie_count | | -------------- | ------------------ | | “梅格瑞恩” | 3 | | “朗·霍华德” | 2 | | “加里西尼斯” | 2 |

我想要节点,而不仅仅是名称。另外:我只想要相关的节点 (count > 3),因为在我打算应用它的数据集中,会有太多 non-relevant 节点无法将它应用到所有节点。


您对我的问题有什么想法或简单的解决方案吗?对我来说,问题似乎很简单,我不能成为第一个 运行 解决它的人,但我似乎无法 google 找到好的解决方案。

你在这里非常接近:

MATCH (p1:Person {name: "Tom Hanks"})-->(m:Movie)<--(p2:Person)
    WITH p1, m, p2, count(m) AS common_movie_count
    WHERE common_movie_count > 2
RETURN DISTINCT p2, m

除了 WITH 语句中的 m 使得 common_movie_count 总是 return 0

如果你这样做:

MATCH (p1:Person {name: "Tom Hanks"})-->(m:Movie)<--(p2:Person)
    WITH p1, p2, COLLECT( DISTINCT m) AS common_movies
    WHERE SIZE(common_movies) > 2
UNWIND common_movies AS m
RETURN p2, m

你会得到预期的结果