NebulaGraph入门

感谢阅读

  • 官方文档链接
  • NebulaGraph简介
  • nGQL
    • nGQL简介
    • 占位标识符和占位符值¶
    • 注释实列
    • 大小写区分
    • 关键字
  • 基本概念以及相关代码实现
    • 补充说明
    • 图空间语法以及列子
      • 创建
      • 克隆
      • 官方示例代码(创建并克隆)
      • USE语句指定图空间时
      • 查看所有SPACE
      • SPACE详情
      • CLEAR SPACE
      • 删库跑路(看玩笑的说法)
    • 点语法以及列子
      • 插入点
      • 官方示例代码(重复插入同一个)
      • 删除点
      • 官方删除点的两种示例
      • 更新点
      • 官方示例代码
      • 更新插入操作
      • 如果点存在,且满足WHEN子句的条件,就会修改点的属性值。(官方示例)
    • Tag语法以及列子
      • 创建标签
      • 官方代码(创建标签)
      • 删除当前工作空间内所有点上的指定标签
      • 修改标签属性
      • 显示当前图空间内的所有 Tag 名称
      • 显示指定 Tag 的详细信息
      • 删除指定点上的指定 Tag
      • 增加和删除标签
      • 官方代码(增加删除标签的常用用法)
    • 边以及边类型语法以及列子(官方和论文是分开的,但我认为连一起合理)
      • 创建边
      • 删除当前工作空间内的指定 Edge type
      • 修改 Edge type 的结构
      • 官方代码(修改边)
      • 展示全部边
      • Edge type 的详细信息
      • 插入边
      • 官方示例代码
      • 删除边
      • 如果不指定 rank,则仅仅删除 rank 为 0 的边。需要删除所有的 rank,见如下示例。
      • 官方代码(管道删除)
      • 修改边上 Edge type 的属性
      • 官方更新点代码
      • UPSERT EDGE
  • 路径

官方文档链接

点我跳转
本文结合国内外论文和官方链接,根据自己的理解进行整理和排序。

NebulaGraph简介

NebulaGraph 是一款开源的、分布式的、易扩展的原生图数据库,能够承载包含数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。

nGQL

nGQL简介

nGQL是 NebulaGraph 使用的的声明式图查询语言,支持灵活高效的图模式,而且 nGQL 是为开发和运维人员设计的类 SQL 查询语言,易于学习。

占位标识符和占位符值¶

NebulaGraph 查询语言 nGQL 参照以下标准设计:
(Draft) ISO/IEC JTC1 N14279 SC 32 - Database_Languages - GQL
(Draft) ISO/IEC JTC1 SC32 N3228 - SQL_Property_Graph_Queries - SQLPGQ
OpenCypher 9
在模板代码中,任何非关键字、字面值或标点符号的标记都是占位符标识符或占位符值。
在这里插入图片描述

注释实列

nebula> RETURN 1+1;     # 这条注释延续到行尾。
nebula> RETURN 1+1;     // 这条注释延续到行尾。
nebula> RETURN 1 /* 这是一条行内注释 */ + 1 == 2;
nebula> RETURN 11 +            \
/* 多行注释       \
用反斜线来换行。   \
*/ 12;

openCypher 兼容性¶
在 nGQL 中,用户必须在行末使用反斜线(\)来换行,即使是在使用/* */符号的多行注释内。
在 openCypher 中不需要使用反斜线换行。

/* openCypher 风格:
这条注释
延续了不止
一行 */
MATCH (n:label)
RETURN n;
/* 原生 nGQL 风格:  \
这条注释       \
延续了不止     \
一行 */       \
MATCH (n:tag) \
RETURN n;

大小写区分

标识符区分大小写
关键字不区分大小写
函数不区分大小写

关键字

关键字是 nGQL 中具有特殊含义的词,例如CREATE TAG语句中的CREATE和TAG。需要经过特殊处理才能作为标识符使用的关键字被称为保留关键字,而能够直接作为标识符使用的这部分关键字被称为非保留关键字。
不建议在创建 Schema 时使用关键字。如果必须使用关键字需要遵循一定规则(为了防止意外,不介绍了)

基本概念以及相关代码实现

