我有两个查询 - 一个限制在MATCH上,另一个在WHERE上执行。它们都基于北风数据集。
MATCH (n:Employee)-[:SOLD]->(:Order{shipName:"North/South"}) RETURN (n)
MATCH (n:Employee) WHERE (n)-[:SOLD]->(:Order{shipName:"North/South"}) RETURN n
最后,我有第三个查询,其中包含:
MATCH (n:Employee)-[:SOLD]->(o:Order{shipName:"North/South"}) WHERE (n)-[:SOLD]->(:Order{shipName:"North/South"}) RETURN n
问题是他们1& 2不返回相同的结果?同样根据http://neo4j.com/blog/introducing-new-cypher-query-optimizer/将匹配移动到WHERE子句不会改变结果吗?
我误解了什么吗?
答案 0 :(得分:3)
我希望你的困惑是因为MATCH()是关于模式的,WHERE是关于单个逻辑是/否。另外,我认为珍妮特在系统中有两个命令而安德鲁有一个命令会影响MATCH()在没有使用WHERE时返回的结果。
模型1返回"员工"的连接。和"订单"标记的节点,由于珍妮特有两个订单,她报告了两次,而安德鲁报告了一次。
模型2将被表述为"该员工是否在系统中有任何订单?"这是因为WHERE短语为每个员工节点返回单个true / false。这就是为什么你曾经两次看到安德鲁和珍妮特而不是珍妮特的原因。
模型3是模型1和模型2的组合,它返回一个" union"中两组结果。