Cypher - 如何处理否定?

时间:2014-11-17 12:11:18

标签: database graph cypher negation

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

两个问题:

  1. 我能找到有关Cypher背后理论的信息吗?特别是联合查询旋转。
  2. Cypher如何处理否定?例如是安全否定'
  3. 背景:我开始在Cypher中使用Neo4j作为我正在研究的论文。我之所以这样做,是因为这两者似乎都很成熟且得到了很好但是,我想从查询回答的实现中抽象出更为通用的图形查询形式,但我不知道Cypher如何与此对应。

1 个答案:

答案 0 :(得分:1)

我在LinkedIn上找到了这个问题的答案,可以在这里找到: https://www.linkedin.com/groups/Does-anybody-know-similarities-differences-2623939.S.5939804856381382658

以下答案涉及此查询:

  

MATCH(n:Asteroid)WHERE NOT n.name =' Ceres'返回n LIMIT 25

答案如下:

  

关于否定的问题有两个答案:

     

(i)否定财产价值

     

以上评论中涵盖的情况基本上就是这样   正确;我将重新使用提供的示例。在内部,所有节点   有标签'小行星'使用标签索引检索。这个   后跟一个“选择”运算符(来自关系代数),其中   用于仅选择那些包含no' name'   财产或名称'财产不是Ceres'。那就是   后跟一个名为“top”的运算符,限制返回的结果   25.正如您所看到的,这与SQL在关系数据库上的执行方式没有区别。

     

(ii)否定模式谓词

     

这是利用图形模式匹配的全部功能的地方。

     

假设我们有以下玩具查询,其中我想找到所有   我没有参加的活动:

     

MATCH(me:Person {name:“me”}),(e:Event)WHERE NOT((me) -   [:ATTENDED] - > (e))返回e

     

我们的查询执行计划是一个运算符树,每个运算符都有   给2个孩子。

     

在树的根部,我们有一个' Anti Semi Apply'操作员(相当于   关系理论中的反半连接算子)。左手   child是两组元组的笛卡尔积:(1)一组节点   对应于(me:Person {name:" me"})使用标签检索   和属性索引,以及(2)对应于(e:Event)的一组节点,   使用标签索引检索。我们注意到了笛卡尔积   将包括" me"的所有组合。 每个的节点(e:事件)   在数据库中。

     

笛卡尔积一次发出一行,此行R为   通过管道传输到Anti Semi Apply操作员。反半适用   然后将R作为参数输入到其右侧分支,以便R   在右手边看起来是最终的后代。 R通过了   向上扩展到一个Expand运算符,返回all   (我) - [:ATTENDED] - (some_e)行(注意" me"在这里匹配   一个在R)。立即,每个这样的行S具有选择操作   适用于它,以匹配" some_e"到了" e"在R.所以,任何   行S实际上是一个"事件"出席了#34;我"。 S然后通过管道输送到Anti   半适用。如果找到R的 no 行S,则返回R作为结果   (因为这些将是所有“事件”而不是出席了" me")

     

因此,在查询中使用否定不被视为简单的过滤器 -   它本质上影响整个查询计划。

     

有关Cypher执行计划的更多详细信息,请访问:   http://neo4j.com/docs/snapshot/execution-plans.html