匹配和Where子句的明显区别

时间:2016-04-13 14:34:11

标签: neo4j cypher

我有两个查询 - 一个限制在MATCH上,另一个在WHERE上执行。它们都基于北风数据集。

  1. MATCH (n:Employee)-[:SOLD]->(:Order{shipName:"North/South"}) RETURN (n)

    • 返回3个节点Andrew,Janet和Janet(注意珍妮特的副本)
  2. MATCH (n:Employee) WHERE (n)-[:SOLD]->(:Order{shipName:"North/South"}) RETURN n

    • 返回2结果Andrew和Janet
  3. 最后,我有第三个查询,其中包含:

    1. MATCH (n:Employee)-[:SOLD]->(o:Order{shipName:"North/South"}) WHERE (n)-[:SOLD]->(:Order{shipName:"North/South"}) RETURN n

      • 这也返回3个节点,对查询顺序感到惊讶 - 匹配是在where?
      • 之后应用的
    2. 问题是他们1& 2不返回相同的结果?同样根据http://neo4j.com/blog/introducing-new-cypher-query-optimizer/将匹配移动到WHERE子句不会改变结果吗?

      我误解了什么吗?

1 个答案:

答案 0 :(得分:3)

我希望你的困惑是因为MATCH()是关于模式的,WHERE是关于单个逻辑是/否。另外,我认为珍妮特在系统中有两个命令而安德鲁有一个命令会影响MATCH()在没有使用WHERE时返回的结果。

模型1返回"员工"的连接。和"订单"标记的节点,由于珍妮特有两个订单,她报告了两次,而安德鲁报告了一次。

模型2将被表述为"该员工是否在系统中有任何订单?"这是因为WHERE短语为每个员工节点返回单个true / false。这就是为什么你曾经两次看到安德鲁和珍妮特而不是珍妮特的原因。

模型3是模型1和模型2的组合,它返回一个" union"中两组结果。