图(Graph):
图是由节点和边组成的数据结构,用于展示实体之间的关系。图可以划分为多个子图(Graph Space),每个子图都包含一组相关的节点和边。每个子图都可以有不同的模式、数据和配置。
点(Vertex):
点代表图中的实体,可以带有各种属性。在 Nebula 中,每个点都有一个唯一的标识符,称为 Vertex ID。点用于表达现实世界中的实体。
标签(Tag):
标签是一组相同类型的点的集合,用于对点进行分类或分组。每个标签都有一个名称,点可以分配给一个或多个标签。标签在数据模型中提供更好的组织和查询能力。
边(Edge):
边表示图中的关联,将两个点连接起来。每个边都有一个起始节点和一个结束节点,以及一个唯一的标识符,称为 Edge ID。边用于描述实体之间的联系。
边类型(Edge Type):
边类型用于区分不同类型的边。每条边都属于一个类型,类型可用于定义边的含义和语义。例如,可以使用不同类型来表示不同种类的关系。
属性(Property):
属性是与点和边相关的数据。每个点和边都可以拥有零个或多个属性,用于描述它们的特征、信息或状态。例如,人的点可以有姓名、年龄、性别等属性。

补充说明

1.Tag 和 Edge type 的作用,类似于关系型数据库中“点表”和“边表”的表结构。
2.Rank 可以用来区分 Edge type、起始点、目的点都相同的边。该值完全由用户自己指定。读取时必须自行取得全部的 Rank 值后排序过滤和拼接。不支持诸如next(), pre(), head(), tail(), max(), min(), lessThan(), moreThan()等函数功能,也不能通过创建索引加速访问或者条件过滤。
3.NebulaGraph 中没有无向边,只支持有向边。
4.NebulaGraph 3.6.0 的数据模型中,允许存在"悬挂边",因此在增删时,用户需自行保证“一条边所对应的起点和终点”的存在性。
5.不支持 openCypher 中的 MERGE 语句。

图空间语法以及列子

图空间是 NebulaGraph 中彼此隔离的图数据集合,与 MySQL 中的 database 概念类似。CREATE SPACE语句可以创建一个新的图空间,或者克隆现有图空间的 Schema。

创建

只有 God 角色的用户可以执行CREATE SPACE语句

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>'];

在这里插入图片描述
2.5.0 之前的 2.x 版本中,vid_type不是必选参数,默认为FIXED_STRING(8)。

克隆

CREATE SPACE [IF NOT EXISTS] <new_graph_space_name> AS <old_graph_space_name>;

官方示例代码(创建并克隆)

# 仅指定 VID 类型,其他选项使用默认值。
nebula> CREATE SPACE IF NOT EXISTS my_space_1 (vid_type=FIXED_STRING(30));# 指定分片数量、副本数量和 VID 类型。
nebula> CREATE SPACE IF NOT EXISTS my_space_2 (partition_num=15, replica_factor=1, vid_type=FIXED_STRING(30));# 指定分片数量、副本数量和 VID 类型,并添加描述。
nebula> CREATE SPACE IF NOT EXISTS my_space_3 (partition_num=15, replica_factor=1, vid_type=FIXED_STRING(30)) comment="测试图空间";# 克隆图空间。
nebula> CREATE SPACE IF NOT EXISTS my_space_4 as my_space_3;
nebula> SHOW CREATE SPACE my_space_4;
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Space        | Create Space                                                                                                                                                 |
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| "my_space_4" | "CREATE SPACE `my_space_4` (partition_num = 15, replica_factor = 1, charset = utf8, collate = utf8_bin, vid_type = FIXED_STRING(30)) comment = '测试图空间'" |
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+

USE语句指定图空间时

USE <graph_space_name>;

执行USE语句指定图空间时,需要当前登录的用户拥有指定图空间的权限,否则会报错。

查看所有SPACE

SHOW SPACES语句可以列出 NebulaGraph 示例中的所有图空间。

SPACE详情

DESCRIBE SPACE语句可以显示指定图空间的信息。

CLEAR SPACE

CLEAR SPACE语句用于清空图空间中的点和边,但不会删除图空间本身以及其中的 Schema 信息。只有 God 角色的用户可以执行CLEAR SPACE语句。

