语法
https://www.cnblogs.com/MarisaMagic/p/17537963.html https://graphacademy.neo4j.com/categories/analytics/?ref=docs-ad-analytics&_gl=1 https://neo4j.com/docs/graph-data-science/current/management-ops/graph-creation/graph-project-cypher-projection/
Cypher与CQL
Cypher
Cypher是neo4j采用的查询语言,是一种: - 描述性图查询语言; - 尝试用简单方式表达复杂查询过程的语言; - 被设计为简单但高效的语言; - Cypher的设计受到SQL、SPARQL等语言的启发;
CQL
什么是CQL: - 百度翻译的结果称CQL为持续性查询语言; - LeanCloud云服务提供商将CQL称为Cloud Query Language,用来称呼其自行开发的一种面向其云服务数据查询的语言; - W3Cschool教程中称CQL就是Cypher; - neo4j官方文档并未出现CQL这一说法; - CQL应该如SQL,指代一类查询语言,但又如实际的Oracle数据库、微软SQL server使用的SQL在细节上有略有不同,CQL的具体形式之间也应该是不同的;
Cypher与CQL
- Cypher就应该不是CQL的一种;
- Cypher与CQL的相同点仅在开头字母相同上,介于CQL的具体含义并不唯一,很难说明Cypher与CQL的其他相同或相似、相关之处;
- Cypher是一种图查询语言,相比之下,称为一种GQL(Graph Query Language)或许更合适;
- W3Cschool教程中称CQL就是Cypher应该是一种误称,介于W3Cschool的neo4j教程非常老旧,其中的一些定义内容应该辩证地、用发展的眼光看待;
语法基础
数据类型
| 类型 | 用法 |
|---|---|
| boolean | true; false |
| byte | 用于表示8位整数 |
| short | 用于表示16位整数 |
| int | 用于表示32位整数 |
| long | 用于表示64位整数 |
| float | 用于表示32位浮点数 |
| double | 用于表示64位浮点数 |
| char | 用于表示16位字符 |
| String | 用于表示字符串 |
- neo4j中String支持Unicode第零平面中的字符;
- neo4j中String类型对不在第零平面的Unicode字符不完全能支持,存在不确定的问题,如emoji等;
- neo4j不自带内置的数据类型判断函数,需要使用APOC拓展包;
结构类型
| 类型 | 含义 |
|---|---|
| Node | 节点 |
| Relationship | 关系 |
| Path | 链路(节点与连接节点的关系所共同组成的概念) |
复合结构
| 类 | 含义 |
|---|---|
| List | 列表,序列,数组 |
| Map | 键值对 |
其他
- neo4j支持时间点、时间段和坐标数据类型并提供它们的运算和函数;
变量命名
- 命名应以字母开头,包括非英语字母;
- 命名不能以数字开头;
- 命名不能以符号开头;
- 命名长度最高支持65535(2^16 - 1)或65534,取决于neo4j的版本;
- 命名对大小写敏感;
- 命名中的空格会被自动忽略;
命名空间与作用域
- 同一查询语句中,节点标签、关系类型、属性名可以重复使用同一名称,如:
css CREATE (a:a {a:'a'})-[r:a]->(b:a {a: 'a'}) -
统一查询语句中,节点名、关系名不能使用同一名称,如:
css CREATE (a)-[a]->(b) -
同一作用域内,同一名称在同一命名空间内,可重复使用,如:
css MATCH(s1:student) MATCH(s2:student)WHERE s2.name<>s1.name CREATE(s1)-[:classmates]->(s2)
操作符类型
| 操作符类型 | 操作符 |
|---|---|
| 聚集操作 | DISTINCT |
| 成员变量操作 | .: 用于访问静态成员变量 |
[]: 用于访问动态成员变量 |
|
=: 用于整体成员变量修改,未指定的成员变量会被清空为null |
|
+=: 用于改变指定的成员变量 |
|
| 数学运算符 | +, -, *, /, %, ^ |
| 比较运算符 | =, <>, <, >, <=, >=, IS NULL, NOT NULL |
| 字符串匹配符 | STARTS WITH, ENDS WITH, CONTAINS |
| 布尔运算 | AND, OR, XOR, NOT |
| 字符串运算 | +: 关联字符串 |
=~: 正则匹配 |
|
| 时间运算 | +和-: 用于时间之间加减 |
*和/: 用于时间和数量之间 |
|
| 键值对操作 | .: 用于访问值 |
[]: 用于访问动态值 |
|
| 列表操作 | +: 关联 |
IN: 查找列表中是否存在该元素 |
|
[]: 动态地访问元素 |
示例
聚集操作
CREATE
(a:Restaurant {name: 'Hungry Jo', rating_hygiene: 10, rating_food: 7}),
(b:Restaurant {name: 'Buttercup Tea Rooms', rating_hygiene: 5, rating_food: 6}),
(c1:Category {name: 'hygiene'}),
(c2:Category {name: 'food'})
WITH a, b, c1, c2
MATCH (restaurant:Restaurant), (category:Category)
WHERE restaurant["rating_" + category.name] > 6
RETURN DISTINCT restaurant.name
聚合
CREATE
(a:Person {name: 'Anne', eyeColor: 'blue'}),
(b:Person {name: 'Bill', eyeColor: 'brown'}),
(c:Person {name: 'Carol', eyeColor: 'blue'})
WITH [a, b, c] AS ps
UNWIND ps AS p
RETURN DISTINCT p.eyeColor
仅返回blue和brown。
整体成员变量修改
CREATE (a:Person {name: 'Jane', age: 20})
WITH a
MATCH (p:Person {name: 'Jane'})
SET p = {name: 'Ellen', livesIn: 'London'}
RETURN p.name, p.age, p.livesIn
age会变为null。
修改指定的成员变量
CREATE (a:Person {name: 'Jane', age: 20})
WITH a
MATCH (p:Person {name: 'Jane'})
SET p += {name: 'Ellen', livesIn: 'London'}
RETURN p.name, p.age, p.livesIn
比较运算符
和null进行比较,结果只会是null;
不同类型数据比较会得到false;
比较两侧中可以是带计算的表达式;
时间点比较需要考虑时区;
时间段无法比较,比较结果只会是null;
可以在一行中连续比较,完全正确则返回true。
布尔比较
| 布尔比较 | a | b | a AND b | a OR b | a XOR b | NOT a |
|---|---|---|---|---|---|---|
| false | false | false | false | false | true | |
| false | null | false | null | null | true | |
| false | true | false | true | true | true | |
| true | false | false | true | true | false | |
| true | null | null | true | null | false | |
| true | true | true | true | false | false | |
| null | false | false | null | null | null | |
| null | null | null | null | null | null | |
| null | true | null | true | null | null |
| 转义字符 | 对应字符 |
|---|---|
| \t | Tab制表符 |
| \b | Backspace退格 |
| \n | Newline换行 |
| \r | Carriage return回车 |
| \f | Form feed换页 |
| \' | ‘ |
| \" | " |
| \\ | Backslash反斜线 |
| \uxxxx | UTF-16 |
| \Uxxxxxxxx | UTF-32 |
保留关键字
| Clauses命令 | Subclauses子句 | Modifiers修饰符 | Expressions表达式 | Operators操作符 | Schema | Hints | Literals文字值 | Reserved for future use保留 | |------------|-------------|----------------|-----------------|-------------------|-----------------|--------|-------|----------------|-----------------------------| | CALL | LIMIT | ASC | ALL | AND | CONSTRAINT | INDEX | false | ADD | | | CREATE | ORDER | ASCENDING | CASE | AS | CREATE | JOIN | null | DO | | | DELETE | SKIP | ASSERT | ELSE | CONTAINS | DROP | PERIODIC| true | FOR | | | DETACH | WHERE | BY | END | DISTINCT | EXISTS | COMMIT | | MANDATORY | | | EXISTS | YIELD | CSV | THEN | ENDS | INDEX | SCAN | | OF | | | FOREACH | | DESC | WHEN | IN | NODE | USING | | REQUIRE | | | LOAD | | DESCENDING | | IS | KEY | | | SCALAR | | | MATCH | | ON | | NOT | UNIQUE | | | | | | MERGE | | | | OR | | | | | | | OPTIONAL | | | | STARTS | | | | | | | REMOVE | | | | XOR | | | | | | | RETURN | | | | | | | | | | | SET | | | | | | | | | | | START | | | | | | | | | | | UNION | | | | | | | | | | | UNWIND | | | | | | | | | | | WITH | | | | | | | | | |