跳转至

点VID和分片IDGraph

点VID(VID)Graph

在NebulaGraph中,插入点时必须用点的ID(VID,也有些地方称为VertexID)标识这个点。VID有如下特点:

  • VID数据类型可以为定长字符串或64位整数。
  • VID在图空间中必须唯一。
  • 一个VID可以有多个标签(TAG)。例如一个人(VID)可以有两个不同的角色(TAG)。
  • 不同图空间中的VID是完全独立无关的。

插入点请参见Graph。

分片IDGraph

点和边分布在不同的分片,分片分布在不同的机器。如果需要将某些点放置在相同的分片(例如在一台机器上),可以参考Graph。

下文用简单代码说明VID和分片的关系。

    // 如果ID长度为8,为了兼容1.0,将数据类型视为int64。
    uint64_t vid = 0;
    if (id.size() == 8) {
        memcpy(static_cast<void*>(&vid), id.data(), 8);
    } else {
        MurmurHash2 hash;
        vid = hash(id.data());
    }
    PartitionID pId = vid % numParts + 1;

简单来说,上述代码是将一个固定的字符串进行哈希计算,转换成数据类型为int64的数字(int64数字的哈希计算结果是数字本身),将数字取模,然后加1,即:

pId = vid % numParts + 1;

示例的部分参数说明如下。

参数 说明
% 取模运算。
numParts VID所在图空间的分片数,即Graph语句中的partition_num值。
pId VID所在分片的ID。

例如有100个分片,VID为1、101和1001的三个点将会存储在相同的分片。分片ID和机器地址之间的映射是随机的,所以不能假定任何两个分片位于同一台机器上。


最后更新: 2021年5月17日
Back to top