CLEAR SPACE [IF EXISTS] <space_name>;

注意事项¶
数据清除后,如无备份,无法恢复。使用该功能务必谨慎。
CLEAR SPACE不是原子性操作。如果执行出错,请重新执行,避免残留数据。
图空间中的数据量越大,CLEAR SPACE消耗的时间越长。如果CLEAR SPACE的执行因客户端连接超时而失败,可以增大 Graph 服务配置中storage_client_timeout_ms参数的值。
在CLEAR SPACE的执行过程中,向该图空间写入数据的行为不会被自动禁止。这样的写入行为可能导致CLEAR SPACE清除数据不完全,残留的数据也可能受到损坏。
图空间中,CLEAR SPACE不会删除的数据包括:
Tag 信息。
Edge type 信息。
原生索引和全文索引的元数据。

删库跑路(看玩笑的说法)

DROP SPACE语句用于删除指定图空间以及其中的所有信息。只有 God 角色的用户可以执行DROP SPACE语句。

DROP SPACE [IF EXISTS] <graph_space_name>;

点语法以及列子

插入点

执行INSERT VERTEX语句需要当前登录的用户拥有指定图空间的插入点权限,否则会报错。

INSERT VERTEX [IF NOT EXISTS] [tag_props, [tag_props] ...]
VALUES VID: ([prop_value_list])tag_props:tag_name ([prop_name_list])prop_name_list:[prop_name [, prop_name] ...]prop_value_list:[prop_value [, prop_value] ...]   

参数解释:

IF NOT EXISTS:检测待插入的 VID 是否存在,只有不存在时,才会插入,如果已经存在,不会进行修改。NoteIF NOT EXISTS 仅检测 VID + Tag 的值是否相同,不会检测属性值。
IF NOT EXISTS 会先读取一次数据是否存在,因此对性能会有明显影响。
tag_name:点关联的 Tag(点类型)。Tag 的创建,详情请参见 CREATE TAG。CautionNebulaGraph 3.6.0 中默认不支持插入无 Tag 的点。如需使用无 Tag 的点,在集群内所有 Graph 服务的配置文件(nebula-graphd.conf)中新增--graph_use_vertex_key=true;在所有 Storage 服务的配置文件(nebula-storaged.conf)中新增--use_vertex_key=true。插入无 Tag 点的命令示例如INSERT VERTEX VALUES "1":();。property_name:需要设置的属性名称。
vid:点 ID。在 NebulaGraph 3.6.0 中支持字符串和整数,需要在创建图空间时设置,详情请参见 CREATE SPACE。
property_value:根据prop_name_list填写属性值。如果没有填写属性值,而 Tag 中对应的属性设置为NOT NULL,会返回错误。

官方示例代码(重复插入同一个)

# 多次插入属性值。
nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n2", 13);
nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n3", 14);
nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n4", 15);
nebula> FETCH PROP ON t2 "11" YIELD properties(vertex);
+-----------------------+
| properties(VERTEX)    |
+-----------------------+
| {age: 15, name: "n4"} |
+-----------------------+

删除点

DELETE VERTEX语句可以删除点,但是默认不删除该点关联的出边和入边。

DELETE VERTEX <vid> [ , <vid> ... ] [WITH EDGE];

WITH EDGE: 删除该点关联的出边和入边。

官方删除点的两种示例

# 删除 VID 为 `team1` 的点,不删除该点关联的出边和入边。
nebula> DELETE VERTEX "team1";# 删除 VID 为 `team1` 的点,并删除该点关联的出边和入边。
nebula> DELETE VERTEX "team1" WITH EDGE;
# 结合管道符,删除符合条件的点。
nebula> GO FROM "player100" OVER serve WHERE properties(edge).start_year == "2021" YIELD dst(edge) AS id | DELETE VERTEX $-.id;

更新点

一次只能修改一个 Tag。UPDATE VERTEX语句可以修改点上 Tag 的属性值。

UPDATE VERTEX ON <tag_name> <vid>
SET <update_prop>
[WHEN <condition>]
[YIELD <output>]

在这里插入图片描述

官方示例代码

