nebula graph 常用命令(updating)

2023-10-21 04:32

本文主要是介绍nebula graph 常用命令(updating),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 管理Storage主机
  • 空间
  • 创建标签
    • 删除点和边
  • 索引
    • 创建索引
    • 重建索引
    • drop tag
  • 查询
    • match
    • go
    • FETCH
    • LOOKUP
  • 统计

管理Storage主机

从 3.0.0 版本开始,在配置文件中添加的 Storage 主机无法直接读写,配置文件的作用仅仅是将 Storage 主机注册至 Meta 服务中。必须使用ADD
HOSTS 命令后,才能正常读写 Storage 主机。

向集群中增加 Storage 主机。

ADD HOSTS <ip>:<port> [,<ip>:<port> ...];
add hosts 10.199.4.142:9779

请先等待 2 个心跳周期(20 秒),再查看

show hosts

空间

创建空间

create space basketballplayer(
partition_num = 10,
replica_factor = 1,
vid_type = FIXED_STRING(30)
);show spaces;describe space basketballplayer;drop space xxx_space;use basketballplayer;

partition_num 指定图空间的分片数量。建议设置为集群中硬盘数量的 20 倍(HDD 硬盘建议为 2 倍)。例如集群中有 3 个硬盘,建议设置 60 个分片。默认值为 100。

创建标签

create tag player(name string, age int);
create tag team(name string);show tags;describe tag player;create tag proper_free();

语法

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> ] ...]
create edge follow(degree int);
create edge serve(start_year int , end_year int)
create  edge no_proerty()show edges;
describe edge follow;CREATE EDGE IF NOT EXISTS buy(number int);INSERT EDGE follow(degree) VALUES "player101" -> "player100":(95);
INSERT EDGE follow(degree) VALUES "player101" -> "player102":(90);
INSERT EDGE follow(degree) VALUES "player102" -> "player100":(75);
INSERT EDGE serve(start_year, end_year) VALUES "player101" -> "team204":(1999, 2018),"player102" -> "team203":(2006, 2015);fetch prop on follow player101 -> player102, player102 -> player103;

如果在两点之前插入多条同类型表,可以使用ranking参数

# 插入100 到101 rank为1的表
insert edge follow(degree) values 100 -> 101@1:(80)# 查找100 到101 rank为1的表
fetch prop on follow 100 -> 101@1

语法

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

vid 是 Vertex ID 的缩写, vid 在一个图空间中是唯一的

INSERT VERTEX player(name, age) VALUES "player100":("Tim Duncan", 42);
INSERT VERTEX player(name, age) VALUES "player101":("Tony Parker", 36);
INSERT VERTEX player(name, age) VALUES "player102":("LaMarcus Aldridge", 33);
INSERT VERTEX team(name) VALUES "team203":("Trail Blazers"), "team204":("Spurs");

多标签插入

create tag test1(name string);
create tag test2(age int);insert vertex test1(name), test2(age) values 199:("Multitags",33);insert vertex tag1(),tag2() values "m1":(),"m1":()fetch prop on test1 199;
fetch prop on  test2 199;

查看插入结果

fetch prop on player player100;fetch prop on player player100, player101, player103;

修改点和边
用户可以使用UPDATE 语句或UPSERT 语句修改现有数据。
UPSERT 是UPDATE 和INSERT 的结合体。当使用UPSERT 更新一个点或边,如果它不存在,数据库会自动插入一个新的点或边。

每个 partition 内部, UPSERT 操作是一个串行操作,所以执行速度比执行 INSERT 或 UPDATE 慢很多。其仅在多个 partition 之间有并发。

UPDATE 点

UPDATE VERTEX <vid> SET <properties to be updated>
[WHEN <condition>] [YIELD <columns>];

UPDATE 边

UPDATE EDGE <source vid> -> <destination vid> [@rank] OF <edge_type>
SET <properties to be updated> [WHEN <condition>] [YIELD <columns to be output>];

UPSERT 点或边

UPSERT {VERTEX <vid> | EDGE <edge_type>} SET <update_columns>
[WHEN <condition>] [YIELD <columns>];

用UPDATE 修改 VID 为player100 的球员的name 属性,然后用FETCH 语句检查结果。

nebula> UPDATE VERTEX "player100" SET player.name = "Tim";
nebula> FETCH PROP ON player "player100" YIELD properties(vertex);
+------------------------+
| properties(VERTEX) |
+------------------------+
| {age: 42, name: "Tim"} |
+------------------------+

用UPDATE 修改某条边的degree 属性,然后用FETCH 检查结果。

nebula> UPDATE EDGE "player101" -> "player100" OF follow SET degree = 96;
nebula> FETCH PROP ON follow "player101" -> "player100" YIELD properties(edge);
+------------------+
| properties(EDGE) |
+------------------+
| {degree: 96} |
+------------------+

用INSERT 插入一个 VID 为player111 的点,然后用UPSERT 更新它。

