关于vid的使用

同一个图空间的vid要求唯一,但是不同vertex的业务ID是可能相同的,比如studentId=1,teacherId=1,以此作为各自点的vid,查询或者关联边都不能唯一,有什么好的方式吗?当前是计划加前缀或后缀

开始试用 - Nebula Graph Database 手册

可以看下上面的基础概念哈,我讲下我的理解,不知道你学过 MySQL 没有,VID 对应的 SQL 里 key 的概念,所以要唯一,但是你这里的 studentId / teacherId 其实是一个 Student 实例中的 No. 的属性,对应到 Nebula 中就是 Vertex tag 的概念,tag 的值是可以重复的,就像你 No. 的属性值可以重复一样,要保证不重复的唯一标识 VID (key)是独一无二的就行啦。

1 个赞

抱歉,我没说清楚我的意思。

比如:

CREATE SPACE my_space(vid_type = INT64);
USE SPACE my_space;
create tag teacher(name string);
create tag student(name string);
insert vertex teacher(name) values 1:('teacher1');
insert vertex student(name) values 1:('student1');

在同一个space内,我希望以teacherId(1)和studentId(1)直接作为teacher和student各自顶点的vid,而不只是tag内的一个属性。
这样的话我就不用为teacherId和studentId设置index,再用look up先查出各自顶点的vid,再进行insert edge或者其他需要vid的操作。

实操这种东西啊,我找个人来给你解答下 @jerry.liang

因为在一个图空间内,vid必须是唯一的,所以无法做到同一个id,表征两个不同的点,因为我们点本身是不区分类型的(teacher 和 student),当然我们一个点可以有多个tag(既可以是student,也可以是teacher)。

所以,基于你的场景需求,目前如果你想实现以 teacher(1) 和 student(1) 作为各自的定点vid的话,那么建议你把space图空间的 vidType 设置为fix_string类型,注意指定好长度,直接用 teacher(1) 、student(1) 作为vid(就像你前面说的加前缀或后缀)。

注意:上面vidType支持string类型的前提是使用nebula 2.0版本,1.0的话,你只能做hash了

3 个赞

对,用前缀或者后缀

文档中对于点的建立不同的TAG可以使用同一个VID
https://docs.nebula-graph.com.cn/2.0.1/3.ngql-guide/12.vertex-statements/1.insert-vertex/

  • 相同 VID 但不同 TAG 的情况下:不同TAG对应的记录不会相互覆盖,不存在会新写入。
    insert vertex teacher(name) values 1:(‘teacher1’);
    insert vertex student(name) values 1:(‘student1’);

要是按照这个要求的话,类似 teacher1 student1 这样的点没法建立边了,因此通过VID区分不出来 teacher1 student1
这样的话 相同 VID 但不同 TAG 就基本没啥用了,因为建不了关系,如此不如直接要求所有VID必须不同

点本身也可以有边指向自己,“teacher1” 和 “student1” 一样能建立关系吧

insert vertex teacher(name) values 1:(‘teacher1’);
insert vertex student(name) values 1:(‘student1’);

CREATE EDGE TEACH();
INSERT EDGE TEACH() VALUES 1->1:();
如这个例子,这样没法执行,不知道是哪个VERTEX

为啥不能执行呢?报的啥错,我这边是正常的

CREATE TAG teacher(name string);
CREATE TAG student(name string);
CREATE EDGE TEACH();

insert vertex teacher(name) values 1:(‘teacher1’);
insert vertex student(name) values 1:(‘student1’);

INSERT EDGE TEACH() VALUES 1->1:();

MATCH p=(v:teacher)-[e:TEACH*1]->(v2:student)
WHERE id(v) IN [1]
RETURN p LIMIT 100
image

上面的描述不太正确,可以执行,但边关系这块,应该是VERTEX相同的id能区分,边这块如何区分呢?

看来相同VID对多TAG的区分,如果是不同的实体,还是不要设置一样的VID吧
主要的场景是有的业务数据库不同的表使用的id有可能是相同的,直接使用实体的id来建VERTEX可能存在VID相同的情况,按照现在的这个逻辑要求还是进行转换下吧
【主要还是neo4j中没有VID这个要求,以前的映射这块直接用的就是业务数据库的id】

嗯,我理解,vid是和实体对应的,实体不同,vid是不同的。这个你在建模的时候,要依据nebula graph的特点来做适配。

浙ICP备20010487号