// 查看点”player101“的属性。
nebula> FETCH PROP ON player "player101" YIELD properties(vertex);
+--------------------------------+
| properties(VERTEX)             |
+--------------------------------+
| {age: 36, name: "Tony Parker"} |
+--------------------------------+// 修改属性 age 的值,并返回 name 和新的 age。
nebula> UPDATE VERTEX ON player "player101" \SET age = age + 2 \WHEN name == "Tony Parker" \YIELD name AS Name, age AS Age;
+---------------+-----+
| Name          | Age |
+---------------+-----+
| "Tony Parker" | 38  |
+---------------+-----+

更新插入操作

UPSERT VERTEX语句结合UPDATE和INSERT,如果点存在,会修改点的属性值;如果点不存在,会插入新的点。UPSERT VERTEX一次只能修改一个 Tag。
UPSERT VERTEX性能远低于INSERT,因为UPSERT是一组分片级别的读取、修改、写入操作。

如果点存在,且满足WHEN子句的条件,就会修改点的属性值。(官方示例)

nebula> FETCH PROP ON player "player101" YIELD properties(vertex);
+--------------------------------+
| properties(VERTEX)             |
+--------------------------------+
| {age: 36, name: "Tony Parker"} |
+--------------------------------+nebula> UPSERT VERTEX ON player "player101" \SET age = age + 2 \WHEN name == "Tony Parker" \YIELD name AS Name, age AS Age;
+---------------+-----+
| Name          | Age |
+---------------+-----+
| "Tony Parker" | 38  |
+---------------+-----+

Tag语法以及列子

创建标签

CREATE TAG语句可以通过指定名称创建一个 Tag。执行CREATE TAG语句需要当前登录的用户拥有指定图空间的创建 Tag 权限,否则会报错。创建 Tag 前,需要先用USE语句指定工作空间。
openCypher 中的 Label 需要在CREATE语句中与点一起创建。
nGQL 中的 Tag 需要使用CREATE TAG语句独立创建。Tag 更像是 MySQL 中的表。

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>'];

在这里插入图片描述

官方代码(创建标签)

nebula> CREATE TAG IF NOT EXISTS player(name string, age int);# 创建没有属性的 Tag。
nebula> CREATE TAG IF NOT EXISTS no_property(); # 创建包含默认值的 Tag。
nebula> CREATE TAG IF NOT EXISTS player_with_default(name string, age int DEFAULT 20);# 对字段 create_time 设置 TTL 为 100 秒。
nebula> CREATE TAG IF NOT EXISTS woman(name string, age int, \married bool, salary double, create_time timestamp) \TTL_DURATION = 100, TTL_COL = "create_time";

删除当前工作空间内所有点上的指定标签

点可以有一个或多个 Tag。
如果某个点只有一个 Tag,删除这个 Tag 后,用户就无法访问这个点,下次 Compaction 操作时会删除该点,但与该点相邻的边仍然存在——这会造成悬挂边。
如果某个点有多个 Tag,删除其中一个 Tag,仍然可以访问这个点,但是无法访问已删除 Tag 所定义的所有属性。
删除 Tag 操作仅删除 Schema 数据,硬盘上的文件或目录不会立刻删除,而是在下一次 Compaction 操作时删除。
确保要修改的属性不包含索引,否则ALTER TAG时会报冲突错误[ERROR (-1005)]: Conflict!。(根据我的理解,这里的修改属性操作包括索引)
确保新增的属性名不与已存在或被删除的属性名同名,否则新增属性会失败。

DROP TAG [IF EXISTS] <tag_name>;

修改标签属性

ALTER TAG语句可以修改 Tag 的结构。例如增删属性、修改数据类型,也可以为属性设置、修改 TTL(Time-To-Live)

ALTER TAG <tag_name><alter_definition> [[, alter_definition] ...][ttl_definition [, ttl_definition] ... ][COMMENT = '<comment>'];alter_definition:
| ADD    (prop_name data_type [NULL | NOT NULL] [DEFAULT <default_value>] [COMMENT '<comment>'])
| DROP   (prop_name)
| CHANGE (prop_name data_type [NULL | NOT NULL] [DEFAULT <default_value>] [COMMENT '<comment>'])ttl_definition:TTL_DURATION = ttl_duration, TTL_COL = prop_name

