一、DDL
1、创建图空间
CREATE SPACE [IF NOT EXISTS] <graph_space_name> (
[partition_num = <partition_number>,]
[replica_factor = <replica_number>,]
vid_type = {FIXED_STRING(<N>) | INT[64]}
)
[COMMENT = '<comment>'];
参数 | 说明 |
---|---|
IF NOT EXISTS | 检测待创建的图空间是否存在,只有不存在时,才会创建图空间。仅检测图空间的名称,不会检测具体属性。 |
<graph_space_name> | 在 Nebula Graph 实例中唯一标识一个图空间。图空间名称以英文字母开头,支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用特殊字符或保留关键字时,需要用反引号(`)包围,详情参见关键字和保留字。 |
partition_num | 指定图空间的分片数量。建议设置为集群中硬盘数量的 20 倍(HDD 硬盘建议为 2 倍)。例如集群中有 3 个硬盘,建议设置 60 个分片。默认值为 100。 |
replica_factor | 指定每个分片的副本数量。建议在生产环境中设置为 3,在测试环境中设置为 1。由于需要基于多数表决,副本数量必须是奇数。默认值为 1。 |
vid_type | 必选参数。指定点 ID 的数据类型。可选值为FIXED_STRING(<N>) 和INT64 。INT 等同于INT64 。FIXED_STRING(<N>) 表示数据类型为字符串,最大长度为N ,超出长度会报错;INT64 表示数据类型为整数。 |
COMMENT | 图空间的描述。最大为 256 字节。默认无描述。 |
例如:CREATE SPACE PersonCarRel(vid_type=FIXED_STRING(30));
2、创建Tag
创建 Tag 前,需要先用USE
语句指定工作空间。
CREATE TAG [IF NOT EXISTS] <tag_name>
(
<prop_name> <data_type> [NULL | NOT NULL] [DEFAULT <default_value>] [COMMENT '<comment>']
[{, <prop_name> <data_type> [NULL | NOT NULL] [DEFAULT <default_value>] [COMMENT '<comment>']} ...]
)
[TTL_DURATION = <ttl_duration>]
[TTL_COL = <prop_name>]
[COMMENT = '<comment>'];
参数 | 说明 |
---|---|
IF NOT EXISTS | 检测待创建的 Tag 是否存在,只有不存在时,才会创建 Tag。仅检测 Tag 的名称,不会检测具体属性。 |
<tag_name> | 每个图空间内的 Tag 必须是唯一的。Tag 名称设置后无法修改。Tag 名称以英文字母开头,支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用特殊字符或保留关键字时,需要用反引号(`)包围,详情参见关键字和保留字。 |
<prop_name> | 属性名称。每个 Tag 中的属性名称必须唯一。属性的命名规则与 Tag 相同。 |
<data_type> | 属性的数据类型,目前支持数值、布尔、字符串以及日期与时间。 |
NULL \| NOT NULL | 指定属性值是否支持为NULL 。默认值为NULL 。 |
DEFAULT | 指定属性的默认值。默认值可以是一个文字值或 Nebula Graph 支持的表达式。如果插入点时没有指定某个属性的值,则使用默认值。 |
COMMENT | 对单个属性或 Tag 的描述。最大为 256 字节。默认无描述。 |
TTL_DURATION | 指定时间戳差值,单位:秒。时间戳差值必须为 64 位非负整数。属性值和时间戳差值之和如果小于当前时间戳,属性就会过期。默认值为0 ,表示属性永不过期。 |
TTL_COL | 指定要设置存活时间的属性。属性的数据类型必须是int 或者timestamp 。一个 Tag 只能指定一个字段为TTL_COL 。更多 TTL 的信息请参见 TTL。 |
例如:CREATE TAG IF NOT EXISTS Person(name string,age bigint);
CREATE TAG IF NOT EXISTS Car(brand string,model string);
3、创建边Edge
创建 Edge type 前,需要先用USE
语句指定工作空间。
CREATE EDGE [IF NOT EXISTS] <edge_type_name>
(
<prop_name> <data_type> [NULL | NOT NULL] [DEFAULT <default_value>] [COMMENT '<comment>']
[{, <prop_name> <data_type> [NULL | NOT NULL] [DEFAULT <default_value>] [COMMENT '<comment>']} ...]
)
[TTL_DURATION = <ttl_duration>]
[TTL_COL = <prop_name>]
[COMMENT = '<comment>'];
参数 | 说明 |
---|---|
IF NOT EXISTS | 检测待创建的 Edge type 是否存在,只有不存在时,才会创建 Edge type。仅检测 Edge type 的名称,不会检测具体属性。 |
<edge_type_name> | 每个图空间内的 Edge type 必须是唯一的。Edge type 名称设置后无法修改。Edge type 名称以英文字母开头,支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用特殊字符或保留关键字时,需要用反引号(`)包围,详情参见关键字和保留字。 |
<prop_name> | 属性名称。每个 Edge type 中的属性名称必须唯一。属性的命名规则与 Edge type 相同。 |
<data_type> | 属性的数据类型,目前支持数值、布尔、字符串以及日期与时间。 |
NULL \| NOT NULL | 指定属性值是否支持为NULL 。默认值为NULL 。 |
DEFAULT | 指定属性的默认值。默认值可以是一个文字值或 Nebula Graph 支持的表达式。如果插入边时没有指定某个属性的值,则使用默认值。 |
COMMENT | 对单个属性或 Edge type 的描述。最大为 256 字节。默认无描述。 |
TTL_DURATION | 指定时间戳差值,单位:秒。时间戳差值必须为 64 位非负整数。属性值和时间戳差值之和如果小于当前时间戳,属性就会过期。默认值为0 ,表示属性永不过期。 |
TTL_COL | 指定要设置存活时间的属性。属性的数据类型必须是int 或者timestamp 。一个 Edge type 只能指定一个字段为TTL_COL 。更多 TTL 的信息请参见 TTL。 |
例如:CREATE EDGE IF NOT EXISTS relation(degree int);
二、DQL
1、查询点
① Match
MATCH
语法如下:
MATCH <pattern> [<clause_1>] RETURN <output> [<clause_2>];
pattern
:pattern 的详细说明请参见模式。MATCH
语句支持匹配一个或多个模式,多个模式之间用英文逗号(,)分隔。例如(a)-[]->(b),(c)-[]->(d)
。
clause_1
:支持WHERE
、WITH
、UNWIND
、OPTIONAL MATCH
子句,也可以使用MATCH
作为子句。
output
:定义需要返回的输出。可以使用AS
设置输出的别名。
clause_2
:支持ORDER BY
、LIMIT
子句。
match (v) where id(v) == "ID值" return v;
其中 match固定语法
(v)是形式参数
where id(v) 固定语法
字符串类型 == 后需要加引号
点为数值类型:
match (v) where id(v) == 13001338694 return v;
字符串类型 == 后不需要加引号
nebula> MATCH (v) RETURN v LIMIT 3;
+-----------------------------------------------------------+
| v |
+-----------------------------------------------------------+
|("player102" :player{age: 33, name: "LaMarcus Aldridge"}) |
|("player106" :player{age: 25, name: "Kyle Anderson"}) |
|("player115" :player{age: 40, name: "Kobe Bryant"}) |
+-----------------------------------------------------------+
nebula> MATCH (v:player) RETURN v LIMIT 3;
+-----------------------------------------------------------+
| v |
+-----------------------------------------------------------+
| ("player102" :player{age: 33, name: "LaMarcus Aldridge"}) |
| ("player106" :player{age: 25, name: "Kyle Anderson"}) |
| ("player115" :player{age: 40, name: "Kobe Bryant"}) |
+-----------------------------------------------------------+
使用WHERE
子句也可以实现相同的操作:
nebula> MATCH (v:player) \
WHERE v.player.name == "Tim Duncan" \
RETURN v;
+----------------------------------------------------+
| v |
+----------------------------------------------------+
| ("player100" :player{age: 42, name: "Tim Duncan"}) |
+----------------------------------------------------+
②FETCH
语法¶
FETCH PROP ON {<tag_name>[, tag_name ...] | *}
<vid> [, vid ...]
YIELD <return_list> [AS <alias>];
参数 | 说明 |
---|---|
tag_name | Tag 名称。 |
* | 表示当前图空间中的所有 Tag。 |
vid | 点 ID。 |
YIELD | 定义需要返回的输出。详情请参见 YIELD。 |
AS | 设置别名。 |
FETCH PROP ON [Person ] ["13001338694"] yield [Person.age,Person.name];
其中 FETCH PROP ON为固定语法
Person 为tagName
"13001338694" 为 Vid
yield 为固定语法
Person.age,Person.nam 为属性值
③ Go
GO [[<M> TO] <N> STEPS ] FROM <vertex_list>
OVER <edge_type_list> [{REVERSELY | BIDIRECT}]
[ WHERE <conditions> ]
YIELD [DISTINCT] <return_list>
[{ SAMPLE <sample_list> | <limit_by_list_clause> }]
[| GROUP BY {<col_name> | expression> | <position>} YIELD <col_name>]
[| ORDER BY <expression> [{ASC | DESC}]]
[| LIMIT [<offset>,] <number_rows>];
<vertex_list> ::=
<vid> [, <vid> ...]
<edge_type_list> ::=
<edge_type> [, <edge_type> ...]
| *
<return_list> ::=
<col_name> [AS <col_alias>] [, <col_name> [AS <col_alias>] ...]
<N> STEPS
:指定跳数。如果没有指定跳数,默认值N
为1
。如果N
为0
,Nebula Graph 不会检索任何边。
M TO N STEPS
:遍历M~N
跳的边。如果M
为0
,输出结果和M
为1
相同,即GO 0 TO 2
和GO 1 TO 2
是相同的。
<vertex_list>
:用逗号分隔的点 ID 列表,或特殊的引用符$-.id
。详情参见管道符。
<edge_type_list>
:遍历的 Edge type 列表。
REVERSELY | BIDIRECT
:默认情况下检索的是<vertex_list>
的出边(正向),REVERSELY
表示反向,即检索入边;BIDIRECT
为双向,即检索正向和反向,通过返回<edge_type>._type
字段判断方向,其正数为正向,负数为反向。
-
WHERE <conditions>
:指定遍历的过滤条件。用户可以在起始点、目的点和边使用WHERE
子句,还可以结合AND
、OR
、NOT
、XOR
一起使用。详情参见 WHERE。Note
遍历多个 Edge type 时,
WHERE
子句有一些限制。例如不支持WHERE edge1.prop1 > edge2.prop2
。
YIELD [DISTINCT] <return_list>
:定义需要返回的输出。<return_list>
建议使用 Schema 函数,当前支持src(edge)
、dst(edge)
、type(edge)
等,暂不支持嵌套函数。详情参见 YIELD。
SAMPLE <sample_list>
:用于在结果集中取样。详情参见 SAMPLE。
<limit_by_list_clause>
:用于在遍历过程中逐步限制输出数量。详情参见 LIMIT。
GROUP BY
:根据指定属性的值将输出分组。详情参见 GROUP BY。分组后需要再次使用YIELD
定义需要返回的输出。
-
ORDER BY
:指定输出结果的排序规则。详情参见 ORDER BY。Note
没有指定排序规则时,输出结果的顺序不是固定的。
LIMIT [<offset>,] <number_rows>]
:限制输出结果的行数。详情参见 LIMIT。