1,介绍
2,语法
1)图空间
NebulaGraph的图空间彼此之间是完全隔离的,将一个图空间作为工作空间后,您无法访问其他空间。检索新图空间的唯一方法是通过USE语句切换。
1>创建
只有God角色的用户可以执行CREATE SPACE语句。
CREATE SPACE [IF NOT EXISTS] <graph_space_name>
[(partition_num = <partition_number>,
replica_factor = <replica_number>,
vid_type = {FIXED_STRING(<N>) | INT64})];
- partition_num
指定图空间的分片数量。建议设置为5倍的集群硬盘数量。例如集群中有3个硬盘,建议设置15个分片。默认值为100。 - replica_factor
指定每个分片的副本数量。建议在生产环境中设置为3,在测试环境中设置为1。由于需要基于多数表决,副本数量必须是奇数。默认值为1。 - vid_type
指定点ID的数据类型。
可选值为FIXED_STRING()和INT64。FIXED_STRING()表示数据类型为字符串,最大长度为N,超出长度会报错;INT64表示数据类型为整数。默认值为FIXED_STRING(8)。
2>删除
DROP SPACE [IF EXISTS] <graph_space_name>;
3>查询
#查询所有图空间
SHOW SPACES;
4>使用
USE <graph_space_name>;
2)标签语句—点(Vertex)
tag更像是MySQL中的表。
标签(Tag)在 NebulaGraph 中用于定义点(Vertex)的类型及其属性结构。
1>创建
CREATE TAG [IF NOT EXISTS] <tag_name>
([<create_definition>, ...])
[tag_options];
<create_definition> ::=
<prop_name> <data_type> [NULL | NOT NULL]
<tag_options> ::=
<option> [, <option> ...]
<option> ::=
TTL_DURATION [=] <ttl_duration>
| TTL_COL [=] <prop_name>
| DEFAULT <default_value>
- tag_name 标签名
图空间内的唯一。
设置后无法修改。
可与图空间名相同。 - create_definition 标签属性
prop_name 属性名称,唯一。
data_type 数据类型;
DEFAULT 默认值。 - TTL(Time-To-Live)Graph
属性存活时间
2>删除
DROP TAG [IF EXISTS] <tag_name>;
- 一个点可以有一个或多个标签。
- 如果点只有一个标签,删除这个标签后,您就无法访问这个点,下次Compaction操作时会删除该点。点上的边仍然存在。
- 如果点有多个标签,删除其中一个标签,仍然可以访问这个点,但是无法访问已删除标签定义的所有属性。
3>修改
ALTER TAG <tag_name>
<alter_definition> [, alter_definition] ...]
[ttl_definition [, ttl_definition] ... ];
alter_definition:
| ADD (prop_name data_type)
| DROP (prop_name)
| CHANGE (prop_name data_type)
ttl_definition:
TTL_DURATION = ttl_duration, TTL_COL = prop_name
3>查询
## 查询所有点的标签
SHOW TAGS;
## 匹配所有标签为player的点数据
## 结果:显示了点的id(vid)、标签名称、属性。("player107" :player{address: "aaa4", age: 28, name: "Charlie"})
MATCH (u:player) RETURN u;
3)边类型语句
边类型更像是MySQL中的表。
1>创建
2>删除
3>修改
4>查询
## 查看所有边类型
SHOW EDGES;
## 已知边的起点、终点和边类型,查询边属性:FETCH PROP ON
## follow 是边的类型;player101为点的vid
FETCH PROP ON follow "player101" -> "player102" @0 YIELD properties(edge);
4)点语句
1>创建
- 插入一个VID已存在的点时,INSERT VERTEX将覆盖原有的点。
INSERT VERTEX <tag_name> (<prop_name_list>) [, <tag_name> (<prop_name_list>), ...]
{VALUES | VALUE} VID: (<prop_value_list>[, <prop_value_list>])
prop_name_list:
[prop_name [, prop_name] ...]
prop_value_list:
[prop_value [, prop_value] ...]
- tag_name
点关联的标签(点类型) - prop_name_list
需要设置的属性名称列表。 - VID:点ID
- prop_value_list
根据prop_name_list填写属性值。
2>删除
3>修改
4>查询
5)边语句
1>创建
2>删除
3>修改
4>查询
6)原生索引
1>创建
# 在属性name上创建索引。
CREATE TAG INDEX name ON player(name(20));
# 重建索引使其生效。结果会返回job id,通过SHOW JOB 121(id);可以确认重建索引成功(FINISHED)。
REBUILD TAG INDEX name;
2>删除
3>修改
4>查询
SHOW {TAG | EDGE} INDEXES;
7)全文索引
1>创建
2>删除
3>修改
4>查询
8)查询语句
1>Match
- MATCH语句在模式中搜索,寻找匹配的边或点。
如果标签的某个属性有索引,但标签没有索引,则无法基于该标签执行MATCH语句。
# 匹配标签是player点;需要标签索引
MATCH (v:player) RETURN v;
#使用属性name搜索匹配的点。需要属性索引
MATCH (v:player{name:"Tim Duncan"}) RETURN v;
# 根据id匹配
MATCH (v) WHERE id(v) == 'player107' RETURN v;
MATCH (v) WHERE id(v) in ['player107','player139'] RETURN v;
# -- 匹配连接的点
# --符号表示两个方向的边,增加<或>符号指定边的方向。
MATCH (v:player{name:"Tim Duncan"})-->(v2) \
RETURN v2.name AS Name;
MATCH (v:player{name:"Tim Duncan"})-->(v2) \
RETURN v2.name AS Name;
MATCH (v:player{name:"Tim Duncan"})-->(v2)<--(v3) \
RETURN v3.name AS Name;
# 跳过引用点
MATCH (v:player{name:"Tim Duncan"})-->()<--(v3) \
RETURN v3.name AS Name;
# 匹配路径 连接起来的点和边构成了路径。
# 结果:[:serve "player107"->"team204" @0 {end_year: 2015, start_year: 2013}] 其中@符号表示边的rank
MATCH p=(v:player{name:"Tim Duncan"})-->(v2) \
RETURN p;
# 匹配边
# --、-->、<--表示未命名的边之外,您还可以在方括号中使用自定义变量命名边
MATCH (v:player{name:"Tim Duncan"})-[e]-(v2) \
RETURN e;
# 匹配边类型和属性
MATCH (v:player{name:"Tim Duncan"})-[e:serve]-(v2) \
RETURN e;
2>聚合
- DISTINCT 去重
MATCH p=(v:player{name:"Tim Duncan"})-[e:follow*1..3]->(v2:player) \
RETURN DISTINCT v2 AS Friends, count(v2);
- GROUP BY
-- 支持函数:avg()、sum()、max()、min()、count()、collect()、std()。
MATCH (v:player)<-[:follow]-(:player) RETURN v.name AS Name, count(*) as cnt ORDER BY cnt DESC
3>LOOKUP
7)性能优化
1>检查分片分布情况Graph
在大型集群中,由于启动时间不同,分片的分布可能不均衡。
- 检查分片的分布情况
SHOW HOSTS;
- 均衡负载
BALANCE LEADER;