咨询:点与边类型是否如何建的
方案一:全部顶点与边都是同一类型
根据以下文章案例
方案二: 根据每个业务数据,建立对应的点边类型
如以下三类型数据:
1、中国 -->首都(边)–> 北京
2、北京 -->著名景点(边)–> 故宫
2、北京 -->著名食物(边)–> 北京烤鸭
建立点:地点、景点、美食
建立边:首都边,著名景点边,著名食物边
想了解下目前一些使用Nebula的大厂商是如何建点和边的?
咨询:点与边类型是否如何建的
方案一:全部顶点与边都是同一类型
根据以下文章案例
方案二: 根据每个业务数据,建立对应的点边类型
如以下三类型数据:
1、中国 -->首都(边)–> 北京
2、北京 -->著名景点(边)–> 故宫
2、北京 -->著名食物(边)–> 北京烤鸭
建立点:地点、景点、美食
建立边:首都边,著名景点边,著名食物边
想了解下目前一些使用Nebula的大厂商是如何建点和边的?
不太明白什么是按照不同类型建立不同类型?查询和入库是否很麻烦也要具体问题具体分析?就上述中你的方案二,按照你的思路来创建点边类型,其中一个示例可以如下这样:
创建如下的 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。
是否可把边 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 介绍