nebula> INSERT VERTEX player(name,age) VALUES "player111":("David West", 38);
nebula> UPSERT VERTEX "player111" SET player.name = "David", player.age = $^.player.age + 11 \
WHEN $^.player.name == "David West" AND $^.player.age > 20 \
YIELD $^.player.name AS Name, $^.player.age AS Age;
+---------+-----+
| Name | Age |
+---------+-----+
| "David" | 49 |
+---------+-----+

删除点和边

删除点

DELETE VERTEX <vid1>[, <vid2>...]
nebula> DELETE VERTEX "player111", "team203";

删除边

DELETE EDGE <edge_type> <src_vid> -> <dst_vid>[@<rank>]
[, <src_vid> -> <dst_vid>...]
nebula> DELETE EDGE follow "player101" -> "team204";

索引

用户可以通过 CREATE INDEX 语句为 Tag 和 Edge type 增加索引。

MATCH 和LOOKUP 语句的执行都依赖索引,但是索引会导致写性能大幅降低(降低 90%甚至更多)。请不要随意在生产环境中使用索引,除非很清楚使用索引
对业务的影响。

必须为“已写入但未构建索引”的数据重建索引,否则无法在MATCH 和LOOKUP 语句中返回这些数据。参见重建索引。

创建索引

CREATE {TAG | EDGE} INDEX [IF NOT EXISTS] <index_name>
ON {<tag_name> | <edge_name>} ([<prop_name_list>]) [COMMENT = '<comment>'];

在这里插入图片描述

# 为变长字符串属性创建索引时,必须用 prop_name(length) 指定索引长度;
# 为 Tag 或 Edge type 本身创建索引时,忽略 <prop_name_list> 。
create edge index serve_index_0 on serve(start_year);rebuild edge index serve_index_0;

重建索引

REBUILD {TAG | EDGE} INDEX <index_name>;

为没有指定长度的变量属性创建索引时,需要指定索引长度。在 utf-8 编码中,一个中文字符占 3 字节,请根据变量属性长度设置合适的索引长度。例如
10 个中文字符,索引长度需要为 30。详情请参见创建索引。

基于索引的LOOKUP 和MATCH 示例
确保LOOKUP 或MATCH 有一个索引可用。如果没有,请先创建索引。
找到 Tag 为player 的点的信息,它的name 属性值为Tony Parker 。

// 为 name 属性创建索引 player_index_1。
nebula> CREATE TAG INDEX IF NOT EXISTS player_index_1 ON player(name(20));
// 重建索引确保能对已存在数据生效。
nebula> REBUILD TAG INDEX player_index_1
+------------+
| New Job Id |
+------------+
| 31 |
+------------+
// 使用 LOOKUP 语句检索点的属性。
nebula> LOOKUP ON player WHERE player.name == "Tony Parker" \
YIELD properties(vertex).name AS name, properties(vertex).age AS age;
+---------------+-----+
| name | age |
+---------------+-----+
| "Tony Parker" | 36 |
+---------------+-----+
// 使用 MATCH 语句检索点的属性。
nebula> MATCH (v:player{name:"Tony Parker"}) RETURN v;
+-----------------------------------------------------+
| v |
+-----------------------------------------------------+
| ("player101" :player{age: 36, name: "Tony Parker"}) |
+-----------------------------------------------------+

drop tag

drop tag member
-1005:Conflict!

一旦标签创建了index直接删除标签就会出现如上错误

# 如果记不清楚具体是什么时可以用
show tag indexes;

在这里插入图片描述

DROP {TAG | EDGE} INDEX [IF EXISTS] <index_name>;
DROP TAG  INDEX member_index_0;
DROP TAG  member;

查询

go from "player100" over follow;

match

语句是查询图数据最常用的,可以灵活的描述各种图模式,但是它依赖索引去匹配 Nebula Graph 中的数据模型,性能也还需要调

语法

MATCH <pattern> [<clause_1>] RETURN <output> [<clause_2>];
match (u:player) return u limit 11;match (e:member:tag2) -->(s1:store) where s1.store.id=="s2" return e,s1 limit 111

go

语句可以根据指定的条件遍历数据库。GO 语句从一个或多个点开始,沿着一条或多条边遍历,返回YIELD 子句中指定的信息

语法

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

从vid 为player_100 开始,遍历所有被vid关注的点

go from player_100 over follow;

返回vid 为player_100 关注并且球员年龄大于35

go from 100 over follow where $$.player.age > 35 yield $$.player.name as teammate, $$player.age as Age;

返回vid 为player_100 所效忠的球队

go from 100 over follow yield follow._dst as id | 
go from $-.id over serve yield $$.team.name as Team, $^.player.name as Player;# 方法2^
$var=go from 100 over follow yield follow._dst as id;
go from $var.id over serve yield $$.team.name as Team, $^.player.name as Player;
# 从 VID 为Aemon-Targaryen-(Dragonknight)开始,沿着边relation  找到连接的人
go from "Aemon-Targaryen-(Dragonknight)" over relation yield id($$);# 从 VID 为player101 的球员开始,沿着边follow 查找年龄大于或等于 35 岁的球员,并返回他们的姓名和年龄,同时重命名对应的列
GO FROM "player101" OVER follow WHERE properties($$).age >= 35 
YIELD properties($$).name AS Teammate, properties($$).age AS Age;

