我一直试图了解Cypher如何与图数据库理论相对应。特别是我记得Peter T.Wood"查询图表数据库的语言。 (http://users.dcc.uchile.cl/~pbarcelo/wood.pdf)。我认为它对应于带有附加操作(如聚合)的连接常规路径查询,但我无法在任何地方找到有关此信息。
两个问题:
背景:我开始在Cypher中使用Neo4j作为我正在研究的论文。我之所以这样做,是因为这两者似乎都很成熟且得到了很好但是,我想从查询回答的实现中抽象出更为通用的图形查询形式,但我不知道Cypher如何与此对应。
答案 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