已知n个节点、查询共同终点的问题

  • nebula 版本:v2.0.1
  • 部署方式:单机
  • 安装方式:Docker
  • 是否为线上版本:N

我目前的需求是根据几个字符查找用户

我查看了帖子 [v2] 查询时添加判断和返回自定义字段 - #10,来自 panda 给了我一点解决思路

目前我的执行语句是

// 创建命名空间,节点id为string类型
create space if not exists test_space(vid_type = FIXED_STRING(24));
use test_space;
// 创建边
create edge contains_char();
// 创建tag
create tag user();
// 插入节点
insert vertex user() values 'user_1001':();
// 插入边使得刚才的节点分别指向“这是我的用户名”这几个字符,边为悬挂边
insert edge contains_char() values 'user_1001'->'这':(),'user_1001'->'是':(),'user_1001'->'我':(),'user_1001'->'的':(),'user_1001'->'用':(),'user_1001'->'户':(),'user_1001'->'名':();

// 根据字符查询用户
go from "是" over contains_char REVERSELY yield contains_char._dst as target_user |
go from $-.target_user OVER contains_char where contains_char._dst == "我" yield contains_char._src as target_user|
go from $-.target_user OVER contains_char where contains_char._dst == "用" yield contains_char._src as target_user|
go from $-.target_user OVER contains_char where contains_char._dst == "这" yield contains_char._src;

// 正确返回结果
session_100000012

我目前没有想到更好的查询方法,请问一下,有没有更好的方法?

可以用 INTERSECT 集合运算符 - Nebula Graph Database 手册

go from "这" over contains_char REVERSELY yield contains_char._dst INTERSECT \
go from "是" over contains_char REVERSELY yield contains_char._dst INTERSECT \
go from "我" over contains_char REVERSELY yield contains_char._dst INTERSECT \
go from "的" over contains_char REVERSELY yield contains_char._dst INTERSECT \
go from "用" over contains_char REVERSELY yield contains_char._dst 

2 个赞

感谢HarrisChu大佬解惑

你好,HarrisChu,这么修改的效率会更好吗?

我不太清楚底层的运行机制,是否通过管道运行每到下个管道结果集会越来越少?使用INTERSECT不是会查出多个结果集再求交集吗?

得看你的数据场景,如果 user_1001 有很多个,比如 100 个,分散在 6 个 part 上。
go + pipe 的话,每一个 pipe 都要去 6 个 part 查一次。
而 INTERSECT 只要去记个 part 查一次就好了。

1 个赞

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。