图数据库 HugeGraph : IndexLabel
程序员文章站
2022-06-20 09:03:14
...
IndexLabel 用来定义索引类型,描述索引的约束信息,主要是为了方便查询。
IndexLabel 允许定义的约束信息包括:name、baseType、baseValue、indexFeilds、indexType,下面逐一介绍。
- name: 属性的名字,用来区分不同的 IndexLabel,不允许有同名的属性;
interface | param | must set |
---|---|---|
indexLabel(String name) | name | y |
-
baseType: 表示要为 VertexLabel 还是 EdgeLabel 建立索引, 与下面的 baseValue 配合使用;
-
baseValue: 指定要建立索引的 VertexLabel 或 EdgeLabel 的名称;
interface | param | description |
---|---|---|
onV(String baseValue) | baseValue | build index for VertexLabel: 'baseValue' |
onE(String baseValue) | baseValue | build index for EdgeLabel: 'baseValue' |
- indexFeilds: 要在哪些属性上建立索引,可以是为多列建立联合索引;
interface | param | description |
---|---|---|
by(String... fields) | files | allow to build index for multi fields for secondary index |
- indexType: 建立的索引类型,目前支持五种,即 Secondary、Range、Search、Shard 和 Unique。
- Secondary 支持精确匹配的二级索引,允许建立联合索引,联合索引支持索引前缀搜索
- 单个属性,支持相等查询,比如:person顶点的city属性的二级索引,可以用
g.V().has("city", "北京")
查询"city属性值是北京"的全部顶点 - 联合索引,支持前缀查询和相等查询,比如:person顶点的city和street属性的联合索引,可以用
g.V().has ("city", "北京").has('street', '中关村街道')
查询"city属性值是北京且street属性值是中关村"的全部顶点,或者g.V() .has("city", "北京")
查询"city属性值是北京"的全部顶点secondary index的查询都是基于"是"或者"相等"的查询条件,不支持"部分匹配"
- 单个属性,支持相等查询,比如:person顶点的city属性的二级索引,可以用
- Range 支持数值类型的范围查询
- 必须是单个数字或者日期属性,比如:person顶点的age属性的范围索引,可以用
g.V().has("age", P.gt(18))
查询"age属性值大于18"的顶点。除了P.gt()
以外,还支持P.gte()
,P.lte()
,P.lt()
,P.eq()
,P.between()
,P.inside()
和P.outside()
等
- 必须是单个数字或者日期属性,比如:person顶点的age属性的范围索引,可以用
- Search 支持全文检索的索引
- 必须是单个文本属性,比如:person顶点的address属性的全文索引,可以用
g.V().has("address", Text .contains('大厦')
查询"address属性中包含大厦"的全部顶点search index的查询是基于"是"或者"包含"的查询条件
- 必须是单个文本属性,比如:person顶点的address属性的全文索引,可以用
- Shard 支持前缀匹配 + 数字范围查询的索引
- N个属性的分片索引,支持前缀相等情况下的范围查询,比如:person顶点的city和age属性的分片索引,可以用
g.V().has ("city", "北京").has("age", P.between(18, 30))
查询"city属性是北京且年龄大于等于18小于30"的全部顶点 - shard index N个属性全是文本属性时,等价于secondary index
- shard index只有单个数字或者日期属性时,等价于range index
shard index可以有任意数字或者日期属性,但是查询时最多只能提供一个范围查找条件,且该范围查找条件的属性的前缀属性都是相等查询条件
- N个属性的分片索引,支持前缀相等情况下的范围查询,比如:person顶点的city和age属性的分片索引,可以用
- Unique 支持属性值唯一性约束,即可以限定属性的值不重复,允许联合索引,但不支持查询
- 单个或者多个属性的唯一性索引,不可用来查询,只可对属性的值进行限定,当出现重复值时将报错
- Secondary 支持精确匹配的二级索引,允许建立联合索引,联合索引支持索引前缀搜索
interface | indexType | description |
---|---|---|
secondary() | Secondary | support prefix search |
range() | Range | support range(numeric or date type) search |
search() | Search | support full text search |
shard() | Shard | support prefix + range(numeric or date type) search |
unique() | Unique | support unique props value, not support search |
2.5.2 创建 IndexLabel
schema.indexLabel("personByAge").onV("person").by("age").range().ifNotExist().create();
schema.indexLabel("createdByDate").onE("created").by("date").secondary().ifNotExist().create();
schema.indexLabel("personByLived").onE("person").by("lived").search().ifNotExist().create();
schema.indexLabel("personByCityAndAge").onV("person").by("city", "age").shard().ifNotExist().create();
schema.indexLabel("personById").onV("person").by("id").unique().ifNotExist().create();
2.5.3 删除 IndexLabel
schema.indexLabel("personByAge").remove()
2.5.4 查询 IndexLabel
// 获取IndexLabel对象
schema.getIndexLabel("personByAge")
// 获取property key属性
schema.getIndexLabel("personByAge").baseType()
schema.getIndexLabel("personByAge").baseValue()
schema.getIndexLabel("personByAge").indexFields()
schema.getIndexLabel("personByAge").indexType()
schema.getIndexLabel("personByAge").name()