Skip to content

语法

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 | | | | | | | | | |