[我正在使用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天之内发行的两部以上电影和电影信息的人。
我想为每个人做的事,遍历与他连接的电影节点的发布日期,并在结果表中保留满足条件的电影节点。
这是我获取示例数据的查询:
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
请提出建议。
提前感谢!
我在重新解释您的要求时有一些自由,因此这里有一些假设,您必须确认这一点才有效。
我假设您正在寻找每人至少要在彼此之间30天内发行的2部电影中的一组(否则,您不会期望鲍勃的作品出现在您的结果中。
我还假设您打算将电影X的publish_date设置为2016-03-09
,而不是2018-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
我们解包的范围比每人电影列表的大小小0到2,因此我们可以对列表进行索引(我们将成对评估电影日期,以便进行比较)。
对于彼此之间在30天内发布的相邻对,我们取消对相邻电影的收藏,以使这些电影都位于同一变量下,然后我们返回已排序的DISTINCT值(因为同一部电影可能出现两次,因此在电影前后的30天内。