点VID和分片ID

点VID(VID

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

  • VID数据类型可以为定长字符串或64位整数。

  • VID在图空间中必须唯一。

  • 一个VID可以有多个标签(TAG)。例如一个人(VID)可以有两个不同的角色(TAG)。

  • 不同图空间中的VID是完全独立无关的。

插入点请参见INSERT VERTEX

分片ID

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

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

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

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

  1. pId = vid % numParts + 1;

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

参数说明
%取模运算。
numPartsVID所在图空间的分片数,即CREATE SPACE语句中的partition_num值。
pIdVID所在分片的ID。

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