在这里插入图片描述
官方示例代码

nebula> CREATE TAG IF NOT EXISTS t1 (p1 string, p2 int);
nebula> ALTER TAG t1 ADD (p3 int32, p4 fixed_string(10));
nebula> ALTER TAG t1 TTL_DURATION = 2, TTL_COL = "p2";
nebula> ALTER TAG t1 COMMENT = 'test1';
nebula> ALTER TAG t1 ADD (p5 double NOT NULL DEFAULT 0.4 COMMENT 'p5') COMMENT='test2';
// 将 TAG t1 的 p3 属性类型从 INT32 改为 INT64,p4 属性类型从 FIXED_STRING(10) 改为 STRING。
nebula> ALTER TAG t1 CHANGE (p3 int64, p4 string);

显示当前图空间内的所有 Tag 名称

SHOW TAGS;

显示指定 Tag 的详细信息

DESC[RIBE] TAG <tag_name>;

删除指定点上的指定 Tag

DELETE TAG <tag_name_list> FROM <VID_list>;

tag_name_list:指定 Tag 名称。多个 Tag 用英文逗号(,)分隔,也可以用*表示所有 Tag。
VID_list:指定要删除 Tag 的点 ID。可以指定多个 VID,用英文逗号(,)分隔。

增加和删除标签

在 openCypher 中,有增加标签(SET label)和移除标签(REMOVE label)的功能,可以用于加速查询或者标记过程。
在 NebulaGraph 中,可以通过 Tag 变相实现相同操作,创建 Tag 并将 Tag 插入到已有的点上,就可以根据 Tag 名称快速查找点,也可以通过DELETE TAG删除某些点上不再需要的 Tag。

官方代码(增加删除标签的常用用法)

//创建股东 Tag 和索引
nebula> CREATE TAG IF NOT EXISTS shareholder();
nebula> CREATE TAG INDEX IF NOT EXISTS shareholder_tag on shareholder();//为点添加 Tag
nebula> INSERT VERTEX shareholder() VALUES "player100":();
nebula> INSERT VERTEX shareholder() VALUES "player101":();//快速查询所有股东
nebula> MATCH (v:shareholder) RETURN v;
+---------------------------------------------------------------------+
| v                                                                   |
+---------------------------------------------------------------------+
| ("player100" :player{age: 42, name: "Tim Duncan"} :shareholder{})  |
| ("player101" :player{age: 36, name: "Tony Parker"} :shareholder{}) |
+---------------------------------------------------------------------+
nebula> LOOKUP ON shareholder YIELD id(vertex);
+-------------+
| id(VERTEX)  |
+-------------+
| "player100" |
| "player101" |
+-------------+//如果 player100 不再是股东
nebula> DELETE TAG shareholder FROM "player100";
nebula> LOOKUP ON shareholder YIELD id(vertex);
+-------------+
| id(VERTEX)  |
+-------------+
| "player101" |
+-------------+

边以及边类型语法以及列子(官方和论文是分开的,但我认为连一起合理)

创建边

CREATE EDGE语句可以通过指定名称创建一个 Edge type。
OpenCypher 兼容性¶
nGQL 中的 Edge type 和 openCypher 中的关系类型相似,但又有所不同,例如它们的创建方式。
openCypher 中的关系类型需要在CREATE语句中与点一起创建。
nGQL 中的 Edge type 需要使用CREATE EDGE语句独立创建。Edge type 更像是 MySQL 中的表。

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>'];

在这里插入图片描述

删除当前工作空间内的指定 Edge type

DROP EDGE [IF EXISTS] <edge_type_name>

修改 Edge type 的结构

ALTER EDGE语句可以修改 Edge type 的结构。例如增删属性、修改数据类型,也可以为属性设置、修改 TTL(Time-To-Live)。
注意事项¶
登录的用户必须拥有对应权限才能执行ALTER EDGE语句。详情请参见内置角色权限。
确保要修改的属性不包含索引,否则ALTER EDGE时会报冲突错误[ERROR (-1005)]: Conflict!。
确保新增的属性名不与已存在或被删除的属性名同名,否则新增属性会失败。
允许增加FIXED_STRING和INT类型的长度。
允许FIXED_STRING类型转换为STRING类型、FLOAT类型转换为DOUBLE类型。

