编写Neo4j查询:获取Aviv既看又喜欢且被1-3级好友关注的影片
完成你的Neo4j Cypher查询需求
嗨,我来帮你把这个Cypher查询补全并优化,刚好能满足你提出的两个条件。先直接给你完整的查询代码,再一步步解释每部分的作用:
MATCH (aviv:Person {name:'Aviv'})-[:friend*1..3]->(f:Person) WHERE f <> aviv // 排除Aviv自己,避免循环统计 WITH aviv, collect(DISTINCT f) AS friends // 去重好友,确保统计准确 // 筛选Aviv同时标记为watched和liked的电影(满足条件1) MATCH (aviv)-[:watched]->(m:Movie), (aviv)-[:liked]->(m) // 统计这些电影被多少1-3级好友执行过watched或liked操作 MATCH (f)-[:watched|liked]->(m) WHERE f IN friends WITH m, count(DISTINCT f) AS friendInteractionCount // 筛选出至少有两位好友操作过的电影(满足条件2) WHERE friendInteractionCount >= 2 RETURN m.title, friendInteractionCount // 可根据需求调整返回字段,比如返回整个m节点
代码分步解释
获取Aviv的1-3级好友
我们先精准匹配Person节点中名为Aviv的用户,再找到他的1-3级好友。用f <> aviv避免把Aviv自己纳入统计,同时collect(DISTINCT f)对好友去重——因为同一个好友可能通过不同的好友链被多次匹配,去重后能保证后续统计的准确性。筛选Aviv同时标记的电影
通过同时匹配watched和liked两条关系,确保只保留Aviv既看过又喜欢的电影,完美满足你的第一个条件。统计好友的操作次数
匹配好友与目标电影之间的watched或liked关系,用count(DISTINCT f)统计不同好友的数量,避免同一个好友多次操作被重复计数。最终筛选并返回结果
用WHERE friendInteractionCount >= 2筛选出符合第二个条件的电影,最后返回电影标题和对应的好友操作数(你也可以直接返回m获取整个电影节点的所有属性)。
补充说明:你的数据库结构为:
Person节点:包含name属性,节点间存在friend(好友)关系Movie节点:包含影片相关属性(如title),与Person节点间存在watched(观看)或liked(喜欢)关系
内容的提问来源于stack exchange,提问作者YUVAL MIZRAHI
相关产品推荐
相关产品推荐

