nebula 使用记录

java配置nebula连接代码:

官网地址:https://github.com/vesoft-inc/nebula-java/tree/master

复制代码
NebulaPoolConfig nebulaPoolConfig = new NebulaPoolConfig();
nebulaPoolConfig.setMaxConnSize(10);
List<HostAddress> addresses = Arrays.asList(new HostAddress("127.0.0.1", 9669),
        new HostAddress("127.0.0.1", 9670));
NebulaPool pool = new NebulaPool();
pool.init(addresses, nebulaPoolConfig);
Session session = pool.getSession("root", "nebula", false);
session.execute("SHOW HOSTS;");
session.release();
pool.close();
复制代码

常用查询语句:

1 创建图空间
CREATE SPACE basketballplayer(partition_num=15, replica_factor=1, vid_type=fixed_string(30));
partition_num:分片数量,通常为全集群硬盘数量的 5 倍。
replica_factor:副本数量,通常生产环境为 3,测试环境为 1。
vid_type:主键类别

查看图空间列表: SHOW SPACES;
切换图空间:USE XXX;
删除图空间:DROP SPACE XXX;

2 创建点类型和边类型 ( Tag 和 Edge type):tag是点类型声明,edge是边类型声明,player,team,follow,serve是类型的名字,name,age是属性
CREATE TAG player(name string, age int);
CREATE TAG team(name string);
CREATE EDGE follow(degree int);
CREATE EDGE serve(start_year int, end_year int);

3 插入点
INSERT VERTEX player(name, age) VALUES "player100":("杰克", 42);
INSERT VERTEX player(name, age) VALUES "player101":("汤尼", 36);
INSERT VERTEX player(name, age) VALUES "player102":("尼古拉斯.赵四", 33);
INSERT VERTEX team(name) VALUES "team203":("AC米兰"), "team204":("皇马");
查看点类型: SHOW TAGS;
查看某一类型点的属性; DESCRIBE TAG tagTypeName;
删除点类型:DROP TAG tagTypeName;
删除标签时Nebula Graph将判断相应标签是否有关联的索引,如果有则拒绝删除。 一个节点可以有一个或多个标签(类型)。删除所有标签后,节点将不可访问,同时与节点连接的边也不可使用。删除单个标签后,节点仍可访问,但是已删除标签的属性不可访问。此操作仅删除 Schema 信息,硬盘中所有文件及目录均未被直接删除,数据会在下次 compaction 时删除。
更新点:UPDATE VERTEX "player100(vid)" SET player.name = “杰克二号";
FETCH查看单个点及属性:FETCH PROP ON player "player100";
FETCH查看多个点即属性:FETCH PROP ON player "player100" union FETCH PROP ON player "player101"; 就是单个点的语句通过union连接
删除点:DELETE VERTEX "player100(vid)", "player101(vid)"

4 插入边
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);
查询所有边类型:SHOW EDGES;
查看边类型的属性:DESCRIBE EDGE follow(边名);
删除边类型:DROP EDGE follow
删除边时Nebula Graph将判断相应边是否有关联的索引,如果有则拒绝删除。
更新边:UPDATE EDGE "player100" -> "player101" OF follow SET degree = 100;
FETCH查看边及属性:FETCH PROP ON follow "player101" -> "player100";
删除边:DELETE EDGE follow "player100" -> "player101";

5 索引(Nebula Graph支持两种类型的索引:Tag 索引和Edge Type 索引。)
-- 点索引
为 Tag team 创建索引 team_index_1: CREATE TAG INDEX team_index_1 ON team();
为 Tag player 的 name 属性创建单属性索引 player_index_1: CREATE TAG INDEX player_index_1 ON player(name(20));
为 Tag player 的 name 和 age 属性创建复合属性索引 CREATE TAG INDEX player_index_2 ON player(name(10),age)
字符串类型的索引要指定长度
确保对已存在的数据生效
REBUILD TAG INDEX team_index_1;
删除索引: DROP TAG INDEX player_index_2;
查看所有点索引: SHOW TAG INDEXES;
查看点索引信息:DESCRIBE TAG INDEX player_index_1;
重构点索引:REBUILD TAG INDEX <index_name> [OFFLINE];
如果创建索引时,数据库里已经存有数据,则不会自动对旧的数据进行索引,此时需要对整个图中与索引相关的数据执行索引重构操作以保证索引包含了之前的数据。若当前数据库没有对外提供服务,则可在索引重构时使用 OFFLINE关键字加快重构速度。
查看重构点索引是否成功:SHOW TAG INDEX STATUS;

--边索引
为 EDGE serve 创建索引: CREATE EDGE INDEX serve_index_1 on serve(); REBUILD EDGE INDEX serve_index_1;
为 EDGE follow 的 degree 属性创建索引:CREATE EDGE INDEX follow_index_1 on follow(degree); REBUILD EDGE INDEX serve_index_1;
为 EDGE serve 创建复合属性索引: CREATE EDGE INDEX serve_index_2 on serve(start_year,end_year); REBUILD EDGE INDEX serve_index_2;
查看索引:SHOW EDGE INDEXES;
删除索引: DROP EDGE INDEX serve_index_2;


