【问题标题】:Neo4j: result of Cypher example query puzzles meNeo4j:Cypher 示例查询的结果让我感到困惑
【发布时间】:2013-08-28 15:18:54
【问题描述】:

我正在 Neo4j 网站上试用 Cypher 示例,其中一个查询让我有点困惑。

共有三个电影节点,分别具有titles“黑客帝国”、“重载黑客帝国”和“黑客帝国革命”。 Matrix 节点有id“603”。

还有三个演员节点,分别是names“Keanu Reeves”、“Laurence Fishburne”和“Carrie-Anne Moss”。

所有演员和所有电影之间都有ACTS_IN关系。

这是一个应该返回所有其他电影的查询,这些电影中的演员在矩阵中演过:

START matrix=node:node_auto_index(id="603") 
MATCH (matrix)<-[:ACTS_IN]-(actor)-[:ACTS_IN]->(movie) 
RETURN actor.name + ' acts in ' + movie.title;

这是它的(正确)结果:

Keanu Reeves acts in The Matrix Reloaded
Keanu Reeves acts in The Matrix Revolutions
Laurence Fishburne acts in The Matrix Reloaded
Laurence Fishburne acts in The Matrix Revolutions
Carrie-Anne Moss acts in The Matrix Reloaded
Carrie-Anne Moss acts in The Matrix Revolutions

为什么矩阵节点本身没有包含在结果中?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    MATCH 子句指定路径。一条路径可能有循环,但绝不会包含两次相同的关系。在

    MATCH (matrix)<-[:ACTS_IN]-(actor)-[:ACTS_IN]->(movie) 
    

    这两个 ACTS_IN 关系总是不同的。因此矩阵总是不等于电影,因为没有一个演员与同一部电影有两个 ACTS_IN 关系。

    如果您将来自一个演员的多个关系添加到同一部电影中,您将获得具有 movie="The Matrix" 的匹配项。造成这种情况的原因可能是一个演员扮演多个角色。

    关于以下第一条评论的更新:

    在这种情况下,自然语言的查询是:矩阵的所有演员都出演了哪些电影?

    START matrix=node:node_auto_index(id="603") 
    MATCH matrix<-[:ACTED_IN]-actor
    WITH actor
    MATCH actor-[:ACTED_IN]->movie
    RETURN distinct movie.title;
    

    查询由两个部分组成,并用WITH 语句链接:

    1. 找到矩阵的参与者
    2. 查找这些演员的所有电影

    【讨论】:

    • 好吧,我想这是有道理的。但是,如果我确实希望将矩阵包含在结果中,查询会是什么样子?我的意思是不添加其他关系。
    • Update上面的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多