ALTER EDGE <edge_type_name><alter_definition> [, alter_definition] ...][ttl_definition [, ttl_definition] ... ][COMMENT = '<comment>'];alter_definition:
| ADD    (prop_name data_type)
| DROP   (prop_name)
| CHANGE (prop_name data_type)ttl_definition:TTL_DURATION = ttl_duration, TTL_COL = prop_name

edge_type_name:指定要修改的 Edge type 名称。一次只能修改一个 Edge type。请确保要修改的 Edge type 在当前工作空间中存在,否则会报错。
可以在一个ALTER EDGE语句中使用多个ADD、DROP和CHANGE子句,子句之间用英文逗号(,)分隔。
当使用ADD或CHANGE指定属性值为NOT NULL时,必需为该属性指定默认值,即定义DEFAULT的值。

官方代码(修改边)

nebula> CREATE EDGE IF NOT EXISTS e1(p1 string, p2 int);
nebula> ALTER EDGE e1 ADD (p3 int, p4 string);
nebula> ALTER EDGE e1 TTL_DURATION = 2, TTL_COL = "p2";
nebula> ALTER EDGE e1 COMMENT = 'edge1';

展示全部边

SHOW EDGES;

Edge type 的详细信息

DESC[RIBE] EDGE <edge_type_name>

插入边

INSERT EDGE语句可以在 NebulaGraph 实例的指定图空间中插入一条或多条边。边是有方向的,从起始点(src_vid)到目的点(dst_vid)。
INSERT EDGE的执行方式为覆盖式插入。如果已有 Edge type、起点、终点、rank 都相同的边,则覆盖原边。

INSERT EDGE [IF NOT EXISTS] <edge_type> ( <prop_name_list> ) VALUES 
<src_vid> -> <dst_vid>[@<rank>] : ( <prop_value_list> )
[, <src_vid> -> <dst_vid>[@<rank>] : ( <prop_value_list> ), ...];<prop_name_list> ::=[ <prop_name> [, <prop_name> ] ...]<prop_value_list> ::=[ <prop_value> [, <prop_value> ] ...]

在这里插入图片描述

官方示例代码

nebula> CREATE EDGE IF NOT EXISTS e2 (name string, age int); 
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", 1);# 一次插入 2 条边。
nebula> INSERT EDGE e2 (name, age) VALUES \"12"->"13":("n1", 1), "13"->"14":("n2", 2); # 创建失败,因为"a13"不是 int 类型。
nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", "a13");

删除边

DELETE EDGE <edge_type> <src_vid> -> <dst_vid>[@<rank>] [, <src_vid> -> <dst_vid>[@<rank>] ...]

如果不指定 rank,则仅仅删除 rank 为 0 的边。需要删除所有的 rank,见如下示例。

nebula> DELETE EDGE serve "player100" -> "team204"@0;

官方代码(管道删除)

# 结合管道符,删除两点之间同类型的所有rank的边。
nebula> GO FROM "player100" OVER follow \WHERE dst(edge) == "player101" \YIELD src(edge) AS src, dst(edge) AS dst, rank(edge) AS rank \| DELETE EDGE follow $-.src -> $-.dst @ $-.rank;

修改边上 Edge type 的属性

UPDATE EDGE ON <edge_type>
<src_vid> -> <dst_vid> [@<rank>]
SET <update_prop>
[WHEN <condition>]
[YIELD <output>]

在这里插入图片描述

官方更新点代码

// 用 GO 语句查看边的属性值。
nebula> GO FROM "player100" \OVER serve \YIELD properties(edge).start_year, properties(edge).end_year;
+-----------------------------+---------------------------+
| properties(EDGE).start_year | properties(EDGE).end_year |
+-----------------------------+---------------------------+
| 1997                        | 2016                      |
+-----------------------------+---------------------------+// 修改属性 start_year 的值,并返回 end_year 和新的 start_year。nebula> UPDATE EDGE ON serve "player100" -> "team204"@0 \SET start_year = start_year + 1 \WHEN end_year > 2010 \YIELD start_year, end_year;
+------------+----------+
| start_year | end_year |
+------------+----------+
| 1998       | 2016     |
+------------+----------+