在这里插入图片描述

从 VID 为player101 的球员开始,沿着边follow 查找连接的球员,然后检索这些球员的球队。为了合并这两个查询请求,可以使用管道符或临时变
量。

使用管道符

nebula> GO FROM "player101" OVER follow YIELD dst(edge) AS id | \
GO FROM $-.id OVER serve YIELD properties($$).name AS Team, \
properties($^).name AS Player;
+-----------------+---------------------+
| Team 			| Player 						|
+-----------------+---------------------+
| "Spurs" 		| "Tim Duncan" 				|
| "Trail Blazers" | "LaMarcus Aldridge" |
| "Spurs" 		| "LaMarcus Aldridge" 		|
| "Spurs" 		| "Manu Ginobili" 			|
+-----------------+---------------------+

在这里插入图片描述

使用临时变量

当复合语句作为一个整体提交给服务器时,其中的临时变量会在语句结束时被释放。

nebula> $var = GO FROM "player101" OVER follow YIELD dst(edge) AS id; \
GO FROM $var.id OVER serve YIELD properties($$).name AS Team, \
properties($^).name AS Player;
+-----------------+---------------------+
| Team | Player |
+-----------------+---------------------+
| "Spurs" | "Tim Duncan" |
| "Trail Blazers" | "LaMarcus Aldridge" |
| "Spurs" | "LaMarcus Aldridge" |
| "Spurs" | "Manu Ginobili" |
+-----------------+---------------------+

FETCH

可以获得点或边的属性

查询 Tag 属性

语法

FETCH PROP ON {<tag_name>[, tag_name ...] | *}
<vid> [, vid ...]
YIELD <return_list> [AS <alias>];

查询边属性
语法

FETCH PROP ON <edge_type> <src_vid> -> <dst_vid>[@<rank>] [, <src_vid> -> <dst_vid> ...]
YIELD <output>;

LOOKUP

是基于索引的,和WHERE 子句一起使用,查找符合特定条件的数据。

LOOKUP ON {<vertex_tag> | <edge_type>}
[WHERE <expression> [AND <expression> ...]]
YIELD <return_list> [AS <alias>];
<return_list>
<prop_name> [AS <col_alias>] [, <prop_name> [AS <prop_alias>] ...];

统计

submit job stats;
show job 248show stats;
match (e:member) with e limit 10000000 return count(*)

这篇关于nebula graph 常用命令(updating)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/251966

相关文章

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

linux运维排查常用命令(开发专享)

cd: 进入到某个目录下 cd hikvision ll:详细展示该目录下有的文件 ll su 用户名:切换用户名 例子: su root 根据字符串在文件中查找信息:Grep –a –i 字符串 文件名 例子: grep -a -i 'indexCode=4a28a0dfe0244c0cbabcd9b2c3b60327' nms.nmsweb.debug.log cat 文

Linux概述、远程连接、常用命令

Linux介绍 Linux操作系统介绍 Linux操作系统的特点 开源免费安全稳定可移植性好 Linux可以安装在不同的设备上 高性能 Linux的使用领域 应用服务器数据库服务器网络服务器虚拟化云计算嵌入式领域个人PC移动手机 Linux文件系统和目录 /:根目录,唯一/home:用户目录/root:系统管理员root目录/usr:应用程序/etc:系统配置boot:内核文件/tm

maven学习笔记【常用命令】

mvn构建web项目 mvn archetype:create -DgroupId=com.mycompany.webapp -DartifactId=myweb -DarchetypeArtifactId=maven-archetype-webapp mvn依赖管理 例:加入servlet-api.jar   <dependency>       <groupId>javax.servl

A Comprehensive Survey on Graph Neural Networks笔记

一、摘要-Abstract 1、传统的深度学习模型主要处理欧几里得数据(如图像、文本),而图神经网络的出现和发展是为了有效处理和学习非欧几里得域(即图结构数据)的信息。 2、将GNN划分为四类:recurrent GNNs(RecGNN), convolutional GNNs,(GCN), graph autoencoders(GAE), and spatial–temporal GNNs(S

cmd 常用命令总结

尽管图形用户界面已成为常态,但命令行工具仍然在许多场景下不可或缺。下面是 Windows 命令提示符(CMD)中的一些常用命令及其用法。 1. 导航命令 cd:改变当前工作目录。 cd /?:获取 cd 命令的帮助信息。 cd \:回到当前驱动器的根目录。 cd ..:返回上一级目录。 cd /d E:\software:切换到另一个驱动器并进入指定的目录。 D::切换到 D 驱动器

Neighborhood Homophily-based Graph Convolutional Network

#paper/ccfB 推荐指数: #paper/⭐ #pp/图结构学习 流程 重定义同配性指标: N H i k = ∣ N ( i , k , c m a x ) ∣ ∣ N ( i , k ) ∣ with c m a x = arg ⁡ max ⁡ c ∈ [ 1 , C ] ∣ N ( i , k , c ) ∣ NH_i^k=\frac{|\mathcal{N}(i,k,c_{