【图数据库】NebulaGraph

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>;
  1. 一个点可以有一个或多个标签。
  2. 如果点只有一个标签,删除这个标签后,您就无法访问这个点,下次Compaction操作时会删除该点。点上的边仍然存在。
  3. 如果点有多个标签,删除其中一个标签,仍然可以访问这个点,但是无法访问已删除标签定义的所有属性。

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>创建

  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

  1. 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>聚合

  1. DISTINCT 去重
MATCH p=(v:player{name:"Tim Duncan"})-[e:follow*1..3]->(v2:player) \
        RETURN DISTINCT v2 AS Friends, count(v2);
  1. 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

在大型集群中,由于启动时间不同,分片的分布可能不均衡。

  1. 检查分片的分布情况
SHOW HOSTS;
  1. 均衡负载
BALANCE LEADER;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值