UPSERT EDGE

UPSERT EDGE语句结合UPDATE和INSERT,如果边存在,会更新边的属性;如果边不存在,会插入新的边。UPSERT EDGE性能远低于INSERT,因为UPSERT是一组分片级别的读取、修改、写入操作。并发UPSERT同一个 TAG 或 EDGE TYPE 会报错。

UPSERT EDGE ON <edge_type>
<src_vid> -> <dst_vid> [@rank]
SET <update_prop>
[WHEN <condition>]
[YIELD <properties>]

在这里插入图片描述

路径

路径类型	说明	重复性
walk	由有限或无限的边序列构成	遍历时点和边可以重复
trail	trail 类型的路径由有限的边序列构成	遍历时只有点可以重复,边不可以重复
cycle	是封闭的 trail 类型的路径	边不可以重复,起点和终点重复,并且没有其他点重复
circuit	是封闭的 trail 类型的路径	边不可以重复,除起点和终点重复外,可能存在其他点重复
path	path 类型的路径由有限的边序列构成	遍历时点和边都不可以重复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/266090.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastAdmin表格列表的功能

更多文章&#xff0c;请关注&#xff1a;fastAdmin后台功能详解 | 夜空中最亮的星 FastAdmin是一款基于ThinkPHP5Bootstrap的极速后台开发框架。优点见开发文档 介绍 - FastAdmin框架文档 - FastAdmin开发文档 在这里上传几张优秀的快速入门图: 一张图解析FastAdmin中的表格列…