6 查询数据:
GO查询不需要创建索引,LOOKUP ON、MATCH等查询需要在nebula中给对应的标签或者边类型创建索引。
GO 语句可以根据指定的条件遍历数据库。GO 语句从一个或多个点开始,沿着一条或多条边遍历,可以使用 YIELD 子句中指定的返回的信息。

GO查询点的某个边的正向:从 TAG player 中 VID 为 player101 的球员开始,沿着边 follow 找到连接的球员: GO FROM "player101" OVER follow;
GO查询点的某个边的反向:GO FROM "player100" OVER follow REVERSELY;
GO查询点的某个边的双方向:GO FROM "player100" OVER follow BIDIRECT;
GO+where筛选+yield指定返回属性:
GO FROM "player101" OVER follow
WHERE $$.player.age>=35
YIELD $$.player.name AS Teammate, $$.player.age AS Age;
GO查询点的某个边的N级:GO 2 STEPS FROM "player101" OVER follow;
GO查询点的某个边的M到N级:GO M TO N STEPS FROM "player100" OVER follow;

match:
MATCH查询某类实体点的前几个:MATCH (v:player) return v limit 6;
MATCH查询某类实体点包含某个属性的前几个:MATCH (v:player) where exists (v.age) return v limit 6;
MATCH查询点的vid并显示前几个:MATCH (v) WHERE id(v) IN ['player100'] RETURN v LIMIT 100
MATCH查询某类实体所有关系的前几条:MATCH p=(v:player)-[]-() return p limit 10;
MATCH查询某类实体的某种关系的前几条:MATCH p=(v:player)-[r:follow]-() return p limit 6;

fetch语句:获得点或边的属性
查询 TAG player 中 VID 为 player100 的球员的属性值: FETCH PROP ON player "player100";
获取连接 player102 和 team203 的边 serve 的所有属性值: FETCH PROP ON serve "player102" -> "team203";

LOOKUP 语句是基于索引的,和 WHERE 子句一起使用,查找符合特定条件的数据:
列出 TAG player 的所有 VID: LOOKUP ON player;
列出 EDGE serve 所有边的起始点、目的点和 rank: LOOKUP ON serve;
EDGE serve 中查询 start_year == 2006 的属性值: LOOKUP ON serve where serve.start_year == 2006;

MATCH 语句是查询图数据最常用的,与 GO 或 LOOKUP 等其他查询语句相比,MATCH 的语法更灵活。MATCH 语句可以描述各种图模式,它依赖索引去匹配 Nebula Graph 中的数据模型
查询 Tag 为 player 的点的属性值: MATCH (x:player) return x;
查询 Tag 为 team 的点的属性值: MATCH (x:team) return x;
查询 TAG player 的 name 字段名为 杰克 的属性值: MATCH (v:player{name:"杰克"}) RETURN v;
查询 EDGE serve 的属性值: MATCH ()-[e:serve]-() RETURN e;
查询和 汤尼 有关的球员和球队: MATCH p=(v:player{name:"汤尼"})-->(v2) RETURN p

从VID为player100的球员开始,沿着边follow查找年龄大于或等于35岁的球员,并返回他们的姓名和年龄,同时重命名对应的列。
GO FROM "player100" OVER follow WHERE $$.player.age >= 35 \
YIELD $$.player.name AS Teammate, $$.player.age AS Age;
YIELD:指定该查询需要返回的值或结果。
$$: 表示边的终点。
\:表示换行继续输入。

从VID为player100的球员开始,沿着边follow查找连接的球员,然后检索这些球员的球队。为了合并这两个查询请求,可以使用管道符或临时变量。
GO FROM "player100" OVER follow YIELD follow._dst AS id | \
GO FROM $-.id OVER serve YIELD $$.team.name AS Team, \
$^.player.name AS Player;
follow._dst : follo边的终点,(_src表示起始点)
$^ : 表示边的起点。
| : 组合多个查询的管道符,将前一个查询的结果集用于后一个查询
$-: 表示管道符前面的查询输出的结果集。(必须在YIELD子句中为需要的返回结果设置别名,才能在管道符右侧使用引用符$-)

使用临时变量:$var = GO FROM "player100" OVER follow YIELD follow._dst AS id; \
GO FROM $var.id OVER serve YIELD $$.team.name AS Team, \
$^.player.name AS Player;

查询player100 1~2跳内的朋友:GO 1 TO 2 STEPS FROM "player100" OVER follow 。不写跳数默认是1跳,GO  3 STEPS FROM "player100" OVER follow 就是三跳,不包括1,2跳

多个节点间全部路径,最短路径(n跳):

全部路径: find NOLOOP path WITH PROP from '节点1','节点2','节点3' to '节点1','节点2','节点3' OVER * bidirect upto n steps 
最点路径 find SHORTEST path WITH PROP from '节点1','节点2','节点3' to '节点1','节点2','节点3' OVER * bidirect upto n steps

官方文档地址:https://docs.nebula-graph.com.cn/2.0.1/3.ngql-guide/7.general-query-statements/3.go/

 

posted @   杨吃羊  阅读(738)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2021-04-25 maven package和install的区别
2021-04-25 maven有多模块依赖时如何打包
2021-04-25 docker镜像run后 ps命令查不到解决办法
2021-04-25 docker常用命令
点击右上角即可分享
微信分享提示