【问题标题】:What does a query with 2 MATCH clauses do and how is it different from a query with a single MATCH clause that has 2 distinct paths?具有 2 个 MATCH 子句的查询有什么作用,它与具有 2 个不同路径的单个 MATCH 子句的查询有何不同?
【发布时间】:2016-03-11 09:24:10
【问题描述】:

我不明白 Neo4j 文档的 this 页面中的两个查询是如何工作的。

首先,这是图表:

这是我不明白的第一个查询:

MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)
MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName

这给出了“大卫”、“亚当”的结果。

我原本预计结果是“David”,只是因为第一个 MATCH 子句将给出“Pernilla”节点,而第二个 MATCH 子句将使用该节点给出“David”节点。

有人可以告诉我上述查询的实际工作原理吗?

我不明白的第二个查询是:

MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend),(friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName 

由于文档(到目前为止)没有讨论具有两种不同模式的 MATCH 子句如何工作,我真的认为上面的查询也等同于第一个查询。我可以了解一下此查询的工作原理,以便了解它与第一个查询的不同之处吗?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    当您在 Cypher 中使用 MATCHOPTIONAL MATCH 子句时,您可以保证,对于该路径的任何给定匹配,都不会使用任何关系两次。因此,如果你这样做了:

    MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)-[r2:FRIEND]-(friend_of_a_friend)
    

    或者:

    MATCH
      (user:User { name: 'Adam' })-[r1:FRIEND]-(friend),
      (friend)-[r2:FRIEND]-(friend_of_a_friend)
    

    由于只有一个 MATCH 指定你永远不会回到亚当。

    有关差异的更详细细分,请参阅以下问题:

    What does a comma in a Cypher query do?

    【讨论】:

    • 感谢您的回答。现在我明白了第二个查询是如何工作的。但是我仍然不明白“亚当”是如何成为第一个查询结果的一部分的,因为没有人是“亚当”的朋友。您能否详细说明在这种情况下如何进行匹配?
    • 您没有为您的MATCH 指定方向,因此它遵循从 Pernilla 回到 Adam 的关系
    【解决方案2】:

    解释一下@Brian Underwood 提到的内容。

    如果你记得有三种关系语法

    1. -[:r1]- 未定义方向
    2. -[:r2]->节点外方向

    比赛

    如果您将单个 MATCH 用于带或不带逗号的模式,则不会重复该模式。

    你可能会问,什么时候会重复一个模式。好吧,那就是当你使用未定义的方向时。既然你没有告诉它往哪个方向走,它就会往两个方向走。

    即从亚当到大卫;并返回;大卫对亚当。 因此,单场比赛将转到第一个比赛,即 Adam 到 David。

    #1
    MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)
    MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend)
    RETURN friend_of_a_friend.name AS fofName
    

    将返回 David 和 Adam,因为它使用了未定义的方向。

    #2
    MATCH (user:User { name: 'Adam' })-[r1:FRIEND]->(friend)
    MATCH (friend)-[r2:FRIEND]->(friend_of_a_friend)
    RETURN friend_of_a_friend.name AS fofName
    

    但是这个只会返回大卫,那是因为你使用的是outward direction,不能重复。

    Cypher 查询 #2 也与以下查询相同

    MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend),(friend)-[r2:FRIEND]-(friend_of_a_friend)
    RETURN friend_of_a_friend.name AS fofName 
    

    尽管它使用了未定义的方向,它在两个方向上都遍历,但我们只使用一个 MATCH 子句。

    希望我回答了你的问题。

    【讨论】:

    • 一件不是很多人知道的事情,如果您不想过滤关系,则不需要括号。喜欢()--()()-->()()<--()
    • @Brain Underwood 明白了!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2020-01-24
    • 1970-01-01
    • 2021-07-25
    • 2013-09-29
    相关资源
    最近更新 更多