idea集成git详解教程(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可&#xff08;NEXT&#xff09; 2.软件测试 在Windows桌面空白处&#xff0c;点击鼠标右键&#xff0c;弹出右键菜单 Git软件安装后&#xff0c;会在右键菜单中增加两个菜单 Git GUI He…

Android Studio level过滤查看各个等级的日志

Android Studio level过滤查看各个等级的日志 旧版as可以在下方的日志输出框选择debug、info&#xff0c;warn、error日志&#xff0c;新版的需要通过在过滤框手动/联想输入 level:xxx&#xff0c;过滤相应等级的日志&#xff0c;如图&#xff1a; android studio/idea返回/前进…

【C语言基础】:深入理解指针(一)

文章目录 一、内存和地址1. 内存2. 如何理解编址 二、指针变量和地址2.1 取地址操作符(&)2.2 指针变量和解引用操作符(*)2.2.1 指针变量2.2.2 如何拆解指针变量2.2.3 解引用操作符 2.3 指针变量的大小 三、指针变量类型的意义3.1 指针的解引用3.2 指针 - 整数3.3 void*指针…

Linux第67步_linux字符设备驱动_注册和注销

1、字符设备注册与注销的函数原型” /*字符设备注册的函数原型*/ static inline int register_chrdev(unsigned int major,\ const char *name, \ const struct file_operations *fops) /* major:主设备号&#xff0c;Limnux下每个设备都有一个设备号&#xff0c;设备号分…

HTTP详解(HTTP的特点,状态码,工作原理,GET和POST的区别,如何解决无状态通信)!!!

文章目录 一、HTTP协议简介二、HTTP的主要特点三、HTTP之URL四、Request和Respons五、HTTP的状态码六、HTTP工作原理七、GET和POST请求的区别八、解决HTTP无状态通信——Cookie和Session 一、HTTP协议简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&…

基础!!!吴恩达deeplearning.ai:卷积层

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 回顾——密集层 Dense Layer卷积层 Convolutional Neural Network定义优势具体说明心电图卷积层搭建 到目前为止&#xff0c;你使用的所有神经网络层都是密集层类型&#xff0c;这…

软件测试有哪些常用的测试方法?

软件测试是软件开发过程中重要组成部分&#xff0c;是用来确认一个程序的质量或者性能是否符合开发之前提出的一些要求。软件测试的目的有两方面&#xff0c;一方面是确认软件的质量&#xff0c;另一方面是提供信息&#xff0c;例如&#xff0c;给开发人员或者程序经理反馈意见…

基于vue-office实现docx、xlsx、pdf文件的在线预览

概述 在做项目的时候会遇到docx、xlsx、pdf等文件的在线预览需求&#xff0c;实现此需求可以有多种解决方式&#xff0c;本文基于vue-office实现纯前端的文件预览。 效果 如下图&#xff0c;分别为docx、xlsx、pdf三种类型的文件在线加载后的效果。你也可以访问官方预览网址…

当Web3叙事寒冬到来,游戏是否是冬日里的“一把火”?

出品&#xff5c;欧科云链研究院 作者&#xff5c;Jason Jiang 以太坊创始人Vitalik在2019年曾说&#xff1a;金融与游戏会是区块链最先落地的场景。 在DeFi金融创新驱动上个周期后&#xff0c;沉寂近两年的Web3游戏板块&#xff0c;如今似乎也在复苏。无论是频繁获得融资&a…

pandas/geopandas 笔记:逐record的轨迹dataFrame转成逐traj_id的轨迹dataFrame

我们现在有这样的一个dataframe&#xff0c;名字为dart 我们需要这样一个DataFrame&#xff0c;每一行有两列&#xff0c;一列是new_installation_id&#xff0c;表示这个轨迹的id&#xff1b;另一列就是这个new_installation_id的轨迹 dart_new dart[[new_installation_id]]…

如何使用Docker部署IT-Tools并结合内网穿透实现公网访问本地工具箱服务

作为程序员&#xff0c;在日常工作中&#xff0c;需要借助一些工具来提高我们工作效率&#xff0c;IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能&#xff0c;使开发者能以更高效方式完成任务。经由IT-Tools&#xff0c;开发人员能轻松应对各类技术挑战&…

基于java SSM springboot动物检疫信息管理系统设计和实现

基于java SSM springboot动物检疫信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末…

代码遗产:探索祖传代码的历史、挑战与现代融合艺术

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

NC65 rest接口 开发 NC65接口开发

一、在对应模块META-INF下编写 xxx.rest 文件,也要放在Home里对应的目录下。 二、开发接口&#xff0c;继承extends AbstractUAPRestResource&#xff0c;&#xff08;有的项目会继承别的方法如&#xff1a;AbstractNCCRestResource&#xff0c;MTFRestResource&#xff1b;有…

adb下载安装及使用教程

adb下载安装及使用教程 一、ADB的介绍1.ADB是什么&#xff1f;2.内容简介3.ADB常用命令1. ADB查看设备2. ADB安装软件3. ADB卸载软件4. ADB登录设备shell5. ADB从电脑上发送文件到设备6. ADB从设备上下载文件到电脑7. ADB显示帮助信息 4.为什么要用ADB 二、ADB的下载1.Windows版…

Vue <component/> 特殊的内置组件使用

在 Vue 中&#xff0c; 是一个特殊的内置组件&#xff0c;它可以根据提供的数据动态地渲染不同的子组件。这个功能非常有用&#xff0c;因为它可以让你在不同的情况下动态地切换和渲染不同的组件。 将is的值绑定为一个变量&#xff0c;is就变成了v-bind:is“变量名”&#xff…

SpringBoot 3 新特性

目录 1. GraalVM1.1 生成本地可执行应用1.2 生成docker镜像 2. 支持虚拟线程2.1 不开启虚拟线程时压测2.2 开启虚拟线程时压测 3. HTTP Interface 1. GraalVM 使用GraalVM将SpringBoot应用程序编译成本地可执行的镜像文件&#xff0c;可以显著提升启动速度、峰值性能以及减少内…

C++ 网络编程学习三

C 网络编程学习三 用智能指针延长session的生命周期处理粘包问题 用智能指针延长session的生命周期 问题&#xff1a; 客户端断开后&#xff1a;会触发服务器对应session的写或读事件&#xff0c;由于是异步编程&#xff0c;需要在回调中对读写事件进行处理。客户端断开&#…

上拉电阻与下拉电阻、电容的作用

上拉电阻与下拉电阻 在单片机电路中&#xff0c;上拉电阻和下拉电阻都是常见的电路元件&#xff0c;它们在数字电路设计中扮演着重要的角色。它们的作用如下&#xff1a; 1. **上拉电阻**&#xff1a; - **作用**&#xff1a;当一个引脚没有外部信号时&#xff0c;上拉电阻…