【问题标题】:Neo4j's online exercises:Movie Database - Finding 'friends' and 'paths' questionNeo4j的在线练习:电影数据库-寻找“朋友”和“路径”问题
【发布时间】:2020-12-12 02:16:52
【问题描述】:

所以我正在关注neo4j 上关于电影数据库的本指南/练习,我也在其中使用相同的数据(link here)。 现在我的问题是试图找到一个特定人的合作演员。例如汤姆汉克斯。 co coactors是所有与汤姆汉克斯的合作演员一起演过电影但没有与汉克斯演过电影的演员 现在从链接中查看练习 5.4 的解决方案,我的代码应该看起来像这样吧? 我运行代码,但没有输出/记录

MATCH (a:Actor)-[:ACTED_IN*2]->(a2:Actor)    
WHERE a.name = "Tom Hanks"
AND NOT((a)-[:ACTED_IN]-(a2))
RETURN a2.name AS `co-co-actors`

或者像这样?

MATCH (a:Actor)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(a2:Actor), 
    (a2:Actor)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(a3:Actor)
WHERE a.name = 'Tom Hanks'
RETURN a3.name AS `co-co-actors`

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    你已经接近了! 首先,你确实可以找到汤姆汉克斯的合作演员:

    (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coActor:Person)
    

    那么,你要找汤姆汉克斯的合作演员:

    (coCoActor:Person)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coActor)
    

    但您要确保这些“合作演员”从未与汤姆汉克斯一起出演过任何电影:

    WHERE NOT (coCoActor)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(tom)
    

    整个查询就变成了:

    MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coActor:Person),
          (coCoActor:Person)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coActor)
    WHERE NOT (coCoActor)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(tom)
    RETURN coCoActor.name AS `co-co-actor`
    

    例如,杰克尼科尔森似乎是汤姆汉克斯的联合演员。 让我们检查一下:

    MATCH (tom:Person {name: "Tom Hanks"}), (jack:Person {name: "Jack Nicholson"})
    RETURN shortestPath((tom)-[*]-(jack))
    

    好像是这样,万岁!

    【讨论】:

    • 这是一个很棒的解释。非常感谢!!!因此,如果汤姆·汉克斯的几个共同演员与汤姆·汉克斯的共同演员一起出现在多部电影中,那么例如杰克·尼古拉斯是汤姆·汉克斯的共同演员,他与汤姆·汉克斯的共同演员出演过不止一部电影。那么我们可以说他们在 Tom 和 Jack 之间有多个路径。我将如何根据它们两者之间的路径数对列表进行排序?上帝,我在这里困惑了几次。但这有意义吗?
    • 这是我按降序编写的代码。 `MATCH (tom:Person)-[r1:ACTED_IN]->(m:Movie)(m2:Movie)
    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多