一、建模
1、 模型定义-销售数据库(saledb)
顶点 | 继承自 | 属性 |
---|---|---|
人(Person) | 姓名(name) | |
性别(sex) | ||
出生日期(birthday) | ||
员工(Employee) | V、Person | 工号(workerNo) |
客户(Customer) | V、Person | 会员号(memberNo) |
商品(Product) | 商品名(name) | |
生产日期(productionDate) | ||
价格(price) | ||
厂商(factory) | ||
食品(Food) | V、Product | |
服装(Costume) | V、Product | 尺寸(size) |
边 | 继承自 | 属性 |
---|---|---|
销售(SafeOf) | E | 销售日期(safeDate) |
购买(BuyOf) | E | 购买日期(buyDate) |
服务(ServiceOf) | E | 服务日期(serviceDate) |
2、 模型定义SQL
2.1新建数据库
语法:
CREATE DATABASE <database-url>
[<user> <password> <storage-type> [<db-type>]]
[-restore=<backup-path>]
说明:
-
<database-url>
:连接方式,格式为,:。-
<mode>
:模式,为plocal 或者 remote -
<path>
:数据库在磁盘存储位置
-
-
<user>
:数据库登录用户名 -
<password>
:数据库登录密码 -
<storage-type>
:存储类型,可以是PLOCAL 或者 MEMORY -
<db-type>
:数据库类型,可以是GRAPH 或者 DOCUMENT,默认为GRAPH
举例:
CREATE DATABASE remote:10.250.20.146/saledb root 123456 PLOCAL
特别说明
该命令只能在控制台执行。
新建数据库也可以在orientdb studio登录界面创建,在studio中新建数据库的界面如下图所示。
2.2模型定义
新建Class语法:
CREATE CLASS <class>
[EXTENDS <super-class>]
[CLUSTER <cluster-id>*]
[ABSTRACT]
说明:
-
<class>
:类名,以大写字母、下划线、美元符号开头。 -
<super-class>
:父类 -
<cluster-id>
:你需要在该类使用的存储cluster的id,多个用逗号分隔,cluster可以预先定义然后在这里指定。不指定会自己创建,默认创建的cluster个数为CPU核数。 -
<total-cluster-number>
:显示指定创建的cluster个数 -
ABSTRACT
:是否抽象类,是否抽象类,抽象类不可被直接使用。
新建属性语法:
CREATE PROPERTY <class>.<property> <type>
[<link-type>|<link-class>]
( <property constraint> [, <property-constraint>]* )
[UNSAFE]
说明:
-
<class>
:需要添加属性的类。 -
<property>
:新添加的属性。 -
<type>
:数据类型 -
<link-type>
:数据类型为集合类型时,这个通过这个指明集合元素的基本数据类型。 -
<link-class>
:数据类型为集合类型时,集合元素类型为对象,通过这个指明具体对象。 -
<property-constraint>
:属性约束,限制属性最大、最小、是否空等。 -
UNSAFE
:安全检查,是否检查记录已经存在,如果这个属性只会增加,可以设置为UNSAFE,在大数据集下可以减少不必要的检查时间。
建Class-人(Person)
CREATE CLASS Person ABSTRACT;
CREATE PROPERTY STRING;
CREATE PROPERTY STRING;
CREATE PROPERTY DATE;
建Class-实体-员工(Employee)
CREATE CLASS Employee EXTENDS Person,V;
CREATE PROPERTY Employee.workerNo INTEGER;
建Class-实体-客户(Customer)
CREATE CLASS Customer EXTENDS Person,V;
CREATE PROPERTY Customer.memberNo INTEGER;
建Class-商品(Product)
CREATE CLASS Product ABSTRACT;
CREATE PROPERTY STRING;
CREATE PROPERTY DATE;
CREATE PROPERTY FLOAT;
建Class-实体-食品(Food)
CREATE CLASS Food EXTENDS Product,V;
建Class-实体-服装(Costume)
CREATE CLASS Costume EXTENDS Product,V;
CREATE PROPERTY Costume.size STRING;
建Class-关系-销售(SaleOf)
CREATE CLASS SaleOf EXTENDS E;
CREATE PROPERTY SaleOf.saleDate DATE;
建Class-关系-购买(BuyOf)
CREATE CLASS BuyOf EXTENDS E;
CREATE PROPERTY BuyOf.buyDate DATE;
建Class-关系-服务(ServiceOf)
CREATE CLASS ServiceOf EXTENDS E;
CREATE PROPERTY ServiceOf.serviceDate DATE;
二、 增删改查
1、 顶点
1.1 添加-顶点-员工
方式一:创建顶点方式添加
CREATE VERTEX Employee SET name = '张三',
sex = '男',
birthday='1989-08-05',
workerNo='1001';
CREATE VERTEX Employee CONTENT { "name" : "王五",
"sex" : "男",
"birthday":"1977-10-12",
"workerNo":"1003" }
方式二:SQL insert添加
insert into Employee(name,sex,birthday,workerNo)
values('李四','男','1998-07-01','1002');
1.2 删除-顶点-员工
根据内部ID(@rid)删除
DELETE VERTEX #34:0
更具属性条件删除
DELETE VERTEX Employee WHERE workerNo='1003'
1.3 修改-顶点-员工
UPDATE Employee SET sex = '女' WHERE workerNo='1003'
1.4 查询-顶点-员工
select * from Employee
select * from Employee where sex='男'
2、 边
2.1 添加边
语法:
CREATE EDGE <class> [CLUSTER <cluster>] [UPSERT]
FROM <rid>|(<query>)|[<rid>]*
TO <rid>|(<query>)|[<rid>]*
[SET <field> = <expression>[,]*]|CONTENT {<JSON>}
[RETRY <retry> [WAIT <pauseBetweenRetriesInMs]]
[BATCH <batch-size>]
说明:
-
<class>
:定义的边类,继承制E的类。 -
<cluster>
:指定边存储的cluster -
UPSERT
:覆盖更新,2个顶点已经建立了关系则跳过。边建了唯一索引,如果重复添加相同索引会报错。 -
JSON
:边记录内容。 -
RETRY
:遇到冲突,重试次数。 -
WAIT
:再次重试间隔时间,单位毫秒。 -
BATCH
:每批次处理数据量,默认100。避免顶点过多,内存爆掉的情况。
通过顶点RID构建关系
CREATE EDGE BuyOf FROM #42:0 TO #54:0 SET buyDate = '2018-09-12'
通过查询找到点然后构建关系
CREATE EDGE BuyOf
FROM (SELECT FROM Customer WHERE name = '李敏')
TO (SELECT FROM Food WHERE name = '可乐')
SET buyDate = '2018-08-13'
组网完成后的图如下:
2.2 删除边
语法:
DELETE EDGE
( <rid>
|
[<rid> (, <rid>)*]
|
( [ FROM (<rid> | <select_statement> ) ] [ TO ( <rid> | <select_statement> ) ] )
|
[<class>]
(
[WHERE <conditions>]
[LIMIT <MaxRecords>]
[BATCH <batch-size>]
说明:
-
FROM
:需要删除边的起始顶点。 -
TO
:需要删除边的结束顶点。 -
WHERE
:过滤条件 -
LIMIT
:删除的边的最大数量。 -
BATCH
:每一小批次处理数据量,默认100.
根据RID删除
DELETE EDGE #65:0
通过RID批量删除
DELETE EDGE [#22:38482,#23:232,#33:2332]
通过过滤条件删除2点间的边
DELETE EDGE FROM #11:101 TO #11:117 WHERE date >= "2012-01-15"
2.3 修改边
语法:
UPDATE EDGE <edge>
[SET|INCREMENT|ADD|REMOVE|PUT <field-name> = <field-value>[,]*]|[CONTENT|MERGE <JSON>]
[RETURN <returning> [<returning-expression>]]
[WHERE <conditions>]
[LOCK default|record]
[LIMIT <max-records>] [TIMEOUT <timeout>]
说明:
-
<edge>
:需要修改的边,可以是下面几种类型。-
Class
:根据class更新 -
Cluster
:根据cluster更新,使用CLUSTER前缀。 -
Record ID
:根据记录ID更新
-
-
SET
:需要更新的属性值。 -
REMOVE
:从属性集合中移除的元素。 -
RETURN
:更新处理完成后返回的内容,有下面几种选择。-
COUNT
:影响的记录数 -
BEFORE
:返回修改前的值 -
AFTER
:返回修改后的值 -
DEFAULT
:不锁,同步更新。事物冲突的时候会抛出异常。
-
-
WHERE
:过滤条件 -
LOCK
:数据加载和更新时使用的锁类型,有下面2中类型。-
DEFAULT
:不锁,同步更新。事物冲突的时候会抛出异常。 -
RECORD
:更新的时候锁定记录。
-
-
LIMIT
:更新的最大记录数。
修改边#59:0的出端顶点为#36:0
UPDATE EDGE #59:0 SET out= #36:0
修改边属性
UPDATE EDGE #59:0 SET buyDate= '2012-03-11'
3、 图查询
找到销售员王五2018-08-08这天服务的客户都买了哪些商品。
MATCH {class:Employee,as:employee,where:(name="王五")}.
outE("ServiceOf"){as:se,where:(serviceDate='2018-08-08')}.
inV(){as:cust}.
out("BuyOf"){as:product}
return product