3

我一直在尝试了解 Cypher 如何对应于图形数据库理论。特别是我想到了“Peter T.Wood 的图形数据库查询语言”(http://users.dcc.uchile.cl/~pbarcelo/wood.pdf)。我想它对应于具有附加操作(例如聚合)的连接常规路径查询,但我无法在任何地方找到有关此的信息。

两个问题:

  1. 有没有什么地方可以找到有关 Cypher 背后理论的信息?特别是结合查询旋转。
  2. Cypher 如何处理否定?例如,它是“安全否定”吗?

背景:我开始将 Neo4j 与 Cypher 一起用于我正在处理的论文。我这样做是因为这两者似乎都已建立并得到很好的支持。但是,我想将查询回答的实现抽象为更通用的图形查询形式,但我不知道 Cypher 如何与此相对应。

4

1 回答 1

1

我在 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

于 2015-05-05T20:10:29.613 回答