Skip to content

Latest commit

 

History

History
157 lines (119 loc) · 10 KB

4.schema.md

File metadata and controls

157 lines (119 loc) · 10 KB

TuGraph图模型说明

1. 数据模型

1.1. 图模型

TuGraph是一个具备多图能力的强类型、有向属性图数据库。

  • 图项目:每个数据库服务可以承载多个图项目(多图),每个图项目可以有自己的访问控制配置,数据库管理员可以创建或删除指定图项目。
  • 点:指实体,一般用于表达现实中的实体对象,如一部电影、一个演员。
    • 主键:用户自定义的点数据主键,默认唯一索引,在对应的点类型中唯一。
    • VID:点在存储层自动分配图项目中的唯一ID,用户不可修改。
    • 上限:每个图项目存储最多2^(40)个点数据。
  • 边:用于表达点与点之间的关系,如演员出演电影。
    • 有向边:边为有向边。若要模拟无向边,用户可以创建两个方向相反的边。
    • 多条边:两个点数据之间可以有多条边数据。当前TuGraph支持重复边,如要确保边边唯一,需要通过业务策略实现。
    • 上限:两个点数据之间存储最多2^(32)条边数据。
  • 属性图:点和边可以具有与其关联的属性,每个属性可以有不同的类型。
  • 强类型:每个点和边有且仅有一个标签,创建标签后,修改属性数量及类型有代价。
    • 指定边的起/终点类型:可限制边的起点和终点点类型,支持同类型边的起点和终点的点类型不同,如个人转账给公司、公司转账给公司;当指定边的起/终点类型后,可增加多组起/终点类型,不可删除已限制的起/终点类型。
    • 无限制模式:支持不指定边的起点和终点的点类型,任意两个点类型间均可创建该类型的边数据。注:当指定边的起/终点类型后无法再采用无限制模式。

1.2. 数据类型

TuGraph支持多种可用于属性的数据类型。具体支持的数据类型如下:

数据类型 最小值 最大值 描述
BOOL false true 布尔值
INT8 -128 127 8位整型
INT16 -32768 32767 16位整型
INT32 - 2^31 2^31 - 1 32位整型
INT64 - 2^63 2^63 - 1 64位整型
DATE 0000-00-00 9999-12-31 "YYYY-MM-DD" 格式的日期
DATETIME 0000-00-00 00:00:00.000000 9999-12-31 23:59:59.999999 "YYYY-MM-DD HH:mm:ss[.ffffff]" 格式的日期时间
FLOAT 32位浮点数
DOUBLE 64位浮点数
STRING 不定长度的字符串
BLOB 二进制数据(在输入输出时使用Base64编码)
POINT EWKB格式数据,表示点
LINESTRING EWKB格式数据,表示线
POLYGON EWKB格式数据,表示面(多边形)

1.3. 索引

TuGraph支持对点或边的属性创建索引,以提升查询效率。其特点如下:

  • 索引包括普通索引和组合索引,普通索引基于一个点或边的一个属性创建,而组合索引基于一个点或边的多个属性创建(不超过16个),可以对同一点或边的多个(组)属性创建索引。
  • 如果为点标签创建了唯一索引,在修改该标签的点时,会先执行数据完整性检查,以确保该索引的唯一性。
  • BLOB类型的属性不能建立索引。

TuGraph的点边均有多种索引类型,不同的索引类型的功能和限制不同,具体如下:

1.3.1 普通索引

1.3.1.1 点索引
1.3.1.1.1 unique索引

点的unique索引指的是全局唯一的索引,即若一个属性设置了unique索引,在同一个图中,相同label的点的该属性不会存在相同的值, unique索引key的最大长度是480bytes,超过480bytes的属性不能建立unique索引。 primary作为特殊的unique索引,因此最大key的长度也是480bytes。

1.3.1.1.2 non_unique索引

点的non_unique索引指的是非全局唯一的索引,即若一个属性设置了non_unique索引, 在同一个图中,相同label的点的该属性可以存在相同的值。 由于non_unique索引一个key可能映射到多个值,为了加速查找和写入, 在用户指定的key后面加上了索引key相同的一组vid的最大值。 每个vid是5bytes长度,因此non_unique索引key最大长度是475bytes。 但是,不同于unique索引,超过475bytes也可以建立non_unique索引。 只不过在对这样的属性建立索引时会只截取前475bytes作为索引key(属性本身存储的值不受影响)。 并且,在通过迭代器遍历时,也是先自动截取查询值的前475bytes再进行遍历, 所以结果可能和预期不一致,需要用户再过滤。

