如何找到与给定节点共享至少 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
你会得到预期的结果
标题有点乱,但我有一张图片准确描述了我要实现的目标。
例如,我在 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
你会得到预期的结果