代码之家  ›  专栏  ›  技术社区  ›  Marek Grzenkowicz

为什么一个Neo4j关系在Cypher查询结果中显示两次?

  •  0
  • Marek Grzenkowicz  · 技术社区  · 6 年前

    CREATE 
      (`0` :Car {value:"Ford"})
    , (`1` :Car {value:"Subaru"})
    , (`0`)-[:`DOCUMENT` {value:"DOC-1"}]->(`1`);
    

    以下查询 MATCH (n1:Car)-[r:DOCUMENT]-(n2:Car) RETURN * 返回:

    ╒══════════════════╤══════════════════╤═════════════════╕
    │"n1"              │"n2"              │"r"              │
    ╞══════════════════╪══════════════════╪═════════════════╡
    │{"value":"Subaru"}│{"value":"Ford"}  │{"value":"DOC-1"}│
    ├──────────────────┼──────────────────┼─────────────────┤
    │{"value":"Ford"}  │{"value":"Subaru"}│{"value":"DOC-1"}│
    └──────────────────┴──────────────────┴─────────────────┘
    

    Ford->Subaru 关系,为什么是两种关系?
    如何解释反转的(第1行;未在 CREATE

    注: Convert multiple relationships between 2 nodes to a single one with weight 早些时候我问过。我解决了我的问题,但我不相信我的答案是最好的解决方案。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Marek Grzenkowicz    6 年前

    这里的MATCH语句没有指定方向,因此有两个可能的路径与模式匹配(请记住路径中节点的顺序很重要,并且可以区分路径),因此您有两个答案。

    MATCH (n1:Car)-[r:DOCUMENT]->(n2:Car) 
    RETURN *
    

    至于省略方向时为什么会返回两条路径的问题,请记住路径是顺序敏感的:具有相同元素但具有不同元素顺序的两条路径是不同的路径。

    要帮助理解这一点,请考虑以下两个查询:

    # Query 1
    MATCH (n1:Car)-[r:DOCUMENT]-(n2:Car) 
    WHERE n1.value = 'Ford'
    RETURN *
    
    ╒══════════════════╤══════════════════╤═════════════════╕
    │"n1"              │"n2"              │"r"              │
    ╞══════════════════╪══════════════════╪═════════════════╡
    │{"value":"Ford"}  │{"value":"Subaru"}│{"value":"DOC-1"}│
    └──────────────────┴──────────────────┴─────────────────┘
    
    # Query 2
    MATCH (n1:Car)-[r:DOCUMENT]-(n2:Car) 
    WHERE n1.value = 'Subaru'
    RETURN *
    
    ╒══════════════════╤══════════════════╤═════════════════╕
    │"n1"              │"n2"              │"r"              │
    ╞══════════════════╪══════════════════╪═════════════════╡
    │{"value":"Subaru"}│{"value":"Ford"}  │{"value":"DOC-1"}│
    └──────────────────┴──────────────────┴─────────────────┘
    

    在概念上(在没有索引的情况下,计划者也会使用),要得到上面的每个结果,您可以从描述中的完全匹配结果开始,然后筛选到唯一符合给定条件的结果。

    如果原始查询只返回一行而不是两行,则上面的结果将与原始的无方向匹配查询不一致。


    OP提供的附加信息

    piece of documentation 要通过设计确认:

    MATCH (a)-[r]-(b)
    WHERE id(r)= 0
    RETURN a,b

    这将返回两个连接的节点,一次作为开始节点,一次作为结束节点。