我在 LinkedIn 上得到了这个问题的答案,可以在这里找到:
https ://www.linkedin.com/groups/Does-anybody-know-similarities-differences-2623939.S.5939804856381382658
下面的答案是指这个查询:
MATCH (n:Asteroid) WHERE NOT n.name = 'Ceres' RETURN n LIMIT 25
答案如下:
关于否定的问题有两个答案:
(i) 对财产价值的否定
上面的评论中涵盖了这种情况,这基本上是正确的;我将重新使用提供的示例。在内部,使用标签索引检索具有标签“小行星”的所有节点。后面是一个“选择”运算符(来自关系代数),它用于仅选择那些不包含“名称”属性或“名称”属性不是“Ceres”的元组。然后是一个运算符称为“top”,将返回的结果限制为 25。如您所见,这与在关系数据库上执行 SQL 的方式没有什么不同。
(ii) 模式谓词的否定
这就是使用图形模式匹配的全部功能的地方。
假设我们有以下玩具查询,我想在其中找到我没有参加的所有活动:
MATCH (me:Person {name: “me”}), (e:Event) WHERE NOT ( (me) - [:ATTENDED] -> (e) ) RETURN e
我们的查询执行计划是一棵操作符树,每个操作符最多有 2 个子节点。
在树的根部,我们有一个“反半应用”运算符(相当于关系理论中的反半连接运算符)。左边的孩子是两组元组的笛卡尔积:(1) 使用标签和属性索引检索到的与 (me:Person {name: "me"}) 对应的一组节点,以及 (2) 一组对应于 (e:Event) 的节点,使用标签索引检索。我们注意到笛卡尔积将由“我”节点与数据库中的每个(e:Event) 的所有组合组成。
笛卡尔积一次发出一行,这一行 R 向上输送到 Anti Semi Apply 运算符。Anti Semi Apply 然后将 R 作为参数提供给其右侧分支,因此 R 显示为右侧的最终后代。R 向上传递给 Expand 运算符,该运算符返回所有 (me)-[:ATTENDED]-(some_e) 行(请注意,此处的“me”与 R 中的匹配)。立即,每个这样的行 S 都应用了一个选择操作,以便将“some_e”与 R 中的“e”匹配。因此,任何行 S 实际上都是“me”的“事件”参加。然后将 S 通过管道输送到 Anti Semi Apply。如果没有为 R 找到行 S,则返回 R 作为结果(因为这些将是“我”未参加的所有“事件”)
因此,查询中的否定不被视为简单的过滤器 - 它本质上会影响整个查询计划。
有关 Cypher 执行计划的更多详细信息,请访问
http://neo4j.com/docs/snapshot/execution-plans.html。