HugeGraph
是百度开源的一个图数据库,其插入性能比Neo4j
优秀很多,在大数据处理方面性能卓越。
1. 基础知识
1.1 基本概念
1 | 1. 图(Graph):指关系图。比如:同学及朋友关系图、银行转账图等。 |
1.2 元数据
在hugegraph
中定义了四种基本的元数据:
PropertyKey
:属性的类型VertexLabel
:顶点的类型EdgeLabel
:边的类型IndexLabel
:索引的类型
1 | # 他们之间的关系 |
1.2.1 IndexLabel,索引类型
在hugeGraph
中可以对顶点和边增加索引,提高图数据库的查询效率,其索引方式有三种:
search()
,全文索引;secondary()
,二级索引,可以通过属性值来快算匹配顶点和边;range()
,范围索引,可以按照属性值的范围快速匹配顶点和边。
1 | // 创建索引类型:"personByName",可以按“name”属性的值快速查询对应的“person”顶点 |
1.2.2 EdgeLabel,边类型
在hugegraph
中边类型可以定义其name
,sourceLabel
,targetLabel
,properties
等等
1 | // 创建边类型:人认识人"knows",此类边由"person"指向"person" |
1.2.3 VertexLabel,顶点类型
VertexLabel
是顶点的类型,每个顶点都有对应的VertexLabel
,一个VertexLabel
可以有多个具体的顶点。VertexLabel
可以定义一类顶点的类型名称、拥有的属性、ID
策略、是否创建按类型的索引等。例如:
1 | // 创建顶点类型:人"person",包含姓名、年龄、地址等属性,使用自定义的字符串作为ID |
以VertexLabel person
为例:
vertexLabel("person")
表示顶点类型的名字为person
;properties("name", "age","addr", "weight")
表示person
类型的顶点包含PropertyKeyname
、age
、addr
和weight
类型的属性;nullableKeys("addr","weight")
表示person
类型的顶点可以不包含PropertyKeyaddr
和weight
类型的属性;useCustomizeStringId()
表示person
类型的顶点使用指定的String
类型的ID
;- 默认包含
enableLabelIndex(true)
,表示可以按类型查找person
类型的顶点。
定义VertexLable
可用的完整方法说明:
- 名字是字符串,
vertexLabel(String)
; - 包含的属性,
properties(String...)
,必须是系统中已经创建过的PropertyKey的名字; - 可空属性,
nullableKeys(String...)
,必须是properties的子集。
ID策略
useAutomaticId()
,自动ID
策略,该类型的每个顶点会在创建时由系统提供一个数字ID
;usePrimaryKeyId()
,主键ID
策略,该类型的顶点的ID
是通过拼接primaryKeys(String...)
中的多个属性的值组成;useCustomizeStringId()
,指定String ID
策略,该类型的顶点在创建时使用指定的String
作为顶点ID
;useCustomizeNumberId()
,指定Number ID
策略,该类型的顶点在创建时使用指定的Number
作为顶点ID
。
类型索引,enableLabelIndex(Boolean)
,是否创建类型索引,如果创建了类型索引,就可以高效按类型查询顶点。
1.2.4 PropertyKey,属性类型
PropertyKey
定义属性的类型,包括名字、类型、基数等。例如:
1 | // 创建姓名属性,文本类型 |
以PropertyKey name
为例:
propertyKey("name")
表示属性的名字为“name”asText()
表示属性的类型为文本valueSingle()
表示属性的基数为single,即单值类型
定义PropertyKey
可用的完整方法说明:
- 名字是字符串,
propertyKey(String)
- 类型包括:
asText()
,字符串类型,是默认值asInt()
,整型asDate()
,日期类型asUuid()
,UUID类型asBoolean()
,布尔型asByte()
,字节型asBlob()
,字节数组型asDouble()
,双精度浮点型asFloat()
,单精度浮点型asLong()
,长整型 - 基数包括:
valueSingle()
,值是单值类型,是默认值
valueList()
,值是列表类型
valueSet()
,值是集合类型
2.图数据
HugeGraph
中的图数据包括:
- 顶点及其属性
- 边及其属性
- 索引数据
属性不可单独存在,必须依附于顶点或者边,索引数据用户不可见,属于系统内部数据,用于加速按属性查询。
2.1 vertex,顶点
Vertex
是一个顶点,往往对应现实中的一个实体,比如一个人或者一本书等。
1 | // 添加3个作者顶点 |
以顶点javeme
为例说明:
Label
是VertexLabel person
ID
是javeme
,VertexLabel person
的ID
策略是useCustomizeStringId()
,所以可以使用指定的字符串”javeme”作为顶点ID
- 包含的属性及其值是
{“name”: “Jermy Li”, “age”: 29, “addr”: “Beijing”, “weight”: 1}
Vertex
有三部分组成:
Label
,顶点的类型,即某个VertexLabel
ID
,每个顶点的唯一标识,ID
的类型根据顶点的VertexLabel
的ID策略决定(可参见VertexLabel
部分)Properties
,顶点的属性,属性的数目和种类由VertexLabel
限定,包括哪些可以为空等;属性的值由PropertyKey
限定
由于Vertex依赖于其所属的VertexLabel,所以创建Vertex之前,必须保证对应的VertexLabel已经创建完成
2.1 Edge,顶点
Edge
是一条边,往往代表现实中的一种关系或者动作,比如包含、属于或者阅读等。
1 | // 添加作者创建HugeGraph的边 |
以边javeme>created>>hugegraph
为例(上述例子中的第一条边):
- 边的出发顶点
source vertex
,VertexLabel person
类型的顶点javeme
; - 边的目标顶点
target vertex
,VertexLabel softwareenter code here
类型的顶点hugegraph
; - 边的类型
label
,EdgeLabel created
边的属性properties, {“weight”: 1}
。
边有五部分组成:
Label
,边的类型,即某个EdgeLabel
Source Vertex
,边的源顶点或者出发顶点,必须是EdgeLabel
的sourceLabel(String)
所指定的VertexLabel
类型的顶点Target Vertex
,边的目标顶点或者达到顶点,必须是EdgeLabel
的targetLabel(String)
所指定的VertexLabel
类型的顶点Properties
,边的属性,属性的数目和种类由EdgeLabel
限定,包括哪些属性可以为空;属性的值由属性对应的PropertyKey
限定Id
,边的唯一标识,边的ID
是由Source Vertex
、Target Vertex
、Label
和sortKeys
(如果有)拼接而成EdgeLabel
为singleTime()
时,ID格式为sourceVertexId>label>>targetLabelId
EdgeLabel
为multiTimes()
时,ID格式为sourceVertexId>label>sortKeys>targetLabelId