美文网首页
Cypher 概述与基本语法

Cypher 概述与基本语法

作者: 数据的艺术2 | 来源:发表于2020-06-27 19:29 被阅读0次

    1,Cypher概述

    Cypher是一种声明式图数据库查询语言,它具有丰富的表现力,能高效地查询和更新图数据。

    Cypher借鉴了SQL语言的结构——查询可由各种各样的语句组合。

    例如,下面是查找名为'John'的人和他的朋友的朋友。

    MATCH (john {name: 'John'})-[:friend]->()-[:friend]->(fof)
    RETURN john.name, fof.name
    

    ​ 接下来在语句中添加一些过滤。给定一个用户名列表,找到名字在列表中的所有节点。匹配他们的朋友,仅返回他们朋友的name属性以'S'开头的用户。

    MATCH (user)-[:friend]->(follower)
    WHERE user.name IN ['Joe', 'John', 'Sara', 'Maria', 'Steve'] AND follower.name =~ 'S.*'
    RETURN user.name, follower.name
    

    模式(Patterns)

    ​ Neo4j图由节点和关系构成。节点可能还有标签和属性,关系可能还有类型和属性。节点和关系都是简单的低层次的构建块。单个节点或者关系只能编码很少的信息,但模式可以将很多节点和关系编码为任意复杂的想法。

    ​ Cypher查询语言很依赖于模式。只包含一个关系的简单模式连接了一对节点。例如,一个人LIVES_IN在某个城市或者某个城市PART_OF一个国家。使用了多个关系的复杂模式能够表达任意复杂的概念,可以支持各种有趣的使用场景。例如,下面的Cypher代码将两个简单的模式连接在一起:

    (:Person)-[:LIVES_IN]->(:City)-[:PART_OF]->(:Country)  
    

    ​ 像关系数据库中的SQL一样,Cypher是一种文本的声明式查询语言。它使用ASCII art的形式来表达基于图的模式。采用类似SQL的语句,如MATCH,WHERE和DELETE,来组合这些模式以表达所预期的操作。


    节点语法

    ​ Cypher采用一对圆括号来表示节点。如:(), (foo)。下面是一些常见的节点表示法:

    ()
    (matrix)
    (:Movie)
    (matrix:Movie)
    (matrix:Movie {title: "The Matrix"})
    (matrix:Movie {title: "The Matrix", released: 1997})
    
    match (matrix:Movie {title: "The Matrix"}) return matrix
    
    节点.png

    关系语法

    ​ Cypher使用一对短横线(即“--”)表示:一个无方向关系。有方向的关系在其中一端加上一个箭头(即“<--”或“-->”)。方括号表达式[…]可用于添加关系信息。里面可以包含变量、属性和或者类型信息。关系的常见表达方式如下:

    --
    -->
    -[role]->
    -[:ACTED_IN]->
    -[role:ACTED_IN]->
    -[role:ACTED_IN {roles: ["Neo"]}]->
    
    # 找出"Hugo Weaving"参演的电影
    match (n:Person{name:"Hugo Weaving"})-[r:ACTED_IN]->(m) return n,r,m
    

    关系.png

    模式语法

    将节点和关系的语法组合在一起可以表达模式。

    (keanu:Person {name: "Keanu Reeves"})-[role:ACTED_IN {roles: ["Neo"]}]->(matrix:Movie {title: "The Matrix"})
    

    事务

    ​ 任何更新图的查询都运行在一个事务中。一个更新查询要么全部成功,要么全部失败。Cypher或者创建一个新的事务,或者运行在一个已有的事务中:

    • 如果运行上下文中没有事务,Cypher将创建一个,一旦查询完成就提交该事务。
    • 如果运行上下文中已有事务,查询就会运行在该事务中。直到该事务成功地提交之后,数据才会持久化到磁盘中去。

    兼容性

    ​ Cypher不是一成不变的语言。新版本引入了很多新的功能,一些旧的功能可能会被移除。如果需要,旧版本依然可以访问到。这里有两种方式在查询中选择使用哪个版本:

    • 为所有查询设置版本:可以通过neo4j.conf中cypher.default_language_version参数来配置Neo4j数据库使用哪个版本的Cypher语言。
    • 在查询中指定版本:简单地在查询开始的时候写上版本,如Cypher 2.3。

    2,cypher基本语法

    类型

    Cypher处理的所有值都有一个特定的类型,它支持如下类型:

    • 数值型
    • 字符串
    • 布尔型
    • 节点
    • 关系
    • 路径
    • 映射(Map)
    • 列表(List)

    表达式

    • Cypher中的表达式如下:
    • 十进制(整型和双精度型)的字面值:13, -4000, 3.14, 6.022E23
    • 十六进制整型字面值(以0x开头):0x13zf, 0xFC3A9, -0x66eff
    • 八进制整型字面值(以0开头):01372, 02127, -05671
    • 字符串字面值:'Hello', "World"
    • 布尔字面值:true, false, TRUE, FALSE
    • 变量:n, x, rel, myFancyVariable
    • 属性:n.prop, x.prop, rel.thisProperty
    • 动态属性:n["prop"], rel[n.city + n.zip], map[coll[0]]
    • 参数:param,0
    • 表达式列表:['a', 'b'], [1, 2, 3], ['a', 2, n.property, $param], [ ]
    • 函数调用:length(p), max(p)
    • 聚合函数:avg(x.prop), count()
    • 路径-模式:(a)-->()<--(b)
    • 算式:1 + 2 >3 and 3 < 4.
    • 返回true或者false的断言表达式:a.prop = 'Hello', length(p) >10, exists(a.name)
    • 正则表达式:a.name =~ 'Tob.*'
    • 大小写敏感的字符串匹配表达式:a.surname STARTS WITH 'Sven', a.surname ENDS WITH 'son'
    • CASE表达式

    转义字符

    Cypher中的字符串可以包含如下转义字符:

    字符 含义
    \t 制表符
    \b 退格
    \n 换行
    \r 回车
    \f 换页
    ' 单引号
    " 双引号
    \ 反斜杠
    \uxxxx Unicode UTF-16编码点(4位的十六进制数字必须跟在\u后面)
    \Uxxxxxxxx Unicode UTF-32 编码点(8位的十六进制数字必须跟在\U后面)

    Case表达式

    ​ 计算表达式的值,然后依次与WHEN语句中的表达式进行比较,直到匹配上为止。如果未匹配上,则ELSE中的表达式将作为结果。如果ELSE语句不存在,那么将返回null。

    语法:

    CASE test.value
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    [WHEN ...]
    [ELSE default]
    END AS result
    

    例子:

    MATCH (p:Person)
    return
    CASE p.born
    WHEN 1997 THEN 1
    WHEN '1942' THEN 2
    ELSE 3 END AS result
    

    变量

    ​ 当需要引用模式(pattern)或者查询的某一部分的时候,可以对其进行命名。针对不同部分的这些命名被称为变量。例如:

    # 这里的n和b和r就是变量。
    MATCH (n)-[r]->(b)
    RETURN b 
    

    参数

    ​ Cypher支持带参数的查询。这意味着开发人员不是必须用字符串来构建查询。此外,这也让执行计划的缓存更容易。

    ​ 参数能够用于WHERE语句中的字面值和表达式,START语句中的索引值,索引查询以及节点和关系的id。参数不能用于属性名、关系类型和标签,因为这些模式(pattern)将作为查询结构的一部分被编译进查询计划。

    ​ 合法的参数名是字母,数字以及两者的组合。下面是一个使用参数的完整例子。参数以JSON格式提供。具体如何提交它们取决于所使用驱动程序。

    {
    "name" : "Johan"
    }
    match (n:Person) where n.name=$name return n
    

    运算符

    数学运算符

    包括+,-,*,/ 和%,^。

    比较运算符

    包括=,<>,<,>,<=,>=,IS NULL和IS NOT NULL。

    布尔运算符

    包括AND,OR,XOR和NOT。

    字符串运算符

    连接字符串的运算符为+。

    正则表达式的匹配运算符为=~。

    列表运算符

    列表的连接也可以通过+运算符。

    可以用IN来检查列表中是否存在某个元素。

    值的相等与比较

    Cypher支持使用=和<>来比较两个值的相等/不相等关系。同类型的值只有它们是同一个值的时候才相等,如3 = 3和"x" <> "xy"。

    值的排序与比较

    比较运算符<=,<(升序)和>=,>(降序)可以用于值排序的比较。如下所示:

    • 数字型值的排序比较采用数字顺序
    • java.lang.Double.NaN大于所有值
    • 字符串排序的比较采用字典顺序。如"x" < "xy"
    • 布尔值的排序遵循false < true
    • 当有个参数为null的时候,比较结果为null。如null < 3的结果为null
    • 将其他类型的值相互比较进行排序将报错
    链式比较运算

    比较运算可以被任意地链在一起。如x < y <= z等价于x < y AND y <= z。如:

    MATCH (n) WHERE 21 < n.age <= 30 RETURN n
    

    等价于:

    MATCH (n) WHERE 21 < n.age AND n.age <= 30 RETURN n
    
    注释

    Cypher语言的注释类似其他语言,用双斜线//来注释行。例如:

    MATCH (n) RETURN n //这是行末尾注释
    MATCH (n)
    //这是整行注释
    RETURN n
    MATCH (n) WHERE n.property = '//这不是注释' RETURN n 
    

    模式(Patterns)

    ​ 使用模式可以描述你期望看到的数据的形状。例如,在MATCH、CREATE、DELETE等语句中,当用模式描述一个形状的时候,Cypher将按照模式来获取相应的数据。

    ​ 模式描述数据的形式很类似在白板上画出图的形状。通常用圆圈来表达节点,使用箭头来表达关系。节点模式

    ​ 模式能表达的最简单的形状就是节点。节点使用一对圆括号表示,然后中间含一个名字。例如:

    (a)
    //这个模式描述了一个节点,其名称使用变量a表示。
    

    关联节点的模式

    模式可以描述多个节点及其之间的关系。Cypher使用箭头来表达两个节点之间的关系。例如:

    (a)-->(b)
    (a)-->(b)<--(c)
    (a)-->()<--(c)
    

    标签

    模式除了可以描述节点之外,还可以用来描述标签。例如:

    (a:User)-->(b)
    (a:User:Admin)-->(b)
    

    指定属性

    属性在模式中使用键值对的映射结构来表达,然后用大括号包起来。例如,一个有两个属性的节点如下所示:

    (a {name: 'Andres', sport: 'Brazilian Ju-Jitsu'}) 
    // 关系中的属性
    (a)-[{blocked: false}]->(b)
    

    描述关系

    ​ 如前面的例子所示,可以用箭头简单地描述两个节点之间的关系。它描述了关系的存在性和方向性。但如果不关心关系的方向,则箭头的头部可以省略。例如:

    (a)--(b)
    

    ​ 与节点类似,如果后续需要引用到该关系,则可以给关系赋一个变量名。变量名需要用方括号括起来,放在箭头的短横线中间,如下所示:

    (a)-[r]->(b)
    

    就像节点有标签一样,关系可以有类型(type)。给关系指定类型,如下所示:

    (a)-[r:REL_TYPE]->(b)
    

    ​ 不像节点可以有多个标签,关系只能有一个类型。但如果所描述的关系可以是一个类型集中的任意一种类型,可以将这些类型都列入到模式中,它们之间以竖线“|”分割。如:

    (a)-[r:TYPE1|TYPE2]->(b)
    

    ​ 注意:这种模式仅适用于描述已经存在的数据(如在MATCH语句中),而在CREATE或者MERGE语句中是不允许的,因为一个关系不能创建多个类型。

    ​ 与使用一串节点和关系来描述一个长路径的模式不同,很多关系(以及中间的节点)可以采用指定关系的长度的模式来描述。例如:

    (a)-[*2]->(b)
    

    ​ 它描述了一张三个节点和两个关系的图。这些节点和关系都在同一条路径中(路径的长度为2)。它等同于:

    (a)-->()-->(b)
    

    ​ 关系的长度也可以指定一个范围,这被称为可变长度的关系。例如:

    (a)-[*3..5]->(b)
    

    ​ 长度的边界也是可以省略的,如描述一个路径长度大于等于3的路径:

    (a)-[*3..]->(b) 
    

    ​ 路径长度小于等于5的路径,如:

    (a)-[*..5]->(b) 
    

    ​ 两个边界都可以省略,这允许任意长度的路径,如:

    (a)-[*]->(b)
    

    列表

    Cypher对列表(list)有很好的支持。可以使用方括号和一组以逗号分割的元素来创建一个列表。如:

    RETURN [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS list 
    

    相关文章

      网友评论

          本文标题:Cypher 概述与基本语法

          本文链接:https://www.haomeiwen.com/subject/dgmvfktx.html