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)

时间数学

为时间类型添加持续时间

+

+

时间数学运算

从时间类型中减去一个持续时间

-

-

时间数学

两个时间类型相减,返回以毫秒为单位的持续时间

-

-

时间数学

添加两个持续时间

+

+

时间数学运算

两个时长相减

-

-

时间数学运算

将持续时间乘以数值

*

*

时间数学运算

将持续时间除以一个数值

/

/

比较

相等

=

=

比较

不等于

<>

<>

比较

小于

<

<

比较

小于或等于

<=

<=

比较

大于

>

>

比较

大于或等于

>=

>=

对比

验证为 NULL

为空

为空

对比

验证为 NOT NULL

不为空

不为空

比较

对字符串开头执行区分大小写的匹配

STARTS WITH

starts with

比较

对字符串结尾执行区分大小写的匹配

ENDS WITH

以...结尾

比较

无论字符串中的位置如何,都执行区分大小写的匹配

CONTAINS

contains

布尔值

逻辑与

AND

布尔值

逻辑或

OR

布尔值

异或

XOR

xor

计划中

布尔值

取反

NOT

not

BitOpr

位与运算

通过函数

&

BitOpr

位或运算

通过函数

|

布尔值

按位异或

通过函数

^

BitOpr

位反转

通过函数

~

计划中

BitOpr

位左移

通过函数

<<

BitOpr

位右移

通过函数

>>

分支

ProjectReturn一起使用

条件判断

条件判断

已规划

标量

返回路径的长度

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查询中调用它们。