图数据库nebula——常用的nGQL
目录1、图空间:(1)创建图空间:(2)查看图控件列表:(3)切换图空间:(4)删除图空间:(5)查看分片分布情况:(6)开始分片重新分布:(7)查看分片重新分布状态:(8)停止分片重新分布:2、点:(1)创建点类型:(2)查看所有点类型:(3)查看点类型的属性:(4)删除点类型:(5)插入点:(6)更新点:(7)FETCH查看单个点及属性:(8)FETCH查看多个点即属性:(9)删除点:3、边:
目录
1、图空间:
(1)创建图空间:
执行命令:CREATE SPACE gods(partition_num=15, replica_factor=1, vid_type=fixed_string(30));
partition_num:分片数量,通常为全集群硬盘数量的 5 倍。
replica_factor:副本数量,通常生产环境为 3,测试环境为 1。
vid_type:主键类别
(2)查看图控件列表:
执行命令:SHOW SPACES;
(3)切换图空间:
执行命令:USE gods;
(4)删除图空间:
执行命令:DROP SPACE gods
仅支持有 DROP 权限的用户进行此操作。DROP SPACE 将删除指定 space 内的所有内容,其他 space 不受影响。该语句不会立即删除存储引擎中的所有文件和目录(并释放磁盘空间)。删除操作取决于不同存储引擎的实现。
(5)查看分片分布情况:
执行命令:SHOW HOSTS;
(6)开始分片重新分布:
执行命令:BALANCE DATA;
(7)查看分片重新分布状态:
执行命令:BALANCE DATA <balance_id>
(8)停止分片重新分布:
执行命令:BALANCE DATA STOP
2、点:
(1)创建点类型:
执行命令:CREATE TAG player(name string, age int);
(2)查看所有点类型:
执行命令:SHOW TAGS;
(3)查看点类型的属性:
执行命令:DESCRIBE TAG player;
(4)删除点类型:
执行命令:DROP TAG player
删除标签时Nebula Graph将判断相应标签是否有关联的索引,如果有则拒绝删除。 一个节点可以有一个或多个标签(类型)。删除所有标签后,节点将不可访问,同时与节点连接的边也不可使用。删除单个标签后,节点仍可访问,但是已删除标签的属性不可访问。此操作仅删除 Schema 信息,硬盘中所有文件及目录均未被直接删除,数据会在下次 compaction 时删除。
(5)插入点:
执行命令:INSERT VERTEX player(name, age) VALUES "player100vid":("Tim Duncan", 42);
(6)更新点:
执行命令:UPDATE VERTEX "player100vid" SET player.name = "Tim";
(7)FETCH查看单个点及属性:
执行命令:FETCH PROP ON player "player100vid";
(8)FETCH查看多个点即属性:
执行命令:FETCH PROP ON player "player100vid" union FETCH PROP ON player "player101vid";
说明:就是FETCH查看单个点及属性的nGQL,通过union进行拼接。
(9)删除点:
执行命令:DELETE VERTEX "player100vid", "player101vid"
3、边:
(1)创建边类型:
执行命令:CREATE EDGE follow(degree int);
(2)查询所有边类型:
执行命令:SHOW EDGES;
(3)查看边类型的属性:
执行命令:DESCRIBE EDGE follow;
(4)删除边类型:
执行命令:DROP EDGE follow
删除边时Nebula Graph将判断相应边是否有关联的索引,如果有则拒绝删除。此操作将移除指定类型的所有边。此操作仅删除 Schema 信息,硬盘中所有文件及目录均未被直接删除,数据会在下次 compaction 时删除。
(5)插入边:
执行命令:INSERT EDGE follow(degree) VALUES "player100vid" -> "player101vid":(95);
(6)更新边:
执行命令:UPDATE EDGE "player100" -> "player101" OF follow SET degree = 96;
(7)FETCH查看边及属性:
执行命令:FETCH PROP ON follow "player100" -> "player101";
(8)删除边:
执行命令:DELETE EDGE follow "player100" -> "player101";
4、索引:
Nebula Graph支持两种类型的索引:Tag 索引和Edge Type 索引。多数图查询都从拥有共同属性的同一类型的点或边开始遍历,schema 索引使得这些全局检索操作在大型图上更为高效,但是创建索引会大大降低写数据的效率,这个需要自行考虑决定。
注意:如果创建索引的属性为string,那么需要在属性后边添加一对括号,括号中填写长度。
(1)创建点单属性索引:
执行命令:CREATE TAG INDEX player_index_0 on player(name);
(2)创建点多属性索引:
执行命令:CREATE TAG INDEX player_index_1 on player(name,age);
schema 索引支持为相同 tag 或 edge 中的多个属性同时创建索引,即组合索引,但目前尚不支持跨多个 tag 创建复合索引。
(3)列出点索引:
执行命令:SHOW TAG INDEXES;
(4)查看点索引信息:
执行命令:DESCRIBE TAG INDEX player_index_0;
(5)重构点索引:
执行命令:REBUILD TAG INDEX <index_name> [OFFLINE];
如果创建索引时,数据库里已经存有数据,则不会自动对旧的数据进行索引,此时需要对整个图中与索引相关的数据执行索引重构操作以保证索引包含了之前的数据。若当前数据库没有对外提供服务,则可在索引重构时使用 OFFLINE关键字加快重构速度。
(6)查看重构点索引是否成功:
执行命令:SHOW TAG INDEX STATUS;
(7)删除点索引:
执行命令:DROP TAG INDEX player_index_0;
(8)创建边单属性索引:
执行命令:CREATE EDGE INDEX follow_index_0 on follow(degree);
(9)创建边多属性索引:
执行命令:CREATE EDGE INDEX follow_index_0 on follow(degree,name);
(10)列出边索引:
执行命令:SHOW EDGE INDEXES;
(11)查看边索引信息:
执行命令:DESCRIBE EDGE INDEX follow_index_0;
(12)重构边索引:
执行命令:REBUILD EDGE INDEX <index_name> [OFFLINE];
(13)查看重构边索引是否成功:
执行命令:SHOW EDGE INDEX STATUS;
(14)删除点索引:
执行命令:DROP EDGE INDEX follow_index_0;
5、综合查询:
说明:GO查询不需要创建索引,LOOKUP ON、MATCH等查询需要在nebula中给对应的标签或者边类型创建索引。
(1)GO查询点的某个边的正向:
执行命令:GO FROM "player100vid" OVER follow;
(2)GO查询点的某个边的反向:
执行命令:GO FROM "player100vid" OVER follow REVERSELY;
(3)GO查询点的某个边的所有方向:
执行命令:GO FROM "player100vid" OVER follow BIDIRECT;
(4)GO查询点的某个边并筛选及指定返回属性:
执行命令:GO FROM "player100vid" OVER follow WHERE $$.player.age >= 35 YIELD $$.player.name AS Teammate, $$.player.age AS Age;
(5)GO查询点的某个边的N级:
执行命令:GO N STEPS FROM "player100vid" OVER follow;
(6)GO查询点的某个边的M到N级:
执行命令:GO M TO N STEPS FROM "player100vid" OVER follow;
(7)LOOKUP ON:
注意:使用LOOKUP ON需要对查询的数据所属的标签、边的数据添加索引,如果已经存在数据,那么需要在创建完索引后,对已有的数据进行重构索引。在创建完索引后,再增加的数据会自动添加上索引,需要注意的是:创建索引后,数据导入的速度将会是未添加索引时导入速度的十分之一。
(8)MATCH查询某类实体点的前几个:
执行命令:MATCH (v:person) return v limit 6;
(9)MATCH查询某类实体点包含某个属性的前几个:
执行命令:MATCH (v:person) where exists (v.name) return v limit 6;
(10)MATCH查询点的vid并显示前几个:
执行命令:MATCH (v) WHERE id(v) IN ['15','16'] RETURN v LIMIT 100
(11)MATCH查询某类实体所有关系的前几条:
执行命令:MATCH p=(v:person)-[]-() return p limit 6;
(12)MATCH查询某类实体的某种关系的前几条:
执行命令:MATCH p=(v:person)-[r:like]-() return p limit 6;
(13)MATCH查询点的属性并显示所有关系的前几条:
执行命令:MATCH p=(v:person{name:”Bob”})-[]-() return p limit 6;
(14)MATCH查询起点vid的某种关系的并显示前几条:
执行命令:MATCH p=(v)-[e:friend*1]->(v2) WHERE id(v) IN ["19"] RETURN p LIMIT 100
(15)FIND查询两点之间所有边:
执行命令:FIND ALL PATH FROM "player100" TO "player101" OVER *
(16)管道查询:
执行命令:GO FROM 100 OVER follow YIELD follow._dst AS id | GO FROM $-.id OVER serve YIELD $$.team.name AS Team,$^.player.name AS Player;
查询球员 100 关注的球员所效力的球队。
这里:$^ 表示边的起始点;
| 表示管道;
$- 表示输入流,上一个查询的输出(id)作为下一个查询的输入($-.id);
(17)自定义变量组合查询:
执行命令:$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;
将该语句作为整体提交到nebula服务端后,语句中自定义的变量的生命周期就结束了,也就是说自定义的变量只会在一起提交的这些语句中生效。
6、数据声明周期TTL:
TTL,全称 Time To Live,用来指定数据的生命周期,数据时效到期后这条数据会被自动删除。在图数据库 Nebula Graph 中,我们实现 TTL 功能,用户设置好数据的存活时间后,在预定时间内系统会自动从数据库中删除过期的点或者边。
更多推荐
所有评论(0)