咨询关于图业务相关问题--点与边类型是否如何建的

咨询:点与边类型是否如何建的

方案一:全部顶点与边都是同一类型
根据以下文章案例

方案二: 根据每个业务数据,建立对应的点边类型
如以下三类型数据:
1、中国 -->首都(边)–> 北京
2、北京 -->著名景点(边)–> 故宫
2、北京 -->著名食物(边)–> 北京烤鸭
建立点:地点、景点、美食
建立边:首都边,著名景点边,著名食物边

想了解下目前一些使用Nebula的大厂商是如何建点和边的?

建模这块你可以参考下下面这些帖子了解下 nGQL 下如何建模:


以上问题,如果按照不同类型建立不同类型,是否没有解决入库和查询很麻烦的问题?

是否都可以使用同一类型的边和点,用属性来区分不同分类型就可以,这种方式有什么缺点?

不太明白什么是按照不同类型建立不同类型?查询和入库是否很麻烦也要具体问题具体分析?就上述中你的方案二,按照你的思路来创建点边类型,其中一个示例可以如下这样:

创建如下的 tag 和 edge:

CREATE TAG city(name string);
CREATE TAG country(name string);
CREATE TAG scenic_spot(name string);
CREATE TAG food(name string);
CREATE EDGE is_capital();
CREATE EDGE locate();

根据如上的信息,入库就分别导入不同的点边即可,比如:

INSERT VERTEX country(name) VALUES "中国":("中国");
INSERT VERTEX city(name) VALUES "北京":("北京");
INSERT VERTEX scenic_spot(name) VALUES "故宫":("故宫");
INSERT VERTEX food(name) VALUES "北京烤鸭":("北京烤鸭");
INSERT EDGE is_capital() VALUES "北京"->"中国":();
INSERT EDGE locate() VALUES "故宫"->"北京":(), "北京烤鸭"->"北京":();

当然如果上面的数据规整好放入 csv 文件,可以通过 nebula-importer 或者 nebula-exchange 来进行导入。

点边不能同一类型,在 nebula 的设计中点是有不同的 tag 来描述不同的类型,tag 可以有属性。与 edge 不能是同一种 type。

2 个赞

是否可把边 is_capital与locate 设置同种类型,如include

INSERT EDGE include() VALUES “北京”->“中国”:(“capital”);
INSERT EDGE include() VALUES “故宫”->“北京”:(“locate”), “北京烤鸭”->“北京”:(“food”);

通过属性来区分类型,因我们业务大部分查找都是全类型查找关联的

可以,但是这里的 include 的 edge type 需要有个属性,类似:

CREATE EDGE include(attr string);
INSERT EDGE include(attr) VALUES "北京"->"中国":("首都");

如果后续单个属性检索是否会很慢,如就检查首都的关系数据,是否全库检索
想了nebula 的原理是如何的,是否 边的属性(“首都”)是否也建索引的

如果你要根据属性来查找就需要在该属性上建立对应的索引:

CRAETE EDGE INDEX include_index ON include(name(6));

索引的作用是根据属性找到对应的 Vertex ID 或者 EDGE ID,这样才能进一步的往外操作。你可以参看 nebula 的架构文章。底层是用的 KV store,所以找到点边的 ID 是必要的。

作为补充,yee 提到的架构文章是英文版,下面的是中文版的架构文章,分为三篇

查询引擎这块,2.0 和 1.0 有些不同,你可以看下 QE 组的研发写的下面 2.0 Query Engine 介绍

2 个赞