当前位置: 代码迷 >> 综合 >> neo4j--Cypher 基本语法
  详细解决方案

neo4j--Cypher 基本语法

热度:30   发布时间:2023-11-17 22:15:40.0

一、类型

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

  1. 数值型
  2. 字符串
  3. 布尔型
  4. 节点
  5. 关系
  6. 路径
  7. 映射(Map)
  8. 列表(List)

二、表达式

Cypher中的表达式如下:

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

三、参数

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

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

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

{

"name" : "Johan"

}

Match (n) where n.name=$name return n

四、运算符

1、数学运算符

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

2、比较运算符

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

3、布尔运算符

   包括AND,OR,XOR和NOT。

4、字符串运算符

    连接字符串的运算符为+。正则表达式的匹配运算符为=~。

5、列表运算符

    列表的连接也可以通过+运算符。可以用IN来检查列表中是否存在某个元素。

6、值的相等与比较

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

7、值的排序与比较

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

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

8、链式比较运算

       比较运算可以被任意地链在一起。如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)-[:REL_TYPE]->(b)

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

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

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

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

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

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

关系的长度最小值为3,最大值为5。它描述了一个或者有4个节点和3个关系,或者5个节点4个关系,或者6个节点和5个关系连在一起的图组成的一条路径。

长度的边界也是可以省略的,如描述一个路径长度大于等于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

八、空值

空值null在Cypher中表示未找到或者未定义。从概念上讲,null意味着”一个未找到的未知值”。 对待null会与其他值有些不同。例如从节点中获取一个并不存在的属性将返回null。大多数以null作为输入的表达式将返回null。这包括WHERE语句中用于断言的布尔表达式。

null不等于null。两个未知的值并不意味着它们是同一个值。因此,null = null返回null而不是true。

判断 某个节点上 有或没有 某个属性,如下

Match  (n)  where n.name  is null return n

Match  (n)  where n. name  is not  null return n

空值的逻辑运算

逻辑运算符(包括AND,OR,XOR,IN,NOT)把null当作未知的三值逻辑值。下面为AND,OR和XOR的逻辑值表。

a

b

a AND b

a OR b

a XOR b

false

false

false

false

false

false

null

false

null

null

false

true

false

true

true

true

false

false

true

true

true

null

null

true

null

true

true

true

true

false

null

false

false

null

null

null

null

null

null

null

null

true

null

true

null

空值与IN

IN运算符遵循类似的逻辑。如果列表中存在某个值,结果就返回true。如果列表包含null值并且没有匹配到值,结果返回null否则结果为false。下面表中是一些例子:

 

表达式

结果

2 IN [1, 2, 3]

true

2 IN [1, null, 3]

null

2 IN [1, 2, null]

true

2 IN [1]

false

2 IN []

false

null IN [1, 2, 3]

null

null IN [1, null, 3]

null

null IN []

false

all, any, none和single与IN类似,如果可以确切地计算结果,将返回true或者false。否则将返回null。

返回空值的表达式

  • 从列表中获取不存在的元素:[][0],head([])
  • 试图访问节点或者关系的不存在的属性:n.missingProperty
  • 与null做比较:1 < null
  • 包含null的算术运算:1 + null
  • 包含任何null参数的函数调用:sin(null)

九、节点语法

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

 ()

 (matrix)  matrix为变量名

 (:Movie)   Movie为标签

 (matrix:Movie)

 (matrix:Movie {title: "The Matrix"})

 (matrix:Movie {title: "The Matrix", released: 1997})

若想查询返回某些东西,就必须命名变量名来查询:

Match (matrix:Movie {title: "The Matrix"}) return matrix

 

十、关系语法

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

--

-->

-[role]->

-[:ACTED_IN]->

-[role:ACTED_IN]->

-[role:ACTED_IN {roles: ["Neo"]}]->

CREATE(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix),(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix),(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix),(LillyW)-[:DIRECTED]->(TheMatrix),(LanaW)-[:DIRECTED]->(TheMatrix),(JoelS)-[:PRODUCED]->(TheMatrix)

 

查询:

Match (n)-[role]->(m) return n, role ,m

Match (n)-->(m) return n ,m

Match (n)--(m) return n ,m

删除:

match(n),(m) optional match (n)-[r]-(m)delete r,n,m

十一、模式语法

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

(keanu:Person:Actor {name: "Keanu Reeves"})-[role:ACTED_IN {roles: ["Neo"]}]->

(matrix:Movie {title: "The Matrix"} )

 

十二、Case表达式

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

语法:

CASE test

WHEN value THEN result

[WHEN ...]

[ELSE default]

END

参数:

  • test:一个有效的表达式
  • value:一个表达式,它的结果将与test表达式的结果进行比较
  • result:如果value表达式能够与test表达式匹配,它将作为结果表达式
  • default:没有匹配的情况下的默认返回表达式

 

 

  相关解决方案