1.3.1.2 边索引
1.3.1.2.1 unique索引

和点类似,边的unique索引指的是全局唯一的索引,即若一个属性设置了unique索引,在同一个图中,相同label的边的该属性不会存在相同的值, unique索引key的最大长度是480bytes,超过480bytes的属性不能建立unique索引

1.3.1.2.2 pair_unique索引

pair_unique索引指的是两点间的唯一索引,即若一个属性设置了unique索引,在同一个图的同一组起点和终点之间, 相同label的边的该属性不会存在相同的值。为了保证pair_unique索引key在同一组起点和终点之间不重复, 索引在用户指定的key后面加上了起点和终点的vid,每个vid是5bytes长度。 因此最大key的长度是470bytes,超过470bytes的属性不能建立pair_unique索引

1.3.1.2.3 non_unique索引

和点类似,边的non_unique索引指的是非全局唯一的索引,即若一个属性设置了non_unique索引, 在同一个图中,相同label的边的该属性可以存在相同的值。 由于non_unique索引一个key可能映射到多个值,为了加速查找和写入, 在用户指定的key后面加上了索引key相同的一组eid的最大值。 每个eid是24bytes长度,因此non_unique索引key最大长度是456bytes。 但是,不同于unique索引,超过456bytes也可以建立non_unique索引。 只不过在对这样的属性建立索引时会只截取前456bytes作为索引key(属性本身存储的值不受影响)。 并且,在通过迭代器遍历时,也是先自动截取查询值的前456bytes再进行遍历, 所以结果可能和预期不一致,需要用户再过滤。

1.3.2 组合索引

目前只支持对点的多个属性建立组合索引,不支持对边的属性建立组合索引。组合索引支持唯一索引和非唯一索引两种类型,建立索引的要求如下:

  1. 建立组合索引的属性个数在2到16个之间(含)
  2. 唯一组合索引的属性长度之和不能超过480-2*(属性个数-1)字节,非唯一组合索引的属性长度之和不能超过475-2*(属性个数-1)字节
1.3.2.1 唯一索引

和点的普通唯一索引类似,点的组合唯一索引指的是全局唯一的索引,即若一组属性设置了unique索引, 在同一个图中,相同label的点的该组属性不会存在相同的值。 由于底层存储设计,组合索引key需要保存属性的长度,因此, 组合唯一索引key的最大长度是480-2*(属性个数-1) bytes,超过的属性不能建立唯一索引

1.3.2.2 非唯一索引

和点的普通非唯一索引类似,点的非唯一索引指的是非全局唯一的索引,即若一组属性设置了非唯一索引, 在同一个图中,相同label的点的该组属性可以存在相同的值。 由于非唯一索引一个key可能映射到多个值,为了加速查找和写入, 在用户指定的key后面加上了索引key相同的一组vid的最大值。 每个vid是5bytes长度,因此non_unique索引key最大长度是475-2*(属性个数-1) bytes, 超过的属性不能建立非唯一索引

2. 图项目、点、边、属性命名规则和建议

2.1 命名规则

图项目、点、边和属性是识别符。该节描述了在TuGraph中识别符的允许的语法。 下面的表描述了每类识别符的最大长度和允许的字符。

识别符 长度 允许的字符
用户、角色、图项目 1-64字符 允许中文、字母、数字、下划线,且首字符不为数字
点类型、边类型、属性 1~256字符 允许中文、字母、数字、下划线,且首字符不为数字

2.2 使用限制

描述 最大个数
用户数、角色数 65536
图项目的个数 4096
每个图项目的点和边类型数量之和 4096
每个点或边类型的属性数量 1024

注: 1、特殊字符和关键字说明:使用特殊字符或非保留关键字时,需要使用反单引号/backquote(``)进行引用;

示例: match (`match`:match) return `match`.id limit 1

2、大小写敏感性:TuGraph大小写敏感;

3、图项目、点/边、属性名称之间可以重复使用,同一点或边下的属性名称不可以重复;

4、属性名字保留关键字:SRC_ID / DST_ID / SKIP

2.3 命名建议

识别符 描述 建议
图项目 字母或中文开头 如graph123、project123等
点/边类型 字母或中文开头,使用下划线区分单词 如person、act_in等
属性 字母或中文 如name、age等