关系代数的运算对象是关系,运算结果也是关系。关系代数中用到的运算符主要有以下的类型:
- 集合运算符
- 并
$\cup$ - 交
$\cap$ - 差
$-$ - 笛卡尔积
$\times$
- 并
- 专门的关系运算符
- 选取
$\sigma$ - 投影
$\prod$ - 除
$\div$ - 自然连接
$\bowtie$ -
$\theta$ 连接$\bowtie_{X \theta Y}$
- 选取
- 算术比较运算符
- 大于
- 小于
- 大于等于
- 小于等于
- 等于
- 不等于
- 逻辑运算符
- 与
$\lor$ - 或
$\land$ - 非
- 与
给定两个关系$R$、$S$ ,如果他们满足:
- 具有相同的列数
$n$ -
$R$ 中的第$i$ 个属性和$S$ 中的第$i$ 个属性必须来自同一个域 那么我们就称$S$ 和$S$ 是相容的。
传统的集合运算,只是从行的角度进行,而要灵活地实现关系数据库多样的查询操作,必须引入专门的关系运算。在介绍专门的关系运算之前,为了叙述上的方便,先引入几个概念:
- 设关系模式为$R(A_1,A_2,…,A_n)$,它的一个关系为$R$,$t\in R$表示$t$是$R$的一个元组,那么$t[A_i]$表示元组$t$相对于属性$A_i$的一个分量;
- 给定一个关系$R(X,Z)$,$X$和$Z$为属性组,定义当$t[X]=x$时,$x$在$R$中的像集Image Set为$Z_x={t[Z]|t\in R,t[X]=x}$,它表示的是$R$中属性组$X$上值为$x$的那些元组在$Z$分量上的集合。
选取运算是单目运算,它根据一定的条件从关系$R$中选择若干个元组,组成一个新的关系。选取操作记作: $$ \sigma_F(R) = { t | t \in R \land F(t) = True } $$ 其中$\sigma$为选取运算符,$F$是选取的条件。$F$是由运算对象(属性名、常数、简单函数)、算术比较运算符(>、≥、<、=、≠)和逻辑运算符(与、或、非)连接起来的逻辑表达式,其结果是逻辑值True或False,所以我们对于选取运算进行总结:它从关系$R$中选取那些使得逻辑表达式$F$为真的元组,是从行的角度进行的运算。
投影运算也是单目运算,关系$R$上的投影是从$R$中选择出若干属性列,组成新的关系,即对关系$R$在垂直方向上进行运算,从左到右按照指定的若干属性及顺序(意味着我们可以改变属性列的顺序,实际上关系中的属性列是可以交换位置的)取出相应列,并且要删除重复的元组。投影运算记作: $$ \prod_A(R) = { t[A] | t \in R } $$
定义属性关系图
$$ \mathcal{G}(\mathbb{V},\mathbb{E},\mathbb{T}) = {R | R \in \mathbb{V} \lor R \in \mathbb{E} \lor R \in \mathbb{O} } $$
简记为$\mathcal{G}$,其中
定义关系$R$的类型为
所以图$\mathcal{G}$也可以记为
| ... | ... | ... | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| ... | ... | ... |
定义类型
create database ent_graph;use ent_graph;create vertex person (
name varchar(100) not null default '',
age int
) with space 1;
create vertex company (
name varchar(500) ,
industry_code int ,
credit_code varchar(200),
reg_number varchar(100)
);
create vertex goverment (
name varchar(500),
uuid varchar(200)
);create edge work_in (
start_date date ,
end_date date ,
role varchar(50)
) on person to company or person to goverment ;
create edge friend (
start_date date
) on person connect person;create table person_extra (
weight double,
address varchar(500)
) attach person;create table test (
hello varchar(50)
);show databases;
show vertices;
show edges;
show tables;
SHOW COLUMNS FROM person;select * from test;
select * from ent_graph.test;
select * from ent_graph.person;
select name, age from (select p from ent_graph match (p:person)) t;
select * from ent_graph;
select p,f,c from ent_graph
match (p:person)-[f:friend]->(pp:person) and (pp)-[w:work_in]->(c:company | goverment)
where c.name in ['', '', ''];
with recursive loop_group as (
select p,c,g from ent_graph match (p:person), (c:company), [g:guar]
except
select p,c,g uinon gr as g from loop_group match (p:person)-[g:guar]-(), (c:company)-[gr:guar]-()
where p.in_degree = 0 or p.out_degree = 0 , c.in_degree = 0 or c.out_degree = 0
)
select * from loop_group;
with recursive dfs as (
select array(inc) as step from ent_graph match (inc:person) where inc.name = 'tom'
right
select dfs.step :: new_inc as setp from ent_graph join dfs
on dfs.step(-1) = ent_graph.person match (dfs.step(-1))-[]->(new_inc) and new_inc not in step
)
select r,s from G match (r:Researcher)-([sp:SUPERVISES|RULE]->(s:Student)){3,6}->()
where r.name = '' and (r.out.SUPERVISES between (3,5) or r.out.RULE > 1) ,
sp.start_date > ''