首页 > 解决方案 > 如何使用 Cypher 在 Neo4j 中遍历属性以比较特定类型的节点

问题描述

我正在使用 Neo4j 并想知道如何使用 Cypher 循环连接一个节点的其他节点的属性以进行比较并过滤满足条件的节点。

这是示例数据:

Person Movie Publish_Date
Tina   A     2016-01-01
Tina   B     2016-01-01
Tina   C     2016-03-05
Tina   D     2016-03-06
Tina   X     2018-03-09  
Bob    E     2016-08-01
Bob    F     2016-08-08
Ana    G     2016-04-05
Ana    H     2016-08-05
Ana    I     2016-12-05

这是我想要的:

Person Movie Publish_Date
Tina   A     2016-01-01
Tina   B     2016-01-01
Tina   C     2016-03-05
Tina   D     2016-03-06
Tina   X     2018-03-09   
Bob    E     2016-08-01
Bob    F     2016-08-08

我想返回参与 30 天内发布的 2 部电影以上的人和电影信息。

我想对每个人做的是,循环遍历与他连接的电影节点的发布日期,并在结果表中保留满足条件的节点。

这是我获取示例数据的查询:

MATCH (p:Person)-[r1:ACTED_IN]->(m:Movie)
WITH p, m 
ORDER BY p.Name DESC, n.Publish_Date
RETURN p.name AS Person, m.title AS Movie, m.publish_date AS Publish_Date

请建议。

提前致谢!

标签: neo4jcyphergraph-databases

解决方案


我在重新解释您的要求时采取了一些自由,所以这里有一些假设您必须确认这是有效的。

我假设您正在寻找每人至少一组 2 部电影,这些电影在 30 天内发布(否则您不会期望 Bob 的条目出现在您的结果中)。

我还假设您打算将电影 X 的 publish_date 设置为2016-03-092018-03-09否则它不应该出现在预期结果中。

有了这些假设,这个查询应该可以解决问题:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WITH p, m 
ORDER BY m.publish_date
WITH p, collect(m) as movies, collect(m.publish_date) as dates
UNWIND range(0, size(movies)-2) as index
WITH p, movies, dates, index 
WHERE duration.inDays(dates[index], dates[index+1]).days <= 30
UNWIND [movies[index], movies[index+1]] as movieInRange
RETURN DISTINCT p, movieInRange
ORDER BY p.name DESC

我们 UNWIND 比每个人的电影列表大小小 0 到 2 的范围,以便我们可以对列表进行索引(我们将成对评估电影日期,以便进行比较)。

对于在 30 天内发布的相邻对,我们 UNWIND 相邻电影的集合,使电影都在同一个变量下,然后我们返回排序后的 DISTINCT 值(因为同一部电影可能出现两次,在 30电影前后的日子。


推荐阅读