Cypher支持¶
本文档概述了GIE当前支持Neo4j Cypher查询的能力,并将其与Neo4j中定义的语法进行了对比。虽然我们的目标是兼容Neo4j的语法规范,但GIE目前仍存在一些限制。一个主要约束是我们仅支持Cypher中的读取路径。因此,与写入相关的功能(如添加顶点/边或修改其属性)目前仍未实现。
我们详细介绍了GIE对Cypher的支持情况,主要包括数据类型、运算符和子句。我们还重点列出了计划在近期实现的功能特性。需要注意的是,本文档中所有术语(包括数据类型、运算符和子句关键词)都不区分大小写,但为了清晰起见,我们分别使用大写字母和小写字母来表示Neo4j和GIE的术语。
数据类型¶
与Neo4j类似,我们提供了对属性、结构和构造类别中数据类型的支持。不过,为确保与我们的存储系统兼容,所支持的具体数据类型与Cypher中的略有不同。更多细节将在后续详细说明。
属性类型¶
存储在顶点(相当于Cypher中的节点)和边(相当于Cypher中的关系)中的可用数据类型(称为属性类型)分为多个类别,包括布尔型、整型、浮点型、字符串型、字节型、占位符型和时间型。这些属性类型被广泛使用,通常可用于查询和作为参数——使其成为最常用的数据类型。
类别 |
Cypher类型 |
GIE类型 |
支持情况 |
待办事项 |
|---|---|---|---|---|
布尔型 |
BOOLEAN |
bool |
||
整数 |
整数类型 |
int32/uint32/int64/uint64 |
||
浮点数 |
FLOAT |
float/double |
||
字符串 |
字符串 |
字符串 |
||
字节 |
BYTE_ARRAY |
bytes |
||
占位符 |
NULL |
无 |
计划中 |
|
时间 |
DATE |
date |
计划 |
|
时间 |
DATETIME (ZONED) |
datetime (Zoned) |
计划中 |
|
时间类型 |
TIME (ZONED) |
time (Zoned) |
计划中 |
结构类型¶
在图中,结构类型是第一类实体,由以下部分组成:
顶点(Vertex): 它编码了图中特定顶点的信息。这些信息包括ID、标签以及属性映射表。但需要注意,GIE目前不支持顶点拥有多个标签。
边(Edge): 它编码了图中特定边的信息。这些信息包括边的ID、边标签、属性映射表,以及指向源顶点/目标顶点的一对顶点ID。
路径:它编码了遍历图时顶点和可能边的交替序列。
类别 |
Cypher类型 |
GIE类型 |
支持情况 |
待办事项 |
|---|---|---|---|---|
图 |
节点 |
顶点 |
||
图 |
关系 |
边 |
||
图 |
路径 |
路径 |
构造类型¶
构造类型主要包括数组(Array)和映射(Map)两大类。
类别 |
Cypher类型 |
GIE类型 |
支持情况 |
待办事项 |
|---|---|---|---|---|
数组 |
LIST |
int32/int64/double/字符串/键值对 数组 |
||
映射 |
映射 |
不适用 |
仅用于顶点/边 |
操作符¶
我们列出了GIE支持的运算符类别,包括聚合(Aggregation)、属性(Property)、数学(Mathematical)、比较(Comparison)、字符串(String)和布尔(Boolean)运算符。这些运算符的示例和功能与Neo4j中的相同。
需要注意的是,这里列出的一些聚合运算符如max()在Neo4j中是作为函数实现的。目前我们尚未引入函数的概念。
分类 |
描述 |
Cypher操作 |
GIE操作 |
支持情况 |
待办事项 |
|---|---|---|---|---|---|
聚合 |
平均值 |
AVG() |
avg() |
||
聚合 |
最小值 |
MIN() |
min() |
||
聚合 |
最大值 |
MAX() |
max() |
||
聚合 |
统计元素数量 |
COUNT() |
count() |
||
聚合 |
计算不同元素的数量 |
COUNT(DISTINCT) |
count(distinct) |
||
聚合 |
汇总数值 |
SUM() |
sum() |
||
聚合 |
收集到列表中 |
COLLECT() |
collect() |
||
聚合 |
收集到一个集合中 |
COLLECT(DISTINCT) |
collect(distinct) |
||
属性 |
获取顶点/边的属性 |
[N|R].“KEY” |
[v|e].“key” |
||
数学 |
加法 |
+ |
+ |
||
数学 |
减法 |
- |
- |
||
数学 |
乘法 |
* |
* |
||
数学 |
除法 |
/ |
/ |
||
数学 |
模除 |
% |
% |
||
数学运算 |
幂运算 |
^ |
power(a, b) |
||
时间数学 |
为时间类型添加持续时间 |
||||
时间数学运算 |
从时间类型中减去一个持续时间 |
||||
时间数学 |
两个时间类型相减,返回以毫秒为单位的持续时间 |
||||
时间数学 |
添加两个持续时间 |
||||
时间数学运算 |
两个时长相减 |
||||
时间数学运算 |
将持续时间乘以数值 |
||||
时间数学运算 |
将持续时间除以一个数值 |
||||
比较 |
相等 |
= |
= |
||
比较 |
不等于 |
<> |
<> |
||
比较 |
小于 |
< |
< |
||
比较 |
小于或等于 |
<= |
<= |
||
比较 |
大于 |
> |
> |
||
比较 |
大于或等于 |
>= |
>= |
||
对比 |
验证为 |
为空 |
为空 |
||
对比 |
验证为 |
不为空 |
不为空 |
||
比较 |
对字符串开头执行区分大小写的匹配 |
STARTS WITH |
starts with |
||
比较 |
对字符串结尾执行区分大小写的匹配 |
ENDS WITH |
以...结尾 |
||
比较 |
无论字符串中的位置如何,都执行区分大小写的匹配 |
CONTAINS |
contains |
||
布尔值 |
逻辑与 |
AND |
且 |
||
布尔值 |
逻辑或 |
OR |
或 |
||
布尔值 |
异或 |
XOR |
xor |
计划中 |
|
布尔值 |
取反 |
NOT |
not |
||
BitOpr |
位与运算 |
通过函数 |
& |
||
BitOpr |
位或运算 |
通过函数 |
| |
||
布尔值 |
按位异或 |
通过函数 |
^ |
||
BitOpr |
位反转 |
通过函数 |
~ |
计划中 |
|
BitOpr |
位左移 |
通过函数 |
<< |
||
BitOpr |
位右移 |
通过函数 |
>> |
||
分支 |
与 |
条件判断 |
条件判断 |
已规划 |
|
标量 |
返回路径的长度 |
length() |
length() |
||
ListLiteral |
将表达式折叠为单个列表 |
[] |
[] |
||
MapLiteral |
将带键的表达式折叠成单个映射 |
{} |
{} |
||
标签 |
获取顶点类型的标签名称 |
labels() |
labels() |
||
elementId |
获取顶点或边的标识符,该标识符在对象类型和数据库中唯一 |
elementId() |
elementId() |
||
类型 |
获取边类型的标签名称 |
type() |
type() |
||
提取 |
从时间类型中获取间隔值 |
||||
用户自定义函数 |
从路径中获取所有边 |
relationships(path) |
gs.function.relationships(path) |
||
用户自定义函数 |
从路径中获取所有节点 |
nodes(path) |
gs.function.nodes(path) |
||
用户自定义函数 |
从边获取起始节点 |
startNode(edge) |
gs.function.startNode(edge) |
||
用户自定义函数 |
从边获取终点节点 |
endNode(edge) |
gs.function.endNode(edge) |
||
用户自定义函数 |
将整数值转换为日期时间 |
datetime(1287230400000) |
gs.function.datetime(1287230400000) |
||
路径修饰符 |
获取两个端点之间的任意最短路径 |
SHORTEST |
SHORTESTPATH |
||
路径修饰符 |
获取两个端点之间的所有最短路径 |
ALL SHORTEST |
ALL SHORTESTPATH |
条款¶
目前一个显著的局限是我们不允许在单个查询中指定多个MATCH子句。例如,以下代码将无法编译:
MATCH (a) -[]-> (b)
WITH a, b
MATCH (a) -[]-> () -[]-> (b) # second MATCH clause
RETURN a, b;
此外,我们还支持OPTIONAL MATCH语法。例如,以下查询可以被支持:
MATCH (a) -[]-> (b)
Optional MATCH (b) -[]-> (c)
RETURN a, b, c;
关键词 |
说明 |
是否支持 |
待办事项 |
|---|---|---|---|
MATCH |
只允许一个Match子句 |
||
可选匹配 |
实现为左外连接 |
||
RETURN … [AS] |
|||
WITH … [AS] |
项目、聚合、去重 |
||
WHERE |
|||
WHERE NOT EXIST (边/路径) |
实现为反连接 |
||
排序依据 |
|||
LIMIT |
|||
UNFOLD |
该操作类似于SQL中的'UNSET',它会从集合类型中展开元素 |
此外,我们在Cypher中支持两种类型的过程调用:
我们提供一组内置过程,可以直接在Cypher查询中调用。这些过程都以
gs.procedure.为前缀。关键词
说明
示例
CALL
以符合FLEX规范的JSON格式获取模式信息
call gs.procedure.meta.schema();CALL
以符合FLEX规范的JSON格式获取统计信息
call gs.procedure.meta.statistics();用户自定义过程:用户可以在GIE中定义自定义过程,并在其Cypher查询中调用它们。