neo4j - 如何使用 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
请建议。
提前致谢!
解决方案
我在重新解释您的要求时采取了一些自由,所以这里有一些假设您必须确认这是有效的。
我假设您正在寻找每人至少一组 2 部电影,这些电影在 30 天内发布(否则您不会期望 Bob 的条目出现在您的结果中)。
我还假设您打算将电影 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
我们 UNWIND 比每个人的电影列表大小小 0 到 2 的范围,以便我们可以对列表进行索引(我们将成对评估电影日期,以便进行比较)。
对于在 30 天内发布的相邻对,我们 UNWIND 相邻电影的集合,使电影都在同一个变量下,然后我们返回排序后的 DISTINCT 值(因为同一部电影可能出现两次,在 30电影前后的日子。
推荐阅读
- python-2.7 - 如何在 Python 中输出
- javascript - 当前时间的日出日落时间图像与javascript
- python-3.x - Discord.py - on_message 使我的命令停止工作
- crash - Xcode 11 beta 在虚拟机中启动时崩溃
- amazon-web-services - AWS lambda - 如何根据查询参数是否存在来使用条件?
- ios - iOS SwiftUI:以编程方式弹出或关闭视图
- c# - 按行分组匹配
- keras - 在 Keras 中最大化 ELBO
- excel - Excel VBA 函数 - 检查字符串中的数字是否多于字母
- php - PHP